查询中使用DATE_FORMAT引发「Notice: Trying to access array offset on value of type bool in」报错的问题求助
首先,这个错误的核心原因很明确:当你调用$getprod_t->fetch()时,如果查询没有匹配到任何记录,它会返回false(布尔值),而你直接尝试访问$prod_t['qte'],就会触发这个数组偏移访问的Notice。
至于为什么昨天加DATE_FORMAT还能正常运行,今天却不行,而且移除它就恢复,我帮你拆解几个可能的原因和对应的解决方案:
1. 先给代码加个安全判断(紧急修复)
不管是什么原因,先给代码加上结果判断,避免直接访问布尔值的数组偏移:
$getprod_t = $bdd->prepare("SELECT id, author, item, qte, type, DATE_FORMAT(datee, '%d/%m/%Y - %H:%i') AS datee FROM registre WHERE author=:author AND item=:item AND type=1"); $getprod_t->execute([ 'author' => $_SESSION['username'], 'item' => 3 ]); $prod_t = $getprod_t->fetch(); // 先确认查询返回了有效结果 if ($prod_t !== false) { echo $prod_t['qte']; } else { // 没有找到记录时的提示或处理逻辑 echo "未找到匹配的记录"; }
2. 排查DATE_FORMAT导致查询无结果的原因
你提到移除DATE_FORMAT后代码正常,说明加了这个函数后,查询可能没有返回任何记录。建议你做以下调试:
手动执行SQL语句:把占位符替换成实际值(比如
$_SESSION['username']的真实内容),在MySQL客户端或phpMyAdmin里执行这条SQL:SELECT id, author, item, qte, type, DATE_FORMAT(datee, '%d/%m/%Y - %H:%i') AS datee FROM registre WHERE author='你的用户名' AND item=3 AND type=1;如果手动执行也没有结果,那说明今天的数据库里确实没有符合条件的记录;如果手动执行有结果,但PHP里返回
false,那可能是数据库驱动的问题。检查
datee字段的异常值:有没有可能今天新增的符合条件的记录中,datee字段是NULL或者格式不符合DATE_FORMAT的要求?虽然DATE_FORMAT处理NULL会返回NULL,但不会导致整个查询无结果,不过可以确认一下字段类型是否为DATETIME/TIMESTAMP。开启PDO异常模式排查错误:在数据库连接后添加这行代码,让PDO抛出具体的SQL异常,能帮你快速定位问题:
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);如果SQL执行有任何错误,都会抛出异常,你就能看到具体的错误信息。
3. 关于别名的小提醒
你用DATE_FORMAT(datee, ...) AS datee把格式化后的字段重命名为原字段名,虽然MySQL允许这样做,但某些情况下可能导致字段值被覆盖(比如原datee字段和别名datee在结果集中只保留一个)。建议你把别名改成不同的名字,比如formatted_date:
SELECT id, author, item, qte, type, DATE_FORMAT(datee, '%d/%m/%Y - %H:%i') AS formatted_date FROM registre WHERE author=:author AND item=:item AND type=1;
这样也能避免潜在的键名冲突问题。
内容的提问来源于stack exchange,提问作者Arkanium _

