我已经学习了2个月的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'];
答案 0 :(得分:7)
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
}