【问题标题】:How is a PDO result set storedPDO 结果集如何存储
【发布时间】:2012-06-11 00:54:33
【问题描述】:

作为我的第一门脚本语言,我已经学习 PHP 两个月了。对于我的大多数问题,我可以很容易地在网上找到答案,但我似乎无法理解 PDO 的某些内容。

为了从数据库中检索数据,我实例化了 PDO 类的一个新对象并在其上调用 PDO::query() 方法。这将返回一个 PDOStatement 对象,该对象携带来自 SQL 查询的结果集。这就是问题开始的地方。我似乎无法理解结果集中数据的存储方式和位置。

在 PHP 手册中,我学会了通过使用 foreach 循环遍历 PDOStatement 对象 来显示返回的行。但是,PHP 手册明确指出,如果将对象转换为数组,则结果是一个数组,其元素是 对象的属性。 PDOStatement 只有一个属性 - $queryString - 包含发出的查询字符串。那么......查询结果存储在哪里?为什么我可以通过一个带有 foreach 循环的数组来访问它们,而不是在它之外?

// Instantiate new PDO object to establish a new connection with MySQL database
$db = new PDO('mysql:dbhost=localhost;dbname=world', 'root', 'secret');

// Execute SQL query - Returns a PDOStatement object
$result = $db->query("SELECT Name, Continent, Population FROM Country");


// Result set can be accessed with a foreach loop iterating over the PDOStatement object
foreach ($result as $row) {
    echo "$row[Name] - $row[Continent] - $row[Population] <br />";
}

// Outside the foreach loop, $result cannot be accessed this way.
// This produces 'Cannot use object of type PDOStatement as array'
echo $result[0]['Name'];

【问题讨论】:

  • 它实现了Iterator接口,因此隐式方法调用返回单个结果;因此它们不必作为属性或内部数据存在。

标签: php pdo


【解决方案1】:

PDOStatement 类实现了Iterator interface,它允许迭代其对象。

Iterator extends Traversable {
    /* Methods */
    abstract public mixed current ( void )
    abstract public scalar key ( void )
    abstract public void next ( void )
    abstract public void rewind ( void )
    abstract public boolean valid ( void )
}

对于实现Iterator接口的对象,

foreach($result as $row) {
    // Code
}

等价于

for ($result->rewind(); $result->valid(); $result->next()) {
    $row = $result->current();
    // Code
}

【讨论】:

  • 非常感谢!我特别花时间学习了 SPL 和 Iterator 接口。现在我看到了如何迭代对象,但我仍然不明白查询的结果集存储在哪里。我了解到对象只能具有树类型的成员:属性、方法和常量。如果结果集没有存储在属性中,那么它存储在哪里?是否有某种缓冲?
  • 有趣的问题。我希望 PDOStatement 对象拥有一个资源,与 mysql_query 返回的资源类型相同。但是,根据php.net/manual/en/class.pdostatement.php 它没有。
  • 另外,我的回答有点错误。 PDOStatement 直接实现Traversable,是Iterator扩展的内部类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2012-12-22
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多