当结果有单行时,PDO fetchAll似乎失败了吗?

时间:2015-01-06 21:44:13

标签: php mysql pdo

我很难过。请考虑以下测试表:

----------------
| 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很陌生,但我认为这是预期的行为;我似乎无法在Google或其他地方找到任何与此相关的错误信息。有人可以向我解释这种行为吗?

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

1 个答案:

答案 0 :(得分:1)

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

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