- 締切済み
query、prepare、executeの違い
query、prepare、executeはどう使い分ければいいですか? 「query」は簡易版で使うメソッドであり、「prepare」と「execute」は詳細版で使うメソッドで大体合っていますか?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- hogehoge78
- ベストアンサー率80% (433/539)
>引数として配列を入れるのはプレースホルダに値をバインドする場合(SQL文に?を使う)ということで合っていますか? 合っています。 他にもバインドする方法はありますが、単純な数値や文字列であれば、この方法で問題ありません。 厳密に型を指定する方法は、PHPマニュアルをご確認ください。 https://www.php.net/manual/ja/pdostatement.bindparam.php
- hogehoge78
- ベストアンサー率80% (433/539)
>executeメソッドを引数なしで使う場合と、引数として配列を入れる場合の違いは何ですか? 「違いが何か」と問われると、そもそも引数の有無でプログラムが違うわけですが。 PDOのprepareメソッドは、プリペアードステートメントを表すオブジェクト「PDOStatement」を返します。 プリペアードステートメントとは、SQL文をコンパイルしたようなもので、代替文字(「?」であるとか「:name」であるとか)を利用してあとから代替文字を置換することができます。 そしてそれを行うには、PDOStatementに実装されているexecuteの引数として配列で渡す必要があります。(そのほかのやり方は、PHPマニュアルをご覧ください。) また、代替文字を使わないでSQL文をプリペアードステートメントにすることもできます。 その場合、置換対象が存在しないわけですので、executeメソッドには引数として配列を渡す必要がありません。 結果、PDOのqueryメソッドを実行するのと変わらない結果となります。 つまり、当初の質問である、「どう使い分ければいいか」という質問に立ち返ると、すべて一貫して、PDOのprepareメソッドをつかってプリペアードステートメントを取得し、プリペアードステートメント(PDOStatement)のexecuteを実行するというのも問題はありません。 例えばデーターベース操作を一括して行うようなユーザ定義関数やユーティリティクラス、サービスなどを作った場合に、SQL文によって使い分けるのは手間なら、prepareしてもよいですし、自分だけが確認すればよいテストコードでSQL文を実行したいのであれば全部queryしてもかまいません。 少なくとも、HTMLフォームなどのような外部から渡されてきた値をSQL文の条件として取り入れなければならない場合は、prepareを利用する必要があることだけ覚えておいていただければよいかなと思います。
- hogehoge78
- ベストアンサー率80% (433/539)
>queryはselect文で使うことが多いという そうですね。queryメソッドは、戻り値が、レコードセットですので、SELECTで使います。 https://www.php.net/manual/ja/pdo.query.php 今回、質問の中に例示されていないメソッドで、「exec」というものがあります。これは、戻り値が、作用したレコードの行数を返すとなっておりますので、INSERT, UPDATE, DELETEなどで使われると思います。(当然、変数を使う場合には、これは非推奨ですので、prepare, executeをご利用ください) https://www.php.net/manual/ja/pdo.exec.php
補足
executeメソッドを引数なしで使う場合と、引数として配列を入れる場合の違いは何ですか?
- hogehoge78
- ベストアンサー率80% (433/539)
最初に回答されている方のものにもう少し例示して回答すると、 ■execute, prepareのありがちな使い方 サイトに複数人の名簿があり、その人の名前のリンクをクリックしたらそのデータを取得したい // 「?」が代替文字 $stmt = $dbh->prepare('SELECT * FROM profiles WHERE name = ?'); // 引数に代替文字を置換する変数を追加する。 // このように書いておけば、GETで飛んできたデータに対応した情報を取り出すことができる。 $stmt->execute(array($_GET['name'])); ■queryのほうのありがちな使い方 サイトのトップに、必ず最新のニュースを5件表示したい場合 $dbh->query('SELECT * FROM news ORDER BY update_at DESC LIMIT 5'); これは必ず最新のものをとればいいので、固定値でSQL文を書いてやればよく、prepareなどはしなくてもよく、簡単。 つまり、取り出したいSQLに変数を使いたいかどうかで切り分ける、ということでよいです。 念のため、prepareの使い方、意味についてはPHPマニュアルの利用例も参照ください。 https://www.php.net/manual/ja/pdo.prepare.php
補足
回答ありがとうございます。 queryはselect文で使うことが多いという ことでしょうか?
- t_ohta
- ベストアンサー率38% (5241/13712)
query は1回毎にSQL文を書いて実行するのに使います。 prepare と execute は同じSQL文で検索条件の値や挿入する値だけを変えながら繰り返し実行する場合に使います。
補足
引数として配列を入れるのはプレースホルダに値をバインドする場合(SQL文に?を使う)ということで合っていますか?