我有一些代码使用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
完成执行?
答案 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();
如果您愿意,还可以添加一些实际检查每个查询结果的代码。