一尘不染

如何确保从MySQLi :: multi_query捕获了所有错误?

mysql

对文档multi_query说:

如果第一条语句失败,则返回FALSE。要从其他语句检索后续错误,必须首先调用mysqli_next_result()。

对文档next_result说:

成功返回TRUE,失败返回FALSE。

最后,文档中发布的示例multi_query使用返回值from next_result来确定何时不再有查询。例如停止循环:

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query  = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";

    /* execute multi query */
    if ($mysqli->multi_query($query)) {
        do {
            /* store first result set */
            if ($result = $mysqli->store_result()) {
                while ($row = $result->fetch_row()) {
                    printf("%s\n", $row[0]);
                }
                $result->free();
            }
            /* print divider */
            if ($mysqli->more_results()) {
                printf("-----------------\n");
            }
        } while ($mysqli->next_result()); // <-- HERE!
    }

    /* close connection */
    $mysqli->close();
    ?>

我不知道提供的查询数量,也不知道将要执行的SQL。因此,我不能仅将查询数量与返回结果数量进行比较。但是,如果第三个查询是损坏的查询,那么我想向用户显示错误消息。但是我似乎没有办法判断是否next_result失败是因为没有更多的查询要执行,还是因为SQL语法错误。

如何检查所有查询中的错误?


阅读 287

收藏
2020-05-17

共1个答案

一尘不染

尽管有文档中的代码示例,但更好的方法可能是这样的:

if ($mysqli->multi_query(...)) {
  do {
    // fetch results

    if (!$mysqli->more_results()) {
      break;
    }
    if (!$mysqli->next_result()) {
      // report error
      break;
    }
  } while (true);
}
2020-05-17