質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

36363閲覧

prepareとexecuteとqueryの使い分けについて

earnest_gay

総合スコア615

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

4グッド

10クリップ

投稿2016/06/23 05:46

prepareとexecuteとqueryの使い分けについて教えてください。

PHPマニュアルを見ても全然理解できずです。

私の認識では、
prepareとexecuteはセットでINSERTするときに使うとおもっています。

$sql = "INSERT INTO user_data(・・・) VALUES (・・・)" $stmt = $pdo->prepare($sql); $stmt->execute([・・・]);

preparaでsql文をセットする。
そのセットしたsql文をexecuteでバインドしていく。
という認識で大丈夫でしょうか?

queryはSELECTするときに使うと思っています。

$sql = "SELECT id FROM user_data"; $stmt = $pdo->query($sql);

これはネットで見ている限りこういった使い方が多いから
こういうもんなんだなって思っています。

ただ、
こういうもんなんだなって思って使っていて、なぜそれを使わないといけないのか理解してないので

$sql = "INSERT INTO user_data(・・・) VALUES (・・・)" $stmt = $pdo->query($sql); $stmt->execute([・・・]);

とか

$sql = "SELECT id FROM user_data"; $stmt = $pdo->prepare($sql);

とかやったらどうなんだろう?ダメなの?なんで?

ってなっちゃいます。

分かりやすく解説頂けると助かります。
宜しくお願いします。

llwz886q, marumarumarune, nikuatsu, maisumakun👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

prepareとexecuteはセットでINSERTするときに使うとおもっています。

INSERT, UPDATE, SELECT だからということではありません。
SQLに何らかの変数を割り当てしたいときに利用します。

変数の割り当てが必要ないときは query() を利用することもできます。

例えば、

php

1$sql = 'SELECT * FROM table WHERE id = ?';

php

1$sql = 'UPDATE table SET name = ? WHERE id = ?';

php

1$sql = 'INSERT INTO table VALUES (?, ?)';

そのセットしたsql文をexecuteでバインドしていく。

違います。あくまで execute は「実行する」という意味です。
引数に配列を渡したときにあくまで「便利機能」としてバインド「も」やってくれているということです。

投稿2016/06/23 06:24

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2016/06/23 06:37

回答ありがとうございます。 >> execute は「実行する」という意味です。 $sql = "SELECT id FROM user_data"; $stmt = $pdo->query($sql); これでも使えているのですが 本来なら $sql = "SELECT id FROM user_data"; $stmt = $pdo->query($sql); $stmt = $pdo->execute($sql); という風にするのが正しいのでしょうか?
退会済みユーザー

退会済みユーザー

2016/06/23 06:39

execute と query のいずれかを使うということです。 query() は execute()の変数割り当てなしバージョンです。そう書いているんだけど…。
earnest_gay

2016/06/23 06:41

理解できました! ありがとうございます!
earnest_gay

2016/06/23 07:14

execute は「便利機能」としてバインド「も」やってくれているということです。 とのことですが、例えば下記をqueryだけでやろうとしたらどうなるのでしょうか? $stmt = $pdo->prepare("INSERT INTO user_data(email, password) VALUES (?, ?)"); $stmt->execute([ $_SESSION['join1']['email'], password_hash($_SESSION['join1']['pw'],PASSWORD_DEFAULT) ]);
退会済みユーザー

退会済みユーザー

2016/06/23 07:16

やってみればわかることではありません?
guest

0

まず、
INSERTやUPDATEなどのSQL文の違いとprepareとexecuteとqueryの使い分けに関係はありません。

厳密には違う部分もありますが、
ごく大雑把に言うと

  • 変数をSQL文に組み込む必要がある場合はprepareとexecuteを使う。
  • そのほかの場合でも基本的にprepareとexecuteを使えばOK。
  • 固定SQLを実行する場合はqueryを使う

という感じになります。

理由は
プリペアードステートメントとは
で検索して下さいと言ってしまいたくなるのですが、

ざっと説明すると
プリペアードステートメントとはあらかじめ構文を固定化することで
与えられた変数を変数としてのみ評価することで高速に実行するという仕組みで、
その原理上、SQLインジェクション対策としても用いられます。

そのため、変数を組み込むような場合はprepare+executeを行うことによって、
安全かつ高速に(パフォーマンスはケースによる)実行できるというわけです。

逆に、完全に固定的なSQLの場合、例えば

SQL

1SELECT * FROM `any_table`:

みたいなケースだと変数に当たる部分が無いのでqueryでもいいという感じです。

投稿2016/06/23 06:23

tanat

総合スコア18709

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2016/06/23 06:34

変数を使っているかそうでないかの違いだったのですか... 知りませんでした。 今までなんとなく使ってましたがず~~~~っと疑問に思ってました。 $sql = "INSERT INTO user_data(・・・) VALUES (・・・)" のように変数にしてしまってる場合はprepareとexecuteを使い、 変数を使っていないならquery()を使うということですね。 では変数を使わなかった場合はこうなって $stmt = $pdo->query("INSERT INTO user_data(・・・) VALUES (・・・)"); executeの部分はどうなるんです?
tanat

2016/06/23 06:37

$stmt = $pdo->query("INSERT INTO user_data(・・・) VALUES (・・・)"); でSQLは実行されてるので、prepare+executeみたいな効果が発揮されています。 そのため、executeに当たる部分は不要というか存在しません。
earnest_gay

2016/06/23 06:44

queryはqueryだけでいいけど prepareを使うならexecuteもセットということですね! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問