dポイントプレゼントキャンペーン実施中!

pdoでmysqlを利用しています。
基本的なところですがbindValueやbindParamを使用しないで配列でバインドする場合の
違いってなんでしょうか?

個人的には型の指定をできるかの違いにしかないように思うのですが・・・

$hoge = 1;
$sth->bindValue(':hoge', $hoge, PDO::PARAM_INT);
$sth->bindParam(':hoge', $hoge, PDO::PARAM_INT);
$sth->execute(array($hoge, 'hoge'));

上記のバインドは全て同じではないのでしょうか?マニュアルを見たのですが、いまいち理解
できないので詳しい方がいらっしゃいましたら宜しくお願いします。

A 回答 (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 句には、数値しか入れてはいけません。文字列型で入れてしまうとエラーになります */
    • good
    • 1
この回答へのお礼

お返事ありがとうございます。
>executeメソッドでは、データ型を指定できません。全て、文字列として処理されます。
非常にわかりやすい説明でようやく理解できました。明示的に型の指定を必要する場合には
bindValueの関数を使ってバインドしてやる必要があるという事ですね!

>例えばMySQLでは、limit 句には、数値しか入れてはいけません。文字列型で入れてしまうとエラーになります
また、このような事も知らなかったので貴重な情報をいただき本当にありがとうございます。

お礼日時:2010/02/09 15:40

ストアドプロシージャの結果を受ける場面では「PDOStatement::bindParam()」が必要となります。

データベースへの選択クエリや挿入、更新クエリの場合は「PDOStatement::bindValue()」や「PDOStatement::execute()」で十分と言えそうです。

参考URL:http://www.php.net/manual/ja/pdo.prepared-statem …
    • good
    • 0

これは、値をバインドするのか、参照をバインドするのかの違いです。


マニュアルの例ではピンとこないかもしれません。

「$sth->ececute()」の直前で、「$hoge」の値を別の数字(例えば「2」)に変更したとき反映されるのが、参照をバインドする「PDOStatement::bindParam()」です。「PDOStatement::bindValue()」で「$hoge」をバインドした場合は、その時点での値が使われることになります。

それがつまり「PDOStatement::bindParam()」のマニュアルに記載されいる、「PDOStatement::execute() がコールされたときのみ評価されます。」という説明の答えです。

参考URL:http://www.php.net/manual/ja/pdostatement.bindpa …

この回答への補足

お返事ありがとうございます。なんとなくですがイメージが掴めたような気がします。
bindValueかbindParamで言えば普段使うにはbindParamのほうが良さそうですね。

しかし両者をどちらも使用しないで配列でバインドした時のメリットやデメリットがわかりません。
bindValueかbindParamを使用せず配列でバインドした場合の違いを教えていただけますと幸いです。

補足日時:2010/02/07 20:27
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!