为什么使用 while 循环时会"Trying to access array offset on value of type bool"?



我有一个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上的数组偏移量。这就是为什么你会得到一个错误。

有几种方法可以解决这个问题。

  1. 不要使用whileloop。没有理由在你的例子中使用它。

    foreach ($sth as $row) {
    echo $row['YEAR'];
    }
    
  2. 如果你想要的是一个单列,那么没有理由去获取一个数组。

    while( $year = $sth->fetchColumn() ) {
    echo $year;
    }
    
  3. 设置执行查询或使用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更合适

相关内容

最新更新