【问题标题】:how to execute multiple statements in loop如何在循环中执行多个语句
【发布时间】:2014-05-12 13:41:48
【问题描述】:

你好,我有几个查询要执行,都返回独立的结果集:

select * from table;
call procedureA(par1);
call procedureB(par2);

我想在循环中执行它们以执行其他操作:

$queries = array("select * from table;", "call procedureA(par1);", "call procedureB(par2);");
foreach($queries as $query) {
  $res=$db->query($query);
  // do something here with the query result
  someFunction($res);
}

第一条语句运行良好;在第二次迭代中,它不再声明 $res 是一个非对象:

Call to a member function ... on a non-object

除了使用mysqli_multi_query(),我还可以通过什么方式循环执行多个查询?

更新我从代码示例中删除了 $res->close();,因为它对问题具有误导性和影响力。

更新 2 - 解决方案 为了任何人的利益,这是一个完整的工作代码:

$queries = array(
            "CALL procedureA(par1)"
            ,"CALL procedureB()"
            , "Select * from tableC"
            );

// Open connection
$db = new mysqli(
  $config['host']
  ,$config['user']
  ,$config['pwd']
  ,$config['dbname']
  ); 

foreach($queries as $query) {
  if ($res instanceof mysqli_result) {
      $res->free();
    }
  $res=$db->query($query);
  // do something with the query
  echo getHtmlTable($res);

  // free current result
  $res->free();

  // free subsequent resultset (es. the one with OK/ERR sp call status)
  while ($db->next_result()) {
    //free each result.
    $res = $db->use_result();
    if ($res instanceof mysqli_result) {
      $res->free();
    }
  }
}

【问题讨论】:

  • $r 是从哪里来的?
  • 您应该在整个循环中保持流打开,或者在每次迭代时打开并关闭它。取决于您想要使用 mysql 进行的事务处理类型。由于它没有看到打开的流,是的,它会停止
  • 什么是$r?如果$r 是您正在关闭的 mysql 服务器的句柄并且它不再可用
  • $r 是结果集。即使省略 ->close() 也会出错。

标签: php mysql loops mysqli


【解决方案1】:

在循环中运行查询并没有什么特别之处。

无论是一个接一个地编写两个查询,还是循环运行它们,都没有区别。因此,一般而言,循环运行的几个查询与我们所有脚本中按顺序运行的几个查询没有什么不同。

唯一可能的问题是查询本身。比如说,存储过程调用总是返回至少两个结果集。在检索到所有结果集之前,不能运行其他查询。

因此,作为一种快速而简单的解决方案,可以添加这样的一行

while ($db->next_result()) {}

在循环的底部清理所有可能在查询执行后保留在队列中的结果集。

打开mysqli的错误报告也非常方便,让你知道发生的所有mysql错误。有了这个,您就会在您的问题中添加这样的错误消息(即“命令不同步”)。为此,请在 mysqli connect 之前添加此行:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

【讨论】:

  • 查询没问题,但是返回结果集的存储过程需要按照您指定的方式处理。谢谢
【解决方案2】:
$r->close();

应该是

 $res->close();

您正在引用一个不存在的对象 ($r)。

多个查询的执行取决于服务器配置。但除此之外。这会更好地使用事务(当然取决于那些存储过程的效果)

【讨论】:

    猜你喜欢
    • 2016-09-02
    • 2019-05-06
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2015-03-20
    • 1970-01-01
    相关资源
    最近更新 更多