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

使用PDO结合while循环时出现‘Trying to access array offset on value of type bool’错误的原因及解决方案

解决PDO代码中的「Trying to access array offset on value of type bool」错误

错误原因

你这段代码的问题出在while循环的判断逻辑上:

while( $row = $sth->fetch( PDO::FETCH_ASSOC )['YEAR'] )

PDO的fetch(PDO::FETCH_ASSOC)方法在没有更多数据可以获取时,会返回false。而你现在的写法是直接在fetch的返回值后面加['YEAR']去取值——当fetch返回false的时候,就相当于你在试图从一个布尔值里读取数组键,这就触发了这个错误。

直白点说:循环到最后一条数据后,fetch返回false,你还硬要从false里拿YEAR,这不报错才怪😂

解决方案

我们需要先确认fetch返回的是有效的数组,再去读取YEAR字段,给你两种靠谱的写法:

写法一:先获取结果,再判断取值(最常用)

把fetch的结果先赋值给$row,判断$row不是false之后,再去取YEAR的值:

$query = "SELECT DISTINCT SUBSTR(Date, 1, 4) AS YEAR from Events ORDER BY YEAR DESC;";
$sth = $dbh->query( $query );
while( $row = $sth->fetch( PDO::FETCH_ASSOC ) ) { 
    print $row['YEAR'];
}

写法二:一次性获取所有结果(适合小数据量)

如果你的查询返回的数据不多,可以用fetchAll直接把所有YEAR值取出来,再遍历:

$query = "SELECT DISTINCT YEAR(Date) AS YEAR from Events ORDER BY YEAR DESC;";
$sth = $dbh->query( $query );
// 直接获取第一列的所有值,得到一维数组
$years = $sth->fetchAll(PDO::FETCH_COLUMN, 0); 
foreach($years as $year) {
    print $year;
}

额外优化建议

你的SQL里Date(Date)是多余的,而且用SUBSTR取年份不如直接用MySQL的YEAR()函数更直观,把SQL改成上面的写法更简洁也更可靠。


内容的提问来源于stack exchange,提问作者Robert S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:04:07