php循环执行multi_query时,提示Commands out of sync; you can't run this command now

当在PHP中使用mysqli_multi_query执行多条SQL时,可能会遇到'Commands out of sync; you can't run this command now'的错误。问题源于未正确处理结果集。解决方案包括使用mysqli_next_result()和mysqli_free_result()释放结果集,以及检查SQL错误日志以确保语句无误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

multi_query

执行一个 SQL 或者 多个使用分号分隔的 SQL 语句。
要获得执行结果中的第一个结果集,请使用 mysqli_use_result() 或 mysqli_store_result() 函数。
要读取后续的结果集, 请使用 mysqli_more_results() 和 mysqli_next_result() 函数。

如果第一个 SQL 语句就失败了,返回 FALSE。 如果是批量执行 SQL 语句, 必须首先调用 mysqli_next_result() 函数,才可以获取后续语句的错误信息。
如果第一个SQL语句成功了,返回TRUE,但并不意味着后续SQL在执行过程中没有出错
参考:http://php.net/manual/zh/mysqli.multi-query.php

问题

使用mysqli_multi_query,遇到2个问题:
1、多条sql语句(alter语句),只有第1条操作数据库成功了,剩下几条对数据库的操作都没有成功。
2、循环向多个表中插入sql,第一个表执行完成后,执行第二个表时,会报Commands out of sync; you can’t run this command now。

原因

这2个问题都是因为结果集没有释放导致的。
错误提示表明,消息执行顺序有问题,multi->query执行完成后除了返回实际结果集外,还返回了存储过程执行的状态。在执行第2个sql语句前,需要将所有的结果集释放掉。

如果释放结果集后,还是会出现问题1,建议用mysqli_error($con) 打印下sql执行的错误日志,看看是否因为sql执行时有错误导致没有更新db成功

修复代码
for($i = 1; $i < 100; $i++) {
    $sql .= sql1;
    $sql .= sql2;
    …………
    if ($con->multi_query($sql)) {
        do {
		    echo "===111===开始批量处理===\n";
		    /* store first result set */
		    if ($result = $con->store_result()) {
		    	while ($row = $result->fetch_row()) {
               	print_r("===do nothing===" . $row);
            	}
            	$result->free();
		           // $result->close();
		      }
		  } while($con->more_results() && $con->next_result());
		  echo "===222===上一条sql执行的错误是===" . mysqli_error($con) . "\n"; //如果后续sql没有执行成功,看上是否是因为上一条语句执行出错了
       		// while ($con->more_results() && $con->next_result()){
        	// }
	} else {
		    echo "Error: " . $sql . "\n" . $con->error;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值