• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:pdoについて)

pdoでのバインド方法の違いとは?

このQ&Aのポイント
  • pdoでmysqlを利用する際に、bindValueやbindParamを使用しないで配列でバインドする方法とは、一体何が違うのでしょうか?
  • 配列でのバインドでは、値の型指定ができないという違いがあります。
  • マニュアルを見ても理解しづらいので、詳しい方の解説をお待ちしています。

質問者が選んだベストアンサー

  • ベストアンサー
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.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 句には、数値しか入れてはいけません。文字列型で入れてしまうとエラーになります */

dcx147
質問者

お礼

お返事ありがとうございます。 >executeメソッドでは、データ型を指定できません。全て、文字列として処理されます。 非常にわかりやすい説明でようやく理解できました。明示的に型の指定を必要する場合には bindValueの関数を使ってバインドしてやる必要があるという事ですね! >例えばMySQLでは、limit 句には、数値しか入れてはいけません。文字列型で入れてしまうとエラーになります また、このような事も知らなかったので貴重な情報をいただき本当にありがとうございます。

その他の回答 (2)

noname#243182
noname#243182
回答No.2

ストアドプロシージャの結果を受ける場面では「PDOStatement::bindParam()」が必要となります。データベースへの選択クエリや挿入、更新クエリの場合は「PDOStatement::bindValue()」や「PDOStatement::execute()」で十分と言えそうです。

参考URL:
http://www.php.net/manual/ja/pdo.prepared-statements.php
noname#243182
noname#243182
回答No.1

これは、値をバインドするのか、参照をバインドするのかの違いです。 マニュアルの例ではピンとこないかもしれません。 「$sth->ececute()」の直前で、「$hoge」の値を別の数字(例えば「2」)に変更したとき反映されるのが、参照をバインドする「PDOStatement::bindParam()」です。「PDOStatement::bindValue()」で「$hoge」をバインドした場合は、その時点での値が使われることになります。 それがつまり「PDOStatement::bindParam()」のマニュアルに記載されいる、「PDOStatement::execute() がコールされたときのみ評価されます。」という説明の答えです。

参考URL:
http://www.php.net/manual/ja/pdostatement.bindparam.php
dcx147
質問者

補足

お返事ありがとうございます。なんとなくですがイメージが掴めたような気がします。 bindValueかbindParamで言えば普段使うにはbindParamのほうが良さそうですね。 しかし両者をどちらも使用しないで配列でバインドした時のメリットやデメリットがわかりません。 bindValueかbindParamを使用せず配列でバインドした場合の違いを教えていただけますと幸いです。