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のマジックメソッドを使ってこのデータを隠しています
ここにはコルーチンがありません。古い(現在は廃止されている)MySQL関数では、これは実際には少しはっきりしています。 –
MySQLはSELECTを受け取り(実行する)、結果セットを保持します。mysql_fetch_rowを呼び出すたびに、結果セットの次の項目(SQLカーソルのようなもの)をプッシュするようにMySQLに要求されます。 –
@MihaiStancu [この結果セットはPHP側では保留です](https://phpdelusions.net/pdo#mysqlnd)。 –