PDO类与PDOStatement类之间的关系

时间:2013-03-14 05:10:38

标签: php mysql pdo cursor pdostatement

我是一个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 PDOPDOStatement对象一样使用它?< / p>

2.有人说$ users是游标,一旦消耗,它就不会倒回到结果集的开头。

foreach ($users as $row) {
    print $row["name"] . "<br/>";
}

但为什么你可以在foreach声明中使用它? foreach提供了一种迭代数组的方法。什么是光标呢?光标是指针吗?

3.对于pdostatement班,该文件说:

PDOStatement implements Traversable { ... }

为什么这个类实现了Traversable接口?它是空接口吗?

谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

根据documentationTraversable接口允许您将对象用于foreach循环,并且它只应该在内部使用。可以将其视为使用PDOStatement的便捷方式。

基本上,使用PDO有两种方法可以执行查询,一种方法是使用PDO::prepare()&amp; PDOStatement::execute()使用PDO::query(),另一个使用PDOStatement::fetchAll()。后者在一次通话中准备/执行。

另一方面,

PDO::query()PDO::execute()不会返回结果,PDOStatement对象将允许您指定要返回的数据。 {{3}}将允许定义您希望如何组织数据。

第一眼看上去似乎更复杂,但它提供了更大的灵活性。

答案 1 :(得分:1)

所有这些混乱被称为“语法糖”,旨在使开发人员的生活变甜,但实际上它使味道过于含糖而令人厌恶。

所以,有两种种类的对象特征 - 自然和非自然的。
你所有的困惑都来自后者。

在你的位置,我会忘记它们,直接使用物体。

  

1. PDO类和PDOStatement类之间的关系是什么?

这是两个不同的类。它们用于不同的目的。就像在旧的mysql中一样,你有连接资源和结果资源。您只有一个连接/ PDO实例,但可以有任意数量的实际查询结果/ stmt类。

  

但为什么你可以在foreach声明中使用它?

这就是我上面谈到的语法糖。他们只是在语句对象中添加了这种可能性。