我有一个PDO对象,代码如下:
$query = "SELECT DISTINCT SUBSTR( Date(Date), 1, 4) AS YEAR from Events ORDER BY YEAR DESC;";
$sth = $dbh->query( $query );
while( $row = $sth->fetch( PDO::FETCH_ASSOC )['YEAR'] ) {
print $row
}
代码执行,但是我得到
尝试访问bool类型值上的数组偏移量
解释是什么?有解决办法吗?
while
循环的工作方式是,只要条件的计算结果为布尔值为真,它就会继续迭代。
PDOStatement::fetch()
将返回一个数组,其中包含当前的数据行和一个内部指针移动到下一行的结果。如果没有更多的行,则返回false
。
这意味着一旦您到达PDO结果的末尾,fetch()
返回false
,并且您不能访问false
上的数组偏移量。这就是为什么你会得到一个错误。
有几种方法可以解决这个问题。
-
不要使用
while
loop。没有理由在你的例子中使用它。foreach ($sth as $row) { echo $row['YEAR']; }
-
如果你想要的是一个单列,那么没有理由去获取一个数组。
while( $year = $sth->fetchColumn() ) { echo $year; }
-
设置执行查询或使用
setFetchMode()
时的获取模式。$sth = $dbh->query( $query, PDO::FETCH_COLUMN, 0 ); foreach ($sth as $year) { echo $year; }
这似乎也起作用了:
$sth = $dbh->query( $query );
while( $row = $sth->fetch( PDO::FETCH_ASSOC ))
print $row['YEAR']
我同意foreach
更合适