Я использую Zend Framework 1.7.2, MySQL и адаптер MySQLi PDO. Я хотел бы назвать несколько хранимых процедур во время данного действия. Я обнаружил, что в Windows возникает проблема с вызовом нескольких хранимых процедур. Если вы попробуете, вы получите следующее сообщение об ошибке:
SQLSTATE [HY000]: Общая ошибка: 2014 Невозможно выполнить запросы, в то время как другие небуферизованные запросы активны. Рассмотрим использование PDOStatement :: fetchAll (). Кроме того, если ваш код будет работать только с mysql, вы можете включить буферизацию запросов, установив атрибут PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY.
Я обнаружил, что для решения этой проблемы я мог бы просто закрыть соединение с базой данных после каждого вызова хранимой процедуры:
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { //If on windows close the connection $db->closeConnection(); }
Это хорошо сработало для меня, однако теперь я хочу вызвать несколько хранимых процедур, заключенных в транзакцию. Конечно, закрытие соединения не является вариантом в этой ситуации, поскольку оно вызывает откат открытой транзакции. Любые идеи, как решить эту проблему и / или решить проблему.
У меня такие же ошибки, когда вызываемые запросы вроде этого (переменные для использования в следующем запросе)
$db->query("SET @curr = 0.0;");
Чтобы исправить это, я изменил свой файл конфигурации на
'database' => array( 'adapter' => 'mysqli',
Этот шаблон подготовки, выполнения и последующего закрытия каждого оператора $ sql, который вызывает хранимую процедуру, работает.
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)); }