2016-12-08 9 views
4

PDO ::クエリが何をするかについての混乱のビット。それと準備と実行の違いを完全に理解していますが、クエリがフェッチを実行するかどうかは不明です。 PHP.netによると: - :出力PHP PDO :: queryは実際にどのように機能しますか?

$s = $pdo->query('SELECT * FROM user'); 
var_dump($s); 

PDO ::クエリが結果セットをPDOStatementオブジェクトとして返す、SQL文を実行し

によって証明されています:

object(PDOStatement)#2 (1) { 
    ["queryString"]=> string(18) "SELECT * FROM user" 
} 

したがって、明らかにfetcを実行する準備ができているPDOStatementオブジェクトhまたはfetchAllをオンにします。しかしながら。 PHP.netのマニュアルから取られた次のコードを取る:

$sql = 'SELECT name, color, calories FROM fruit ORDER BY name'; 
foreach ($conn->query($sql) as $row) { 
    print $row['name'] . "\t"; 
    print $row['color'] . "\t"; 
    print $row['calories'] . "\n"; 
} 

これはPDO ::クエリを実行すると、実際に内部フェッチ動作し、(メソッドの最初の記述に記載されている)の結果を返すことを示しています。しかし、それが真であれば、その後のfetchの呼び出しで2行目が返されますが、最初の行は取得されません。

クエリはフェッチを実行してポインタをリセットするので、後続のフェッチでも最初の行が返されますか?もしそうなら、これは不適格ではないのですか?クエリをループして複数の行を取得できるのはなぜですか?収量を使って何らかのコルーチンを実行していますか?さらに、PDOStatementオブジェクトにフェッチされたデータが表示されないのはなぜですか?おそらく彼らは__set_stateと__debugInfoのマジックメソッドを使ってこのデータを隠しています

答えて

4

これはPHP PDO::queryが実際に行うこととは無関係です。しかしむしろPDOStatementは実際には何ですか。そしてそれはan object that supports a Traversable interfaceです、従ってそれはに反復することができます。そして反復されると、内部的にはfetch()と呼ばれています。

クエリが実行されている場合、それは程度は不明である

PDOをフェッチ::クエリがフェッチ実行されることはありません。 PDOStatementは行います。次の行では、簡潔にするために短い構文が使用されています。

foreach ($conn->query($sql) as $row) 

それはforeachとして

$stmt = $conn->query($sql); 
foreach ($stmt as $row) 

のように書くことができますが、結果を反復処理クエリによって返され、もう一度クエリを実行していないと、再び

なぜあなたが見ることができませんPDOStatementオブジェクトのデータを取得しましたか?

このようなデータはありません。

希望しています。

+0

ここにはコルーチンがありません。古い(現在は廃止されている)MySQL関数では、これは実際には少しはっきりしています。 –

+0

MySQLはSELECTを受け取り(実行する)、結果セットを保持します。mysql_fetch_rowを呼び出すたびに、結果セットの次の項目(SQLカーソルのようなもの)をプッシュするようにMySQLに要求されます。 –

+0

@MihaiStancu [この結果セットはPHP側では保留です](https://phpdelusions.net/pdo#mysqlnd)。 –

関連する問題