文档章节

PHP mysqli_multi_query 连续执行的坑

zcqshine
 zcqshine
发布于 2015/12/24 19:10
字数 395
阅读 31
收藏 0

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

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

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

© 著作权归作者所有

共有 人打赏支持
上一篇: PHP 下载文件
zcqshine
粉丝 6
博文 41
码字总数 13530
作品 0
深圳
高级程序员
私信 提问
LAMP原理架构解析(二):Php操作Mysql数据库

Php操作Mysql数据库 目录 1.PHP脚本操作数据库6步骤 2.PHP连接mysql 3.PHP对数据库增删改查 4.PHP常用其他函数 5.php连接mysql(i) 5.1 建立和断开连接 5.2 处理连接错误 5.3 与数据库交互 一...

心的哲学
2017/10/18
0
0
PHP+MySQL缓冲查询和无缓冲查询

http://php.net/manual/zh/mysqlinfo.concepts.buffering.php http://php.net/manual/zh/mysqli.query.php PHP MySQL查询(mysqli,pdo_mysql)默认使用缓冲模式. 也就是说查询结果将一次性从M......

eechen
2015/12/30
1K
1
swoole项目思维转换 -- mysql server gone away

mysql做为php的黄金搭档和互联网上应用最广泛的数据库,免不了天天与之打交道,不少朋友在熟悉swoole的使用之后,也趟平了不少坑,准备实战了,终于上线了,正愉快的体验swoole带来的巨大改进...

杨太化
2015/10/15
182
0
php---设置 php 的 mysqli 扩展的缺省编码

最近写一个小程序,用 PHP 的 mysqli 扩展连数据库的时候写入 mysql 数据库里面的内容中文字符始终是乱码。最终,发现我的 mysqli 缺省编码是 latin1 。 获取当前编码 $charset = $mysqli->...

durban
2012/03/21
0
0
MySQL DELETE 语句

MySQL DELETE 语句 你可以使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录。 你可以在 mysql> 命令提示符或 PHP 脚本中执行该命令。 语法 以下是 SQL DELETE 语句从 MySQL 数据表中...

李伟铭k
07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

apache顶级项目(二) - B~C

apache顶级项目(二) - B~C https://www.apache.org/ Bahir Apache Bahir provides extensions to multiple distributed analytic platforms, extending their reach with a diversity of s......

晨猫
58分钟前
1
0
day152-2018-11-19-英语流利阅读

“超级食物”竟然是营销噱头? Daniel 2018-11-19 1.今日导读 近几年来,超级食物 superfoods 开始逐渐走红。不难发现,越来越多的轻食餐厅也在不断推出以超级食物为主打食材的健康料理,像是...

飞鱼说编程
今天
3
0
SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
3
0
Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
昨天
5
0
RxJava threading

因为Rx针对异步系统设计,并且Rx也自然支持多线程,所以新的Rx开发人员有时会假设Rx默认是多线程的。在其他任何事情之前,重要的是澄清Rx默认是单线程的。 除非另有说明,否则每次调用onNex...

woshixin
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部