在执行下一个语句之前等待mysqli :: multi_query完成

时间:2014-08-20 12:32:00

标签: php mysql sql pdo mysqli

我有一些代码使用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运行。是否存在异步的事情,如果是这样的话,如何在实例化mysqli::multi_query之前强制我的脚本等待PDO完成执行?

1 个答案:

答案 0 :(得分:4)

我不知道这个事实,但我假设在运行$mysqli->close();时实际上并未关闭连接,因为X结果集仍未处理或免费' d。

您可以尝试这样做以查看是否可以解决问题: -

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

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