如何连续执行多个程序?

时间:2017-08-20 14:00:03

标签: php mysql sql pdo

这是我的代码:

$query = "CALL user_top_categories_score(?, 'ALL', 0, 1)";
$sth = $this->dbh->prepare($query);
$sth->execute([$user_id]);
$category = $sth->fetchAll(PDO::FETCH_ASSOC);

$query = "CALL user_top_tags_score(?, 'ALL', 0, 3)";
$sth = $this->dbh->prepare($query);
$sth->execute([$user_id]);
$tags = $sth->fetchAll(PDO::FETCH_ASSOC);

它抛出了这个错误:

  

致命错误:未捕获PDOException:SQLSTATE [HY000]:常规错误:2014在其他未缓冲的查询处于活动状态时无法执行查询。考虑使用PDOStatement :: fetchAll()。或者,如果您的代码只是针对mysql运行,则可以通过设置PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY属性来启用查询缓冲。在C:\ xampp \ htdocs \ myweb \ others \ user.php:71堆栈跟踪:#0 C:\ xampp \ htdocs \ myweb \ others \ user.php(71):PDO-&gt;准备(&#39; CALL user_top_t ...&#39;)#1 C:\ xampp \ htdocs \ myweb \ application \ other.php(24):user-&gt; index()#2 C:\ xampp \ htdocs \ myweb \ index。 php(152):require_once(&#39; C:\ xampp \ htdocs ...&#39;)#3 {main}在第71行的C:\ xampp \ htdocs \ myweb \ others \ user.php中抛出< / p>

我也在closeCursor()之后使用fetchAll(),基于this solution。但遗憾的是它引发了一个新的错误:

  

警告:数据包乱序。预期1收到9.数据包大小= 7在C:\ xampp \ htdocs \ myweb \ others \ user.php第72行

     

警告:PDO :: prepare():MySQL服务器在第72行的C:\ xampp \ htdocs \ myweb \ others \ user.php消失了

     

致命错误:未捕获PDOException:SQLSTATE [HY000]:常规错误:2006 MySQL服务器在C:\ xampp \ htdocs \ myweb \ others \ user.php中消失:72堆栈跟踪:#0 C:\ xampp \ htdocs \ myweb \ others \ user.php(72):PDO-&gt; prepare(&#39; CALL user_top_t ...&#39;)#1 C:\ xampp \ htdocs \ myweb \ application \ other.php( 24):user-&gt; index()#2 C:\ xampp \ htdocs \ myweb \ index.php(152):require_once(&#39; C:\ xampp \ htdocs ...&#39;)#3在第72行的C:\ xampp \ htdocs \ myweb \ others \ user.php中抛出{main}

知道如何解决问题?

注意1:上述每个查询都单独工作。我的意思是,当我打电话给一个程序时,它也能正常工作。

Noted2:每个过程都返回一个结果集。我的意思是这些程序中有一个SELECT语句。

1 个答案:

答案 0 :(得分:2)

您的程序中可能只有一个SELECT,但API并不知道。它必须假设您可能从您的过程返回多个结果集,因此仅fetchAll()不会关闭游标。

您必须继续调用nextRowset(),直到它返回错误结果,表明所有结果都已从此语句返回。

另见我对How can I use a stored procedure in a MySql database with Zend Framework?的回答(我在2009年回答了这个问题!)。