当结果具有单行时,PDO fetchAll 似乎失败


PDO fetchAll seems to fail when result has single row?

我被难住了。请考虑以下测试表:

----------------
| art_projects |
----------------------------------
| project_name | project_creator |
|--------------|-----------------|
| Flying Feet  | 1               |
| Dinosaurs    | 2               |
| Roadblock    | 1               |
----------------------------------

与它配对,请考虑以下代码(其中$db是确认功能的 PDO 实例):

$dbObj = $db->prepare("SELECT * FROM art_projects WHERE project_creator = ?");
$dbObj->execute([1]);
print_r($dbObj->fetchAll(PDO::FETCH_ASSOC));

非常简单,很少会出错。这将按预期运行并返回以下结果集:

----------------------------------
| project_name | project_creator |
|--------------|-----------------|
| Flying Feet  | 1               |
| Roadblock    | 1               |
----------------------------------

这就是问题开始的地方。如果我将execute()更改为搜索 ID 2 而不是 1,我希望它会返回 Dinosaurs 的单行结果。它没有 - 我得到这个:

1

但是,当我$dbObj->fetchAll(...)更改为 $dbObj->fetch(...) 时,我得到了预期的单行结果。到底...?


现在,我对 PDO 很陌生,但我假设这是预期的行为;我似乎找不到任何关于这是一个"错误"的信息,无论是在这里还是在谷歌的其他地方。有人可以向我解释这种行为吗?

此外,是否有一种公认的/有效的方法来解决这个问题?恕我直言,为了使用正确的获取方法而测试结果集的长度是一种 Catch-22,并且神奇地知道您的结果集何时是单行或多行是不合理的。

FETCH_ASSOC不是PDO::FetchAll()的有效记录模式。当它获得多个结果集行时,它可能正在对清除内容的关联数组进行某种填充。

如果我是你,我会循环并每行进行一次普通的fetch()调用。