multi_query
执行一个 SQL 或者 多个使用分号分隔的 SQL 语句。
要获得执行结果中的第一个结果集,请使用 mysqli_use_result() 或 mysqli_store_result() 函数。
要读取后续的结果集, 请使用 mysqli_more_results() 和 mysqli_next_result() 函数。
如果第一个 SQL 语句就失败了,返回 FALSE。 如果是批量执行 SQL 语句, 必须首先调用 mysqli_next_result() 函数,才可以获取后续语句的错误信息。
如果第一个SQL语句成功了,返回TRUE,但并不意味着后续SQL在执行过程中没有出错
参考:http://php.net/manual/zh/mysqli.multi-query.php
问题
使用mysqli_multi_query,遇到2个问题:
1、多条sql语句(alter语句),只有第1条操作数据库成功了,剩下几条对数据库的操作都没有成功。
2、循环向多个表中插入sql,第一个表执行完成后,执行第二个表时,会报Commands out of sync; you can’t run this command now。
原因
这2个问题都是因为结果集没有释放导致的。
错误提示表明,消息执行顺序有问题,multi->query执行完成后除了返回实际结果集外,还返回了存储过程执行的状态。在执行第2个sql语句前,需要将所有的结果集释放掉。
如果释放结果集后,还是会出现问题1,建议用mysqli_error($con) 打印下sql执行的错误日志,看看是否因为sql执行时有错误导致没有更新db成功
修复代码
for($i = 1; $i < 100; $i++) {
$sql .= sql1;
$sql .= sql2;
…………
if ($con->multi_query($sql)) {
do {
echo "===111===开始批量处理===\n";
/* store first result set */
if ($result = $con->store_result()) {
while ($row = $result->fetch_row()) {
print_r("===do nothing===" . $row);
}
$result->free();
// $result->close();
}
} while($con->more_results() && $con->next_result());
echo "===222===上一条sql执行的错误是===" . mysqli_error($con) . "\n"; //如果后续sql没有执行成功,看上是否是因为上一条语句执行出错了
// while ($con->more_results() && $con->next_result()){
// }
} else {
echo "Error: " . $sql . "\n" . $con->error;
}
}