我是一个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
PDO
或PDOStatement
对象一样使用它?< / p>
2.有人说$ users是游标,一旦消耗,它就不会倒回到结果集的开头。
foreach ($users as $row) {
print $row["name"] . "<br/>";
}
但为什么你可以在foreach
声明中使用它? foreach
提供了一种迭代数组的方法。什么是光标呢?光标是指针吗?
3.对于pdostatement班,该文件说:
PDOStatement implements Traversable { ... }
为什么这个类实现了Traversable接口?它是空接口吗?
谢谢你的帮助!
答案 0 :(得分:2)
根据documentation,Traversable
接口允许您将对象用于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声明中使用它?
这就是我上面谈到的语法糖。他们只是在语句对象中添加了这种可能性。