PHP mysqli_multi_query 连续执行的坑
博客专区 > zcqshine 的博客 > 博客详情
PHP mysqli_multi_query 连续执行的坑
zcqshine 发表于2年前
PHP mysqli_multi_query 连续执行的坑
  • 发表于 2年前
  • 阅读 20
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: PHP mysqli_multi_query 连续执行如果不释放之前的执行结果会导致后续的mysql_multi_query命令无法执行.

今天在做分批量存库的时候用如下类似语句:

$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); //释放内存
        }
    }
}

这样做了以后就可以正常执行了.

共有 人打赏支持
粉丝 4
博文 35
码字总数 12182
×
zcqshine
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: