PHP执行SQL查询返回空页面且var_dump显示bool(false)问题排查
问题排查与修复方案
嘿,我帮你找出了代码里几个关键问题,正是这些问题导致查询返回bool(false)、页面空白。咱们一步步拆解:
1. SQL语句的语法错误(核心问题)
你的CTE(公共表表达式)存在三处明显错误,这也是为什么直接在SQL工具里能跑,但放到PHP里就失败的原因(大概率是你在工具里用的是正确SQL,粘贴到代码时写错了):
- 递归部分引用了不存在的别名:你定义的列是
hr,但条件里写的是where h < 23,应该改成where hr < 23 - 递归CTE缺少数据源:
select hr + 1后面没有from hours,MySQL的递归CTE必须引用自身才能生成连续的小时序列 - CTE和主查询之间多了个分号
;:MySQL里CTE和后续查询是一个整体,不能用分号分隔
原错误SQL:
with hours as ( select 0 hr union all select hr + 1 where h < 23 ); select h.hr, count(e.eventID) as cnt from hours h left join events e on e.timeStamp > now() - interval 1 day and hour(e.timestamp) = h.hr group by h.hr;
修正后的SQL:
with hours as ( select 0 hr union all select hr + 1 from hours where hr < 23 ) select h.hr, count(e.eventID) as cnt from hours h left join events e on e.timeStamp > now() - interval 1 day and hour(e.timeStamp) = h.hr group by h.hr;
2. 错误处理不到位,看不到报错信息
你的代码里,当查询失败时只调用了mysqli_error($conn)但根本没输出它,这导致你无法知道具体错误原因,调试起来非常困难。另外while循环里的mysqli_error($this->conn)也是错的——这里不是类方法,没有$this,而且查询成功时也不需要输出错误,直接删掉就行。
修正后的错误处理代码:
} else { echo "查询出错啦: " . mysqli_error($conn); }
3. 字段名大小写的小细节(可选优化)
你SQL里同时用了e.timeStamp和hour(e.timestamp),虽然MySQL在Windows等不区分大小写的系统上能正常运行,但在Linux这类区分大小写的环境下可能出问题,建议统一字段名的大小写,比如都写成timeStamp或者全小写的timestamp。
完整修正后的代码
<?php error_reporting(E_ALL); ini_set('display_errors', 'on'); //Access local db with this script $servername = "localhost"; $username = "dev"; $password = "somepassword"; $dbname = "dbname"; $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // 修正后的SQL语句 $sql = "with hours as ( select 0 hr union all select hr + 1 from hours where hr < 23 ) select h.hr, count(e.eventID) as cnt from hours h left join events e on e.timeStamp > now() - interval 1 day and hour(e.timeStamp) = h.hr group by h.hr;"; $result = $conn->query($sql); if ($result) { while ($obj = $result->fetch_object()) { printf("%s, ", $obj->cnt); } $result->free_result(); } else { // 输出错误信息,方便调试 echo "查询失败: " . mysqli_error($conn); } $conn->close(); ?>
现在运行修正后的代码,应该就能正常展示数据了。如果还有问题,错误信息也会帮你快速定位其他问题~
内容的提问来源于stack exchange,提问作者Shri
相关产品推荐
相关产品推荐

