【发布时间】:2017-04-23 23:46:55
【问题描述】:
对 PDO::query 的作用有点困惑。完全理解它与准备和执行之间的区别,但是不清楚查询是否运行提取。根据 PHP.net:
PDO::query — 执行 SQL 语句,将结果集作为 PDOStatement 对象返回
证明:
$s = $pdo->query('SELECT * FROM user');
var_dump($s);
哪个输出:
object(PDOStatement)#2 (1) {
["queryString"]=> string(18) "SELECT * FROM user"
}
所以它清楚地为我们提供了一个准备运行 fetch 或 fetchAll 的 PDOStatement 对象。然而。以下代码取自 PHP.net 手册:
$sql = 'SELECT name, color, calories FROM fruit ORDER BY name';
foreach ($conn->query($sql) as $row) {
print $row['name'] . "\t";
print $row['color'] . "\t";
print $row['calories'] . "\n";
}
这表明运行 PDO::query 实际上在内部运行 fetch 并返回结果(在方法的初始描述中提到过)。但是,如果这是真的,那么随后对 fetch 的调用应该返回第二行,但它没有返回,您仍然会得到第一行。
查询是否运行提取并重置指针,以便后续提取也返回第一行?如果是这样,这不是表现不佳吗?为什么你可以循环查询并获得多行?它是否使用yield运行某种协程?此外,为什么在 PDOStatement 对象中看不到获取的数据?据推测,他们正在使用 __set_state 和 __debugInfo 魔术方法隐藏这些数据
【问题讨论】: