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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博文

mysql导出select结果到文件

mysql -hxx -uxx -pxx -e "query statement" db > file  例如:  mysql -h127.0.0.1 -uro...

40140
来自专栏杨建荣的学习笔记

外部表简单总结(r3笔记第51天)

对于外部表的使用而言,可能是既陌生又熟悉的感觉,说陌生可能自己真正的使用机会要少一些,而熟悉可能是大家比较常用的通过外部表来查看数据库日志,其实外部表还有更丰富...

290110
来自专栏搜云库

Mycat 读写分离 数据库分库分表 中间件 安装部署,及简单使用

MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可...

57080
来自专栏Java面试笔试题

Statement和PreparedStatement有什么区别?哪个性能更好?

与Statement相比,①PreparedStatement接口代表预编译的语句,它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性(减少SQL注射...

51220
来自专栏不想当开发的产品不是好测试

linux 添加用户到sudo中

步骤 1. 先切到root用户 2. 执行visudo,其实就是修改/etc/sudoers 3. 添加用户,规则如下: youuser ...

196100
来自专栏王硕

原 PostgreSQL基于时间点恢复(PITR)实验记录

42290
来自专栏杂烩

canal安装

在mysql中 配置canal数据库管理用户,配置相应权限(repication权限)

18720
来自专栏大白虾谈架构

mysql 远程连接数据库的二种方法

6.9K30
来自专栏深度学习之tensorflow实战篇

hive模糊搜索表

1.hive模糊搜索表 show tables like '*name*'; 2.查看表结构信息 desc formatted table_name; des...

63590
来自专栏pangguoming

MyBatis两张表字段名相同产生的问题

MyBatis两张表字段名相同, 会导致bean属性都映射为第一个表的列, 解决方法: 通过设置别名的方式让其产生区别,如 <select id="queryB...

50970

扫码关注云+社区

领取腾讯云代金券