今天在做分批量存库的时候用如下类似语句:
$sql1 = "update `table` set ...; update `table` set xxx;...;";
$sql2 = "update `table` set ...; update `table` set xxx;...;";
mysqli_multi_query($link, $sql1);
mysqli_multi_query($link, $sql2);
发现只有 sql1
的语句被执行了, 后面的没被执行. 想想以前做 java
批量更新的时候类似这样的语句执行的很happy 啊,为什么轮到 php
的时候就这鸟样了, 最开始还以为是自己的 sql
语句写的有问题,但是拿到 mysql
的客户端一执行, 没问题. 然后就猜到应该是 mysqli_multi_query
这个函数的问题了.
google 了一把, 有个文章里提到了参考官方手册. 对啊, 有问题可以看看官方文档怎么说的. 好了, 找到官方手册后, 发现问题中被置顶的注意事项就是这个:
WATCH OUT: if you mix $mysqli->multi_query and $mysqli->query, the latter(s) won't be executed!
<?php
// BAD CODE:
$mysqli->multi_query(" Many SQL queries ; "); // OK
$mysqli->query(" SQL statement #1 ; ") // not executed!
$mysqli->query(" SQL statement #2 ; ") // not executed!
$mysqli->query(" SQL statement #3 ; ") // not executed!
$mysqli->query(" SQL statement #4 ; ") // not executed!
?>
//The only way to do this correctly is:
<?php
// WORKING CODE:
$mysqli->multi_query(" Many SQL queries ; "); // OK
while ($mysqli->next_result()) {;} // flush multi_queries
$mysqli->query(" SQL statement #1 ; ") // now executed!
$mysqli->query(" SQL statement #2 ; ") // now executed!
$mysqli->query(" SQL statement #3 ; ") // now executed!
$mysqli->query(" SQL statement #4 ; ") // now executed!
?>
好了,问题找到了.修改代码:
if(mysqli_multi_query($link, $sqls)){
while(mysqli_next_result($link)){
if($result = mysqli_store_result($link)){
mysqli_free_result($result); //释放内存
}
}
}
这样做了以后就可以正常执行了.