共享主机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
相关产品推荐
相关产品推荐

