关于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"
}
所以它清楚地给了我们一个PDOStatement对象准备运行fetch或fetchAll . 然而 . 从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调用应该返回第二行,但是它不会,你仍然会得到第一行 .
查询是运行获取并重置指针,以便后续获取也返回第一行?如果是这样,这不是没有意义吗?为什么你可以循环查询并获得多行?它使用产量运行某种协同程序吗?另外,为什么你不能在PDOStatement对象中看到获取的数据?据推测,他们使用__set_state和__debugInfo魔术方法隐藏了这些数据
1 回答
这与PHP
PDO::query
实际上做的无关 . 而是PDOStatement
实际上是什么 . 它是an object that supports a Traversable interface,因此它可以迭代 . 并且在迭代时,它在内部调用fetch()
.PDO :: query永远不会运行获取 . PDOStatement确实如此 . 在以下行中,简短语法用于简洁 .
虽然它可以写成
因为
foreach
正在迭代结果,由查询返回,而不是一次又一次地运行查询因为没有这样的数据 .
希望现在一切都清楚