当前位置: 首页 > 知识库问答 >
问题:

如何连续执行多个过程?

黄高爽
2023-03-14

这是我的代码:

$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);

它抛出以下错误:

致命错误:未捕获的PDOExc0019: SQLSTATE[HY000]:常规错误: 2014当其他未缓冲的查询处于活动状态时,无法执行查询。考虑使用PDO语句::fetchAll()。或者,如果您的代码只针对mysql运行,您可以通过设置PDO::MYSQL_ATTR_USE_BUFFERED_QUERY属性来启用查询缓冲。--plhd--3/>(71): PDO-

此外,我还在基于此解决方案finchAll()之后使用了CloseCouror()。但可悲的是,它抛出了一个新的错误:

警告:数据包乱序。预期1收到9。数据包大小=7 in C:\xampp\htdocs\myweb\其他\user.phpon line 72

警告:PDO::准备():MySQL服务器已经消失在C:\xampp\htdocs\myweb\其他人\user.php行72

致命错误:未捕获PDOException:SQLSTATE[HY000]:一般错误:2006年MySQL服务器在C:\xampp\htdocs\myweb\others\user.php:72堆栈跟踪:#0 C:\xampp\htdocs\myweb\others\user.php(72):PDO中消失-

知道怎么解决这个问题吗?

注意:上面的每个查询都是单独工作的。我是说,当我调用一个程序时,它也能工作。

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

共有2个答案

骆鸿运
2023-03-14

嗯,在存储过程的情况下,$结果对象更复杂。在应用MVC的情况下,多个源可以加载多个调用语句,并且游标从第一个$结果可以在数组的最后一个元素的旁边(在这种情况下,结果没有更多的元素,以其他方式,被设置为假)。对我来说,工作清楚了所有存储的结果。

function clearStoredResults($mysqli_link){ #------------------------------------
  while($mysqli_link->next_result()){ if($l_result = $mysqli_link->store_result()){ $l_result->free(); } } }
function execQuery($sql){
    global $conexion;
    try {    
      $result=$conexion->query($sql);
      while($row = $result->fetch_assoc()){
        $new_array[] = $row; // Inside while loop
      }
    return $new_array; 
    } catch (Exception $e) {
       echo $e->getMessage();
    }
    finally {
       clearStoredResults($conexion);
   }
 }

我建议谨慎地探索。您可以使用mysql或mariabd和php等管理工具来探索其效果。

景嘉志
2023-03-14

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

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

另请参见我对如何使用Zend框架在MySql数据库中使用存储过程的回答?(我在2009年回答了这个问题!)。

 类似资料:
  • 我有一个带有静态ConcurrentQueue的类。一个类接收消息并将其放入队列中,而这个类上的另一个线程从该队列中读取消息并一次处理一个。使用cancellationtoken中止该方法。 清空队列的方法如下所示: 我的测试方法如下: 因此,我在自己的线程中启动我的出列方法,并使用一个新的取消令牌。然后我将一些消息排队,给进程一秒钟时间来处理它们,然后使用源代码。Cancel(false)结束线

  • 问题内容: 我必须为数组中每个项目的某些异步任务打电话给Promise,但我想串行执行这些任务。 Promise.all仅在具有合并了诺言列表但不按顺序调用它们的新诺言时才有用。 我如何在没有第三方库(例如Q,bluebird …)的情况下使用标准的Promise API来实现此目标。 问题答案: 您将诺言与返回另一个诺言的回调一起使用。因此,假设您有三个函数a,b和c都返回了诺言。您可以像这样链

  • 我正在进行密码检查。其中一个功能是查找输入的密码是否连续重复。我还没有代码,因为我不知道怎么做。 我发现这个正则表达式匹配两个或多个非连续的相同字符,但它只匹配重复的逗号。 以下是场景: 5236aaa121-重复模式,因为a连续重复3次 2312aa32aa-无重复字符 111111 ASD-重复模式,因为连续重复多次

  • 我正在为Java的一个聊天应用程序做一个服务器。 while循环应该连接到新的客户端,但代码仍然重复连接到第一个客户端,甚至在它连接之后也是如此,从而导致绑定失败错误。我该换什么?

  • 本文向大家介绍Linux 连续执行多条命令的方法(推荐),包括了Linux 连续执行多条命令的方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 每条命令使用";"隔开,则无论前边的命令执行成功与否都会继续执行下一条命令 这里,故意将第二条命令中的echo多写了一个o,命令执行出错,但并不影响后续命令的执行 可以这么想,如果用分号来间隔命令,就相当于将命令分隔在了不同的行,无论前一行的命令成功或

  • 我想做这样的事情,我可以在以下代码中运行多个命令: 我如何执行多个命令? 谢了。