db::query() 返回 false 表示执行失败而非无数据,常见原因包括sql语法错误、数据库连接失败、权限不足、字符集冲突或pdo异常被静默处理;正确判断需先用 $res === false 检查执行是否成功,再用 is_array($res) && !empty($res) 判断是否有结果。

ThinkPHP 5.0 中调用 Db::query()(或 M()->query())返回空,常见原因不是“查到空数据”,而是根本没执行成功——它返回的是 false,而非 [] 或 null。这是和 find()/select() 等模型方法最本质的区别。
query() 返回 false 的典型原因
-
SQL 语句语法错误:比如表名拼错(
usre而非user)、字段名不存在、关键字大小写不规范(尤其在严格模式下)。 - 数据库连接失败或中断:用户名、密码、host、端口配置错误;MySQL 服务未启动;防火墙拦截。
-
权限不足:当前数据库用户没有执行该 SQL 的权限(如无
SELECT权限,或对某张表无访问权)。 -
字符集或 SQL 模式冲突:例如 SQL 中含中文或特殊符号,而连接未设置
utf8mb4,导致解析失败。 -
PDO 驱动异常被静默吞掉:TP5 默认关闭了 PDO 的异常模式(
PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT),出错时不抛异常,只返回false。
如何正确判断 query() 是否执行成功并有结果
不能直接用 empty($res) 或 count($res) > 0,因为 $res === false 时 count(false) 会触发 PHP 警告,且逻辑误判(false > 0 在弱类型下为 true)。
✅ 正确做法是分两步判断:
- 先检查是否执行成功:
if ($res === false) - 再检查是否有数据(仅当
$res是数组时):is_array($res) && !empty($res)
$res = Db::query("SELECT * FROM user WHERE id = ?", [999]);
if ($res === false) {
// 执行失败:查日志、检查SQL、确认数据库连通性
echo 'SQL执行出错,请检查语句或数据库配置';
} elseif (is_array($res) && !empty($res)) {
// 成功且有数据
dump($res);
} else {
// 成功但无记录(注意:query() 不会因“没查到”返回 false,只会返回 [])
echo '查询成功,但无匹配数据';
}
补充提醒
-
query()是原生 SQL 执行接口,不走模型层,也不做任何结果格式转换。它返回的是 PDOStatement::fetchAll() 的原始结果(成功时为二维数组,无数据时为[])。 - 如果你只是想查单条/多条业务数据,优先使用
Db::name('user')->where(...)->find()或->select(),它们行为更稳定、判断更直观,且自动处理异常(可配failException(true)主动报错)。 - 调试阶段可在
database.php中开启'debug' => true,TP5 会把完整 SQL 和错误信息写入日志,便于定位问题。
本质上,query() 返回空(实为 false)大概率是“路没走通”,而不是“路上没人”。先确保 SQL 跑得通,再谈结果有没有。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











