首页 文章

PHP PDO :: query实际上如何做?

提问于
浏览
4

关于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 回答

  • 4

    这与PHP PDO::query 实际上做的无关 . 而是 PDOStatement 实际上是什么 . 它是an object that supports a Traversable interface,因此它可以迭代 . 并且在迭代时,它在内部调用 fetch() .

    目前还不清楚查询是否运行获取

    PDO :: query永远不会运行获取 . PDOStatement确实如此 . 在以下行中,简短语法用于简洁 .

    foreach ($conn->query($sql) as $row)
    

    虽然它可以写成

    $stmt = $conn->query($sql);
    foreach ($stmt as $row)
    

    因为 foreach 正在迭代结果,由查询返回,而不是一次又一次地运行查询

    为什么你不能在PDOStatement对象中看到获取的数据?

    因为没有这样的数据 .

    希望现在一切都清楚

相关问题