[PHP] PDO::exec,query,executeの違い

今回の記事では、PHPのPDOのexec,query,executeの違いについてまとめたいと思います。

PDO::exec()

PDO::exec

PDO::exec() は、一度の関数コールで SQL 文を実行し、文によって作用した行数を返します。

PDO::exec() は SELECT 文からは結果を返しません。 プログラム中で一度だけ発行が必要になる SELECT 文に対しては、 PDO::query() の発行を検討してください。 複数回発行が必要な文については、PDO::prepare() による PDOStatement オブジェクトの準備と PDOStatement::execute() による文の発行を行ってください。

返り値

PDO::exec() は、発行した SQL ステートメントによって更新もしくは 削除された行数を返します。 1 行も作用しなかった場合、PDO::exec() は 0 を返します。

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()

PDO::query

PDO::query — SQL ステートメントを実行し、結果セットを PDOStatement オブジェクトとして返す。

“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

PDOStatement::execute

PDOStatement::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を使用すると良いのかもしれません。