我被难住了。请考虑以下测试表:
----------------
| 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()
调用。