2

我是一个 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(),是$usersaPDO还是PDOStatementobject?

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

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

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

3.对于pdostatement类,文档说:

PDOStatement implements Traversable { ... }

为什么这个类实现 Traversable 接口?是空界面吗?

谢谢你的帮助!

4

2 回答 2

2

根据文档,该Traversable接口允许您将对象用于foreach循环,并且只应该在内部使用。将其视为使用 PDOStatement 的一种便捷方式。

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

PDO::query()并且PDO::execute()不会返回结果,另一方面 PDOStatement 对象将允许您指定要返回的数据。PDOStatement::fetchAll()将允许定义您希望如何组织数据。

乍一看似乎更复杂,但它提供了更大的灵活性。

于 2013-03-14T05:32:33.503 回答
1

所有这些乱七八糟的东西都被称为“语法糖”,旨在让开发人员的生活变得甜蜜,尽管实际上它会让味道太甜到令人厌恶的地步。

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

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

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

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

但是为什么你可以在 foreach 语句中使用它呢?

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

于 2013-03-14T05:22:38.363 回答