pdo queryとexecuteの違い


PDO::query(PHP環境下同)とPDOStatement::execute関数はいずれもSELECTクエリー機能を実現できるが、公式ドキュメントではこの設計の初心の説明は見られず、またPDO::exec関数機能も似ている.PDO::query関数の機能がこんなに単一で、exec、executeと重複している以上、なぜ一部の関数の実行方法を再調整せず、1つだけを残したり、2つだけを残したりしないのか、伝統的なプログラマーの習慣に配慮しているのだろうか.次は、この3つの関数を公式に定義します.
PDO::exec — Execute an SQL statement and return the number of affected rows
PDO::query — Executes an SQL statement, returning a result set as a PDOStatement object
PDOStatement::execute — Executes a prepared statement

原文参照:http://www.php.net/manual/en/book.pdo.php
特に注意:PDO::execとPDOStatement::executeは2つの異なる関数であり、前者はPDO::queryの地位と並列であり、後者はPDOStatmentクラスのサブ関数である.
1、PDO::query
PDO::queryはSQL文を実行し、パスした場合はPDOStatementオブジェクトを返します.PDO::query関数には「非常に良い」というものがあります.これは、この返されるレコードセットを直接巡回することができます.
例は次のとおりです.
$sql = 'SELECT name FROM url';
foreach ($dbh->query($sql) as $row) {
    print $row['name'] . "\t";
}

queryは従来のmysql query関数と同様に,開発者が入力したsql文を独自にセキュリティチェックする必要がある.
queryはPDOStamentオブジェクトを返すので、SELECT文の実行に適しているようです.これは、上記のqueryサポートと直接一致しています.
queryが実行されると、次のqueryが実行される前に、返されるレコードセットをすべて取り出さないと、PDOStatement::closeCursor()を呼び出してデータベースリソースとPDOStatementオブジェクトを解放しない限り、queryは失敗します.
原話:If you do not fetch all of the data in a result set before issuing your next call to PDO::query()、your call may fail.Call PDOStatement::closeCursor() to release the database resources associated with the PDOStatement object before issuing your next call to PDO::query().
二、PDO::exec
PDO::execはSQL文を実行し、影響を受けるローの数を返します.この関数は結果セットを返しません.公式提案:
プログラム中に一度しか発行しないSELECT文については,PDO::query()を用いることが考えられる.
複数の文を発行する必要がある場合は、PDO::prepare()を使用して、PDOStatementオブジェクトを準備し、PDOStatement::execute()を使用して文を発行できます.
PDO::execはSELECT/DELELETE/UPDATE/INSERTなどすべてのSQL文の実行をサポートしているので、PDO query()関数よりも強力です.影響を受ける関数のみが返されるため、SELECTを実行するとPDOStatementオブジェクトが得られないため、結果セットを巡回することもできず、公式の推奨に従ってqueryまたはexecute関数しか使用できません.
三、PDOStatement::execute
PDOStatement::execute関数、execute関数は、すでに前処理された文を実行するために使用されますが、実行結果の成功または失敗を返します.つまりexecuteはprepare関数と組み合わせて使用する必要がありますが、これは確かに面倒で、毎回prepareを先にしてからexecができます.したがって、SELECTなどのSQL文を実行する場合は、fetchなどの関数を用いて結果を読み取る必要があります(もちろん、上記のqueryでもfetchなどの関数が使用できます).
executeは、セキュリティの問題を考慮する必要がなく、バインドパラメータをサポートします(バインド時!他の文は自分で考慮する必要があります).例は次のとおりです.
$sth= $dbh->prepare('SELECT name FROM foo WHERE width < :width AND height = :height');
$sth->bindParam(':width', $width);
$sth->bindParam(':height', $height);
$sth->execute();

executeは複数回の実行をサポートし、いくつかの面でパフォーマンスの向上に役立ちます.例は次のとおりです.
$sth = $db->prepare("SELECT * FROM foo WHERE width = ?");
$sth->execute(array(1));
$results = $sth->fetchAll(PDO::FETCH_ASSOC);

$sth->execute(array(2));
$results = $sth->fetchAll(PDO::FETCH_ASSOC);

PDOStatement::executeも強力ですが、PDO::execとは地位が異なり、混同してはいけません.