You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP执行mysqli multi_query后SELECT返回空需加sleep(1)问题求解

问题根因与修复方案

核心问题原因

你的问题完全来自mysqli::multi_query的使用错误:
调用multi_query执行多条SQL后,MySQL会按顺序返回每条SQL的执行结果,你必须主动遍历、消费所有结果集,否则数据库连接会一直处于「等待读取结果」的忙状态,后续在同一个连接上发起的所有查询都会执行异常。
你加了sleep之后查询正常,本质是等待期间底层IO自动完成了结果缓冲的处理,属于巧合的临时解决方案,不是可靠逻辑。

修复代码

你有两处用到了multi_query,都需要补全结果集消费逻辑:

  1. 修复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;
    }
}
  1. 同样修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 06:24:00