フルスタックエンジニアのノウハウ
2020.03.19    2020.03.27

query、prepare、executeはどう使い分ける?

query、prepare、executeはどう使い分ける?

こんにちは、徳田 啓です。
Webプログラマー歴20年、【フルスタックエンジニア マスター講座】を運営しています。(生徒数1,800名突破)

今回は、PHPからPDOクラスを使ってデータベースを操作する際の「query、prepare、executeの使い分け」について解説します。

  • ・query、prepareの使い分けがよく分からない
  • ・executeはどんな時に必要なのか?

このような疑問を解消していきます!


この記事の動画版はこちら

チャンネル登録お願いします!



query、prepare、executeって何?


これら3つは、PDOでデータベースを操作する際に使うメソッドです。

PHPからデータベースを操作する手順は以下のようになります。

  • ①データベースに接続する。
  • ②実行したいSQL文をセットする。
  • ③SQLに対してパラメーターをセットする。【任意】
  • ④実際にSQLを実行する。
  • ⑤結果を取得する。【任意】
  • ⑥データーベースから切断する。

これらを実際にソースコードに書く際、「簡易版」と「詳細版」の2つの書き方があります。

簡易版


  • ②③④query

  • 簡易版は「query」を実行するだけで②③④を一気に処理してくれます。


詳細版


  • ②prepare
  • ③bindValue
  • ④execute

  • 詳細版は「②prepare⇒③bindValue⇒④execute」という手順を行う必要があります。

つまり「query」は簡易版で使うメソッド(②③④を一気に処理してくれる)であり、「prepare」と「execute」は詳細版で使うメソッドということです。


なぜ「簡易版」と「詳細版」が存在するのか?


簡易版/詳細版は、実行したいSQL文の中に「変動値」が入るかどうかで使い分けます。

SQL文の中に変動値が入る場合、以下のようにPHPの変数を直接連結してしまうと「SQLインジェクション攻撃」により悪意のあるSQLが実行されてしまう可能性があります。


$sql = "SELECT * FROM user WHERE name='$name'";


そのため、「プレースホルダ」という仕組みを使って、以下のように変動値を安全にSQL文に割り当てるわけですが、


$sql = "SELECT * FROM user WHERE name=:name";


ここで使うのが「prepare」と「bindValue」と「execute」なんです。


プレースホルダについては以下の記事で詳しく解説しています。

関連記事

プレースホルダとは何か?SQLインジェクション攻撃を回避せよ!



使い分けの実例


使い分けは明確です。
SQL文の中に「変動値があるかないか」で使い分けましょう。


変動値がない場合(queryを使う)


例1)

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

例2)

$pdo->query('SET NAMES utf8');



変動値がある場合(prepare、bindValue、executeを使う)


例)

$stmt = $pdo->prepare("SELECT * FROM user WHERE name=:name");
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$stmt->execute();


  • 現場のコツ
  • 実際の開発では、変動値があるSQLがほとんどですので、prepareを使うパターンに慣れておきましょう。


まとめ


  • SQL文に変動値がない場合:query
  • SQL文に変動値がある場合:prepare⇒bindValue⇒execute

このように使い分けましょう!

なお、PHPからデータベースを操作する手順については以下の記事で詳しく解説しています。

関連記事

PHPからデータベースを操作する手順


おすすめ記事
無料メルマガ配信中