Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Zend框架调用多个存储过程_Php_Mysql_Zend Framework_Stored Procedures - Fatal编程技术网

Php 使用Zend框架调用多个存储过程

Php 使用Zend框架调用多个存储过程,php,mysql,zend-framework,stored-procedures,Php,Mysql,Zend Framework,Stored Procedures,我正在使用Zend Framework 1.7.2、MySQL和MySQLi PDO适配器。我希望在给定操作期间调用多个存储过程。我发现在Windows上调用多个存储过程时出现问题。如果您尝试此操作,会收到以下错误消息: SQLSTATE[HY000]:一般错误:2014 无法执行其他查询 未缓冲查询处于活动状态。 考虑使用 PDO语句::fetchAll()。 或者,如果您的代码仅为 你有没有想过要和mysql竞争 可以通过设置来启用查询缓冲 PDO::MYSQL\u ATTR\u使用缓冲的\

我正在使用Zend Framework 1.7.2、MySQL和MySQLi PDO适配器。我希望在给定操作期间调用多个存储过程。我发现在Windows上调用多个存储过程时出现问题。如果您尝试此操作,会收到以下错误消息:

SQLSTATE[HY000]:一般错误:2014 无法执行其他查询 未缓冲查询处于活动状态。 考虑使用 PDO语句::fetchAll()。 或者,如果您的代码仅为 你有没有想过要和mysql竞争 可以通过设置来启用查询缓冲 PDO::MYSQL\u ATTR\u使用缓冲的\u查询 属性

我发现要解决这个问题,我可以在每次调用存储过程后关闭与数据库的连接:

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
  //If on windows close the connection
  $db->closeConnection();
}
这对我来说很好,但是,现在我想调用封装在一个事务中的多个存储过程。当然,在这种情况下,关闭连接不是一个选项,因为它会导致打开的事务回滚。任何想法,如何解决此问题和/或解决此问题


在调用类似这样的查询时,我会出现相同的错误(在下一次查询中使用的变量)

为了解决这个问题,我将配置文件改为

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

当调用这样的查询时,我也有相同的错误(在下一个查询中使用的变量)

为了解决这个问题,我将配置文件改为

'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));
}

这种准备、执行然后关闭调用存储过程的每个$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();

您可以使用prepare语句。不需要换司机

$sql = "CALL procedure()";
$stmt = $this->db->createStatement();
$stmt->prepare($sql);
$result = $stmt->execute();

非常感谢,我已经用了6个多月的丑陋的变通方法。我刚刚接受了在没有存储过程的情况下进行复杂的删除,然而,我现在又回到了工作岗位。再次感谢。非常感谢,我已经用了6个多月的丑陋的变通方法。我刚刚接受了在没有存储过程的情况下进行复杂的删除,然而,我现在又回到了工作岗位。再次感谢。