- ベストアンサー
pdoでのバインド方法の違いとは?
- pdoでmysqlを利用する際に、bindValueやbindParamを使用しないで配列でバインドする方法とは、一体何が違うのでしょうか?
- 配列でのバインドでは、値の型指定ができないという違いがあります。
- マニュアルを見ても理解しづらいので、詳しい方の解説をお待ちしています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
1の補足質問の execute と bindValue の使い分けについて executeメソッドでは、データ型を指定できません。全て、文字列として処理されます。 文字列処理で問題ない時は、executeが楽でしょう。 // 例1 $sql='insert into tablename (columnX, columnZ) values (:hoge,:hg2)'; $sth = $pdo -> prepare($sql); $sth->bindValue(':hoge', $hoge, PDO::PARAM_INT); /* 数値のinsertなら、文字列型でいれても、通常データベース側で数値判定してくれる */ $sth->bindValue(':hg2', null, PDO::PARAM_NULL); /* ''(blank)ではなく null を入れたい時データ型明示必須。 */ // 例2 $sql='select * from tablename limit :hoge'; $sth = $pdo -> prepare($sql); $sth->bindValue(':hoge', $hoge, PDO::PARAM_INT); /* 接続先データベースにも寄るけど、例えばMySQLでは、limit 句には、数値しか入れてはいけません。文字列型で入れてしまうとエラーになります */
その他の回答 (2)
ストアドプロシージャの結果を受ける場面では「PDOStatement::bindParam()」が必要となります。データベースへの選択クエリや挿入、更新クエリの場合は「PDOStatement::bindValue()」や「PDOStatement::execute()」で十分と言えそうです。
これは、値をバインドするのか、参照をバインドするのかの違いです。 マニュアルの例ではピンとこないかもしれません。 「$sth->ececute()」の直前で、「$hoge」の値を別の数字(例えば「2」)に変更したとき反映されるのが、参照をバインドする「PDOStatement::bindParam()」です。「PDOStatement::bindValue()」で「$hoge」をバインドした場合は、その時点での値が使われることになります。 それがつまり「PDOStatement::bindParam()」のマニュアルに記載されいる、「PDOStatement::execute() がコールされたときのみ評価されます。」という説明の答えです。
補足
お返事ありがとうございます。なんとなくですがイメージが掴めたような気がします。 bindValueかbindParamで言えば普段使うにはbindParamのほうが良さそうですね。 しかし両者をどちらも使用しないで配列でバインドした時のメリットやデメリットがわかりません。 bindValueかbindParamを使用せず配列でバインドした場合の違いを教えていただけますと幸いです。
お礼
お返事ありがとうございます。 >executeメソッドでは、データ型を指定できません。全て、文字列として処理されます。 非常にわかりやすい説明でようやく理解できました。明示的に型の指定を必要する場合には bindValueの関数を使ってバインドしてやる必要があるという事ですね! >例えばMySQLでは、limit 句には、数値しか入れてはいけません。文字列型で入れてしまうとエラーになります また、このような事も知らなかったので貴重な情報をいただき本当にありがとうございます。