admin

如何连续执行多个程序?

sql

这是我的代码:

$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-> prepare(’CALL user_top_t。 。’)#1 C:\ xampp \ htdocs \
myweb \ application \ other.php(24):用户->索引()#2 C:\ xampp \ htdocs \ myweb \
index.php(152):require_once(’ C:\ xampp \ htdocs …’)#3 {main}在第71行的C:\
xampp \ htdocs \ myweb \ others \ user.php中

此外,我用过closeCursor()之后fetchAll(),基于该解决方案。但是可悲的是它引发了一个新的错误:

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

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

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

知道如何解决该问题吗?


注意1: 上面的每个查询都是单独工作的。我的意思是,当我调用单个过程时,它也可以正常工作。

注2: 每个过程都返回一个结果集。我的意思是SELECT这些程序中有一个陈述。


阅读 212

收藏
2021-06-07

共1个答案

admin

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

您必须继续调用,nextRowset()直到它返回错误的结果为止,这表明所有结果均已从该语句返回。

2021-06-07