这是我的代码:
$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
语句。
答案 0 :(得分:2)
您的程序中可能只有一个SELECT,但API并不知道。它必须假设您可能从您的过程返回多个结果集,因此仅fetchAll()不会关闭游标。
您必须继续调用nextRowset()
,直到它返回错误结果,表明所有结果都已从此语句返回。
另见我对How can I use a stored procedure in a MySql database with Zend Framework?的回答(我在2009年回答了这个问题!)。