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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:06:47