我是一个php和mysql的初学者,目前我在自学PDO,混淆了一些概念:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$sql = "SELECT * FROM users";
$users = $dbh->query($sql);

1.PDO类和PDOStatement类之间是什么关系?
$dbh是类PDO的新对象,但为什么$users是PDOStatement对象?fetchAll()是类PDOStatement中的函数,但您可以像这样使用它,它是$users->fetchAll()对象还是$users对象?
2.有人说$users是光标,一旦被消费,就不会倒回结果集的开头。
foreach ($users as $row) {
    print $row["name"] . "<br/>";
}

但为什么你可以在PDO语句中使用它呢?PDOStatement提供了一种遍历数组的方法。光标到底是什么?光标是指针吗?
3.对于pdostatement类,医生说:
PDOStatement implements Traversable { ... }

为什么这个类实现可遍历接口?是空接口吗?
谢谢你的帮助!

最佳答案

根据documentationTraversable接口允许您将对象使用到一个foreach循环中,并且只在内部使用。把它看作是使用PDOStatement的一种方便方法。
基本上,使用PDO有两种执行查询的方法,一种是使用PDO::prepare()&PDOStatement::execute()执行查询,另一种是使用PDO::query()执行查询。后者在一个调用中准备/执行。
PDO::query()PDO::execute()不会返回结果,另一方面PDOStatement对象允许您指定要返回的数据。PDOStatement::fetchAll()将允许定义如何组织数据。
乍一看似乎更复杂,但它提供了更多的灵活性。

09-20 11:28