PHP执行mysqli multi_query后SELECT返回空需加sleep(1)问题求解
问题根因与修复方案
核心问题原因
你的问题完全来自mysqli::multi_query的使用错误:
调用multi_query执行多条SQL后,MySQL会按顺序返回每条SQL的执行结果,你必须主动遍历、消费所有结果集,否则数据库连接会一直处于「等待读取结果」的忙状态,后续在同一个连接上发起的所有查询都会执行异常。
你加了sleep之后查询正常,本质是等待期间底层IO自动完成了结果缓冲的处理,属于巧合的临时解决方案,不是可靠逻辑。
修复代码
你有两处用到了multi_query,都需要补全结果集消费逻辑:
- 修复
processMarketplace函数内的multi_query执行逻辑:
if (strlen($sql) > 0) { if (Database::$conn->multi_query($sql) === TRUE) { // 新增:消费所有执行结果,释放连接状态 do { if ($result = Database::$conn->store_result()) { $result->free(); } } while (Database::$conn->next_result()); echo mysqli_error(Database::$conn); } else { echo mysqli_error(Database::$conn); echo "Error: " . $sql . "<br>" . Database::$conn->error; } }
- 同样修复
initialPopulate函数内的multi_query执行逻辑:
if (strlen($sql1) > 0) { if (Database::$conn->multi_query($sql1) === TRUE) { // 新增:消费所有执行结果,释放连接状态 do { if ($result = Database::$conn->store_result()) { $result->free(); } } while (Database::$conn->next_result()); echo mysqli_error(Database::$conn); } else { echo mysqli_error(Database::$conn); echo "Error: " . $sql1 . "<br>" . Database::$conn->error; } }
修改完成后去掉sleep(1)即可正常运行。
其他优化建议
- 直接拼接SQL字符串的写法存在SQL注入风险,建议替换为预处理语句实现参数绑定。
- Database类初始化连接时建议主动设置字符集,新增
self::$conn->set_charset('utf8mb4');避免乱码问题。 - 如果需要保证清空表+插入数据的操作原子性,可将
TRUNCATE替换为DELETE FROM marketplace,配合事务实现失败回滚(TRUNCATE属于DDL语句,无法参与事务,执行后自动提交)。
内容的提问来源于stack exchange,提问作者James Matthews
相关产品推荐
相关产品推荐

