文档章节

PHP mysqli_multi_query 连续执行的坑

zcqshine
 zcqshine
发布于 2015/12/24 19:10
字数 395
阅读 36
收藏 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
粉丝 7
博文 42
码字总数 14192
作品 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
swoole项目思维转换 -- mysql server gone away

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

杨太化
2015/10/15
182
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
php---设置 php 的 mysqli 扩展的缺省编码

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

durban
2012/03/21
0
0
php中mysql数据库异步查询实现

通常一个web应用的性能瓶颈在数据库。因为,通常情况下php中mysql查询是串行的。也就是说,如果指定两条sql语句时,第二条sql语句会等到第一条sql语句执行完毕再去执行。这个时候,如果执行2...

snowing1990
2016/03/14
22
0

没有更多内容

加载失败,请刷新页面

加载更多

Spark in action on Kubernetes - Playground搭建与架构浅析

前言 Spark是非常流行的大数据处理引擎,数据科学家们使用Spark以及相关生态的大数据套件完成了大量又丰富场景的数据分析与挖掘。Spark目前已经逐渐成为了业界在数据处理领域的行业标准。但是...

阿里云官方博客
13分钟前
1
0
小白大数据学习路线

学习大数据首先了解大数据技术得板块划分: 数据计算(离线计算):Hadoop、spark 数据计算(实时计算):storm、spartstreaming、flink 其他框架:zookeeper 数据采集:flume、Kafka 数据存...

董黎明
25分钟前
0
0
mariadb 内存占用优化

本文由云+社区发表 作者:工程师小熊 摘要:我们在使用mariadb的时候发现有时候不能启动起来,在使用过程中mariadb占用的内存很大,在这里学习下mariadb与内存相关的配置项,对mariadb进行调...

腾讯云加社区
今天
3
0
spring security 自定义登录认证

spring security 自定义认证登录 1.概要 1.1.简介 spring security是一种基于 Spring AOP 和 Servlet 过滤器的安全框架,以此来管理权限认证等。 1.2.spring security 自定义认证流程 1)认证...

EasyProgramming
今天
1
0
Win下Jenkins-2.138源码编译及填坑笔记

源码编译篇 1、 安装JDK1.8-181,操作系统添加JDK环境变量。Java -version验证一下。 注:Jenkins2.138版本,JDK必须jkd1.8.0-101以上,不支持Java9,Maven必须3.5.3以上。 2、 解压Maven3....

编程SHA
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部