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'));
上記のバインドは全て同じではないのでしょうか?マニュアルを見たのですが、いまいち理解
できないので詳しい方がいらっしゃいましたら宜しくお願いします。
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 句には、数値しか入れてはいけません。文字列型で入れてしまうとエラーになります */
お返事ありがとうございます。
>executeメソッドでは、データ型を指定できません。全て、文字列として処理されます。
非常にわかりやすい説明でようやく理解できました。明示的に型の指定を必要する場合には
bindValueの関数を使ってバインドしてやる必要があるという事ですね!
>例えばMySQLでは、limit 句には、数値しか入れてはいけません。文字列型で入れてしまうとエラーになります
また、このような事も知らなかったので貴重な情報をいただき本当にありがとうございます。
No.2
- 回答日時:
ストアドプロシージャの結果を受ける場面では「PDOStatement::bindParam()」が必要となります。
データベースへの選択クエリや挿入、更新クエリの場合は「PDOStatement::bindValue()」や「PDOStatement::execute()」で十分と言えそうです。参考URL:http://www.php.net/manual/ja/pdo.prepared-statem …
No.1
- 回答日時:
これは、値をバインドするのか、参照をバインドするのかの違いです。
マニュアルの例ではピンとこないかもしれません。
「$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を使用せず配列でバインドした場合の違いを教えていただけますと幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- HTML・CSS 全部のアクセスを指定したページに転送させたい 2 2022/06/28 16:33
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- XML XML同じ名前の要素を自動で集約するツール 1 2022/04/11 09:21
- JavaScript JavaScriptで「〇以上▲まで」の書き方 1 2022/07/20 14:44
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- JavaScript javascriptで文字分割は、 split() などメソッド不要??? 4 2023/02/06 22:50
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- その他(プログラミング・Web制作) pythonのcondaコマンドの仕様について 2 2022/06/24 00:13
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
エラーの理由が分りません。Pri...
-
可変変数にアロー演算子を使いたい
-
既存関数の上書き
-
VB.NETからVBAマクロ(引数)を呼...
-
特定日時の○○秒後の日時をだしたい
-
CSVファイルをブラウザのキャッ...
-
Dosブロンプトでtabを出力したい
-
DTOとEntityの差は何ですか。
-
Yahoo! JAPAN IDを新規取得でき...
-
switch()文で値の大小比較
-
「取得先」という表現について
-
wordの差し込み印刷で文字...
-
小数点以下0の非表示
-
ログインしたら他からログイン...
-
【C#】DataGridViewの最大列数...
-
オブジェクトの中身の判定(PHP)
-
syntax error, unexpected 'ech...
-
php 入力画面から確認表示画面...
-
excel access連携 このテーブル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
エラーの理由が分りません。Pri...
-
可変変数にアロー演算子を使いたい
-
VB.NETからVBAマクロ(引数)を呼...
-
PHP、ヒアドキュメント内でのIF...
-
VB.NETSystem.Xml 要素数を得る...
-
どういうプログラムを関数化を...
-
vb作成したらでbeep音が鳴りま...
-
次のhtml・cssでspan内の文字を...
-
既存関数の上書き
-
classの再定義エラーについて
-
protectedなのにアクセスできな...
-
UNIX CP "で上書きしません"
-
PHPでの画像の形式の変換
-
配列の操作時にLNK2001外部シン...
-
Let's Encryptで自動更新がされ...
-
ExcelVBAで部分一致(*)をしたい
-
PHPプログラム上で「URLを直接...
-
VB6のコンボボックスのテキスト...
-
ASPのResponse.WriteをPHPでは...
おすすめ情報