1

クエリが実行される前後にフェッチ モードを設定できるのに、結果が指定されたフェッチ モードを使用する理由について疑問に思っています...?

これは、PDO がクエリ結果を数値とアソシエーションの両方として db サーバーから取得することを意味しますか? うーん...

1つだけ取得することはできますか..? 数値結果または関連結果のどちらか?

これらの 2 つの例は、まったく同じ結果を返します。setFetchMode数値と関連結果の両方を省略すると、出力されます。

実行前

$sth = $dbh->prepare("SELECT REFERENCED_TABLE_NAME table_name, REFERENCED_COLUMN_NAME column_name\n"
    ."FROM KEY_COLUMN_USAGE\n"
    ."WHERE REFERENCED_TABLE_NAME IS NOT NULL && REFERENCED_COLUMN_NAME IS NOT NULL\n"
    ."GROUP BY REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME");
$sth->setFetchMode(PDO::FETCH_ASSOC);
$sth->execute();

echo '<pre>';
foreach($sth as $row){
    print_r($row);
}
echo '</pre>';

実行後

$sth = $dbh->prepare("SELECT REFERENCED_TABLE_NAME table_name, REFERENCED_COLUMN_NAME column_name\n"
    ."FROM KEY_COLUMN_USAGE\n"
    ."WHERE REFERENCED_TABLE_NAME IS NOT NULL && REFERENCED_COLUMN_NAME IS NOT NULL\n"
    ."GROUP BY REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME");
$sth->execute();
$sth->setFetchMode(PDO::FETCH_ASSOC);

echo '<pre>';
foreach($sth as $row){
    print_r($row);
}
echo '</pre>';
4

1 に答える 1

5

この例では、単純化を使用しています。実行後、ただしレコードを使用する前に、レコードもフェッチする必要があります。これらは、PDOStatementクラスのfetchメソッドとfetchAllメソッドです。

ただし、foreach構文を使用する場合は、foreachループの開始時に、自分の代わりにfetchAllメソッドを呼び出すPDOStatementのTraversableインターフェイスを使用しています。

したがって、どちらの例でも、フェッチモードを設定した後にfetchAllが呼び出されます。

編集:

つまり、PDOはクエリ結果を数値とassocの両方としてdbサーバーから取得しますか?うーん...

PDOは、DBから1つまたは2つの方法でレコードをフェッチするのではなく、常に同じ方法でフェッチします。違いは、結果を表示する方法だけです。フェッチモードを指定すると、PDOは要求された構造を構築します。デフォルトを使用するか、FETCH_BOTHを指定すると、2つの異なる表現が作成されますが、同じ結果セットから作成されます。このパラメーターは、SQLサーバーに送信されるコマンドに違いはありません。

于 2013-01-17T21:27:59.073 に答える