使用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
相关产品推荐
相关产品推荐

