今回の記事では、PHPのPDOのexec,query,executeの違いについてまとめたいと思います。
Contents
PDO::exec()
PDO::exec() は SELECT 文からは結果を返しません。 プログラム中で一度だけ発行が必要になる SELECT 文に対しては、 PDO::query() の発行を検討してください。 複数回発行が必要な文については、PDO::prepare() による PDOStatement オブジェクトの準備と PDOStatement::execute() による文の発行を行ってください。
返り値
PDO::exec()の例
<?php $dbh = new PDO('odbc:sample', 'db2inst1', 'ibmdb2'); /* FRUIT テーブルから全ての行を削除する */ $count = $dbh->exec("DELETE FROM fruit WHERE colour = 'red'"); /* 削除された行数を返す */ print("Deleted $count rows.\n"); ?>
上記の結果は、「Deleted 1 rows.」となります。
PDO::query()
“select”などで、返ってきたデータを活用する場合には、
“exec”は使えないので、こっちを使う。
また、複数回発行する必要があるステートメントの場合、 PDO::prepare() で PDOStatement ステートメントを準備し、 PDOStatement::execute() でそのステートメントを 複数回発行する方がより良いパフォーマンスを得られると実感するでしょう。
PDO::executeとの大きな違いは、以下の点です。
プリペアドステートメントを実行することができない点です。
よって速度を考えて複数回発行する必要があるステートメントやプリペアスドステートメントを使用す流す場合は、PDO::prepare()を使用することになります。
PDO::query()の例
$sql = 'select id, name from shouhin'; $stmt = $dbh->query($sql); $result = $stmt->fetch(PDO::FETCH_ASSOC);
PDO::execute
PDO::executeの例
<?php /* 変数や値のバインドを伴うプリペアドステートメントの実行 */ $calories = 150; $colour = 'gre'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour LIKE :colour'); $sth->bindParam(':calories', $calories, PDO::PARAM_INT); $sth->bindValue(':colour', "%{$colour}%"); $sth->execute();
プリペアドステートメント使用して実行しているのが、確認できると思います。
まとめ
結果セットを返さない1回限りの非プリペアドステートメントを発行する場合は、PDO::exec()を、結果セットを返す1回限りのプリペアドステートメントを発行します場合は、PDO::queryを複数の結果セットを返すプリペアドステートメントを実行する場合は、PDO::executeを使用すると良いのかもしれません。