2012-06-06 51 views
7

我已經學習了PHP 2個月,現在是我的第一個腳本語言。對於我的大部分問題,我都可以在網上輕鬆找到答案,但有一些關於PDO的東西似乎無法理解。如何存儲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

它實現了['Iterator'](HTTP:// PHP。 net/Iterator)接口,以便隱式方法調用返回單個結果;因此它們不必作爲屬性或內部數據存在。 – mario

回答

6

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 
} 
+1

非常感謝!我花時間瞭解SPL和Iterator接口。現在我看到如何迭代對象,但我仍然不明白查詢的結果集存儲在哪裏。我已經瞭解到,對象只能有樹的類型成員:屬性,方法和常量。如果結果集沒有存儲在屬性中,那麼它存儲在哪裏?有沒有某種緩衝區? – user1440560

+0

有趣的問題。我期望PDOStatement對象擁有一個資源,它是mysql_query返回的相同類型的資源。但是,根據http://php.net/manual/en/class.pdostatement.php它沒有。 – ddlshack

+0

另外,我的回答有點不對。 PDOStatement直接實現'Traversable',這是一個由'Iterator'擴展的內部類。 – ddlshack