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

时间:2016-12-08 16:39:00

标签: php pdo

关于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 个答案:

答案 0 :(得分: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对象中提取的数据?

因为没有这样的数据。

希望现在一切都清楚