我正在使用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));
}
您可以使用prepare语句。无需更换驱动程序
$sql = "CALL procedure()";
$stmt = $this->db->createStatement();
$stmt->prepare($sql);
$result = $stmt->execute();