Zend Framework ile Çoklu saklı yordamlar Çağrı

2 Cevap php

Ben Zend Framework 1.7.2, MySQL ve MySQLi PDO adaptörü kullanıyorum. Ben belirli bir eylem sırasında birden saklanan prosedürleri aramak istiyorum. Windows üzerinde birden çok saklı yordamları çağıran bir sorun olduğunu tespit ettik. Eğer denerseniz, aşağıdaki hata iletisini alabilirsiniz:

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

Ben sadece bir saklı yordam için her görüşmeden sonra veritabanı bağlantısını kapatmak olabilir, bu soruna geçici bir çözüm bulundu:

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
  //If on windows close the connection
  $db->closeConnection();
}

Bu benim için iyi çalıştı, ancak, şimdi bir işlem sarılmış birden çok saklı yordamları çağırmak istiyorum. Bu açık işlemin geri neden olur beri Tabii ki, bağlantıyı kapatmadan, bu durumda bir seçenek değildir. Soruna bu sorunu ve / veya işi nasıl düzeltebilirim Herhangi bir fikir.

2 Cevap

Böyle sorguları (değişkenler sonraki sorgusunda kullanmak için) denilen zaman aynı hatalar var

$db->query("SET @curr = 0.0;");

Bunu düzeltmek için benim config dosyasını değiştirildi ettik

'database' => array(
        'adapter' => 'mysqli',

Bir saklı yordam çağrıları her $ sql deyimi, hazırlamak, yürütmek ve sonra kapanış bu model çalışır.

public function processTeams($leagueid,$raceid,$gender)
{
    $db = Zend_Db_Table::getDefaultAdapter();
    $sql = $db->prepare(sprintf("CALL addScoringTeams(%d,%d,'%s')",$leagueid,$raceid,$gender));
    $sql->execute();
    $sql->closeCursor();
    $this->logger->info(sprintf("CALL addScoringTeams(%d,%d,'%s')",$leagueid,$raceid,$gender));

    $sql1 = $db->prepare(sprintf("CALL updateScoringTeamTotals(%d)",$raceid));
    $sql1->execute();
    $sql1->closeCursor();
    $this->logger->info(sprintf("CALL updateScoringTeamTotals(%d)",$raceid));

    $sql2 = $db->prepare(sprintf("CALL updateScoringTeamClasses(%d,'%s')",$raceid,$gender));
    $sql2->execute();
    $sql2->closeCursor();
    $this->logger->info(sprintf("CALL updateScoringTeamClasses(%d,'%s')",$raceid,$gender));
}