【问题标题】:Wait for mysqli::multi_query to finish before executing next statement在执行下一条语句之前等待 mysqli::multi_query 完成
【发布时间】:2014-10-13 19:35:18
【问题描述】:

我有一些代码使用Mysqli::multi_query 从平面.sql 文件中删除和重建开发数据库。重建 mysqli 连接后关闭,然后代码使用PDO 重新连接到该数据库以对其运行查询。

/* Drop and Rebuild DB using mysqli::multi_query */
$mysqli = new mysqli($host, $user, $pass, $db);
if ($mysqli->connect_errno) {
    die('Failed to connect to MySQL: (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}

$query = file_get_contents("DROPandREBUILD.sql");

if (!$mysqli->multi_query($query))
    die("Failed to refresh db: $this->target_db");

$mysqli->close();

/* Execute queries against rebuilt database using PDO */
try {
    $sth = new PDO("mysql:host=$host;dbname=$db", $user, $ass);
    $test1 = $sth->query("SELECT * FROM tbl");
    var_dump($sth->errorInfo());
    $test2 = $sth->query("SHOW COLUMNS FROM tbl");
    var_dump($sth->errorInfo());
}
catch(PDOException $e) {
    die($e->getMessage());
}

第一个var_dump ($test1) 的输出:

array(3) {
  [0]=>string(5) "00000"
  [1]=>NULL
  [2]=>NULL
}
object(PDOStatement)#3 (1) {
  ["queryString"]=>string(31) "SELECT * FROM tbl"
}

第二个 var_dump ($test2) 的输出:

array(3) {
   [0]=>string(5) "42S02"
   [1]=>int(1146)
   [2]=>string(45) "Table 'db.tbl' doesn't exist"
}
bool(false)

为什么来自$test2 的查询会失败?如果我删除 mysqli 代码块,那么一切都会完美运行。两个查询都针对同一个 tbl 在同一个 db 中运行。是否发生了异步的事情,如果是这样,我如何强制我的脚本在实例化PDO 之前等待mysqli::multi_query 完成执行?

【问题讨论】:

  • @KevinLabécot - 如果我更改它,我会得到与 $test1->errorInfo() 相同的结果。 $test2->errorInfo() 产生 Call to a member function errorInfo() on a non-object

标签: php mysql sql pdo mysqli


【解决方案1】:

我不知道这一点,但我假设当您运行$mysqli->close(); 时连接实际上并未关闭,因为仍有X 结果集未处理或已释放。

你可以试试这个,看看它是否能解决问题:-

$query = file_get_contents("DROPandREBUILD.sql");

if ($mysqli->multi_query($query)) {
    do {
        if ($result = $mysqli->store_result()) {
            $result->free();
        }

    } while ($mysqli->more_results() && $mysqli->next_result());
}
$mysqli->close();

如果您愿意,还可以添加一些代码来实际检查多个查询中的每一个的结果。

【讨论】:

  • 你是绝对的救星!谢谢!您的脚本存在一个问题,导致发出严格的标准通知。您能否编辑您的答案以将 while 语句更改为 while($mysqli->more_results()); 并将 mysqli->next_result() 移动到 do 块的顶部 - 一旦您这样做,我会将其标记为正确答案。
  • Adam,不确定您的建议是否对我有用,因为我相信第一个结果已经可以处理,您只需要 next_result() 即可收集结果 2,3 等。我已更改代码以使用 more_results() 作为while 语句的一部分。出于兴趣,STRICT 消息是什么。
  • 严格的消息是:Strict Standards: mysqli::next_result() [mysqli.next-result]: There is no next result set. Please, call mysqli_more_results()/mysqli::more_results() to check whether to call this function/method
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 2021-07-30
  • 1970-01-01
相关资源
最近更新 更多