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

共享主机PHP合并执行MySQL时区设置与业务查询报错求助

解决MySQL会话时区设置与查询合并执行的报错问题

这个报错的原因很明确:当你用mysqli_query执行多条SQL语句时,它只会返回第一条语句的执行结果。你的第一条语句是SET @@session.time_zone = '+05:30';,这条语句执行成功后返回的是布尔值true,而不是查询结果集,所以当你把这个值传给mysqli_num_rows()时,自然会触发「期望参数是mysqli_result,却传入布尔值」的错误。

下面给你两种可行的解决方案:

方案1:分开执行两条语句(推荐)

最直观也最容易维护的方式,就是先执行时区设置语句,确认成功后再执行业务查询。这样第二个查询返回的就是正常的结果集,能直接用mysqli_num_rows()处理:

// 第一步:设置会话时区
$setTimezoneQuery = "SET @@session.time_zone = '+05:30';";
if (mysqli_query($db, $setTimezoneQuery)) {
    // 第二步:执行业务查询
    $userCheckQuery = "SELECT * FROM `entries` WHERE `d_timestamp` > NOW() AND DATE(`d_timestamp`) = DATE(NOW()) AND TIMEDIFF(TIME(`d_timestamp`), TIME(NOW())) > '00:59:00' ORDER BY modified DESC";
    $result = mysqli_query($db, $userCheckQuery);
    
    if ($result) {
        if (mysqli_num_rows($result) > 0) {
            // 这里处理你的业务逻辑
            while ($row = mysqli_fetch_assoc($result)) {
                // 操作每行数据
            }
        }
        mysqli_free_result($result);
    } else {
        // 处理查询错误
        echo "业务查询失败:" . mysqli_error($db);
    }
} else {
    // 处理时区设置错误
    echo "时区设置失败:" . mysqli_error($db);
}

另外要注意:会话时区的设置只在当前数据库连接周期内有效,所以建议你把时区设置的代码放在数据库连接初始化的逻辑里,这样后续所有的查询都会自动使用印度时区,不用每次查询都重复设置。

方案2:使用mysqli_multi_query执行多条语句

如果一定要把两条语句合并执行,可以用mysqli_multi_query,但需要手动跳过第一条语句的结果,获取第二条查询的结果集:

$combinedQuery = "SET @@session.time_zone = '+05:30';SELECT * FROM `entries` WHERE `d_timestamp` > NOW() AND DATE(`d_timestamp`) = DATE(NOW()) AND TIMEDIFF(TIME(`d_timestamp`), TIME(NOW())) > '00:59:00' ORDER BY modified DESC";

if (mysqli_multi_query($db, $combinedQuery)) {
    // 跳过第一条SET语句的结果
    mysqli_next_result($db);
    
    // 获取SELECT语句的结果集
    $result = mysqli_store_result($db);
    
    if ($result) {
        if (mysqli_num_rows($result) > 0) {
            // 处理业务逻辑
            while ($row = mysqli_fetch_assoc($result)) {
                // 操作数据
            }
        }
        mysqli_free_result($result);
    }
    
    // 清理剩余的结果(避免后续查询出错)
    while (mysqli_next_result($db));
} else {
    echo "执行失败:" . mysqli_error($db);
}

这种方式相对复杂,而且调试起来不如分开执行方便,所以更推荐方案1。

内容的提问来源于stack exchange,提问作者Shivam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:15:35