7

私は最初のスクリプト言語としてPHPを2か月間勉強しています。私の問題のほとんどについて、私はオンラインで簡単に答えを見つけることができますが、私が理解できないように見えるPDOについての何かがあります。

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

PHPマニュアルでは、foreachループを使用してPDOStatementオブジェクトを反復処理することにより、返された行を表示する方法を学びました。ただし、PHPマニュアルには、オブジェクトが配列に変換されると、その要素がオブジェクトのプロパティである配列が生成されることが明確に記載されています。PDOStatementには、発行されたクエリ文字列を含む1つのプロパティ($ 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'];
4

1 に答える 1

7

PDOStatementクラスは、オブジェクトを反復処理できるIteratorインターフェースを実装します。

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
}
于 2012-06-07T00:04:50.130 に答える