关于PDO :: query的作用有点困惑.完全理解它与准备和执行之间的区别,但是不清楚查询是否运行获取.根据PHP.net:
PDO::query — Executes an SQL statement, returning a result set as a PDOStatement object
经证实:
$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魔术方法隐藏了这些数据
解决方法:
这与PHP PDO :: query实际执行的操作无关.而是PDOStatement实际上是什么.它是an object that supports a Traversable interface,所以它可以迭代.并且当迭代时,它在内部调用fetch().
it is unclear about if query runs a fetch
PDO :: query永远不会运行获取. PDOStatement确实如此.在以下行中,简短语法用于简洁.
foreach ($conn->query($sql) as $row)
虽然它可以写成
$stmt = $conn->query($sql);
foreach ($stmt as $row)
因为foreach迭代结果,由查询返回,而不是一次又一次地运行查询
why can you not see the fetched data in the PDOStatement object?
因为没有这样的数据.
希望现在一切都清楚了
标签:php,pdo
来源: https://codeday.me/bug/20190623/1266730.html