2012-06-06 22 views
7

私は最初のスクリプト言語として2ヶ月間PHPを勉強してきました。ほとんどの私の問題については、簡単にオンラインで回答を見つけることができますが、PDOについては理解できないようなものがあります。PDO結果セットの保存方法

データベースからデータを取得するために、PDOクラスの新しいオブジェクトをインスタンス化し、そのオブジェクトに対してPDO :: query()メソッドを呼び出します。これは、SQL照会から結果セットを運ぶPDOStatementオブジェクトを戻します。ここで問題が始まります。私は結果セットのデータがどこにどこに格納されているのか分からないようです。

PHPマニュアルでは、返された行をで表示することを学びました。これは、foreachループを使ってPDOStatementオブジェクトを反復処理することです。しかし、PHPマニュアルには、オブジェクトが配列に変換された場合、結果は配列の要素がのオブジェクトのプロパティであることが明示されています。 PDOStatementは - $ queryString - 発行されたクエリ文字列を含むの1つのプロパティしか持っていません。だから...クエリ結果はどこに保存されていますか?そして、なぜ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

と等価です。 net/Iterator)インタフェースを使用して、暗黙のメソッド呼び出しが個々の結果を返すようにします。プロパティや内部データとして存在する必要はありません。 – mario

答えて

6

PDOStatementクラスは、Iterator interfaceを実装しています。このオブジェクトによって、オブジェクトの反復処理が可能になります。 // PHP:イテレータインターフェースを実装するオブジェクトについて


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) 
} 

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

は、[ `Iterator`](HTTPを実装

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は、 'Iterator'によって拡張された内部クラスである' Traversable'を直接実装しています。 – ddlshack

関連する問題