はじめに
アドベントカレンダー12/14、14記事目です。
今回は、PHP / Laravel 学習中に触れた
bindValue() の基本と、第3引数あり/なしの動作の違い
について解説します。
PDO を初めて使うと「型を指定する意味ある?」「省略してよいの?」と迷いやすいので、
初学者である自分がつまずきながら整理した内容が、誰かの役に立てば嬉しいです。
環境など
- 執筆者のレベル:初学者
- 使用パソコン:MacBook
- Laravelバージョ:7
bindValue の基本的な使い方
まず、基本形はこちらです。
$stmt->bindValue(':プレースホルダー', $変数, PDO::PARAM_TYPE);
👇役割まとめ
| 引数 | 内容 |
|---|---|
:プレースホルダー |
SQL 内の名前付きパラメータ |
$変数 |
バインドしたい値 |
PDO::PARAM_TYPE(任意) |
データ型を指定する(文字列/整数など) |
第3引数あり・なしで何が違うのか?
1.第3引数を指定する場合(型を明示)
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$stmt->bindValue(':age', $age, PDO::PARAM_INT);
-
PDO::PARAM_STR→ 文字列として扱う -
PDO::PARAM_INT→ 数値として扱う
どんな時に使うのか?
- 型を確実に指定したい時
- 文字列なのに数字と誤認されてほしくない時
- バイナリデータなど扱う時
👇例
$stmt->bindValue(':age', $age, PDO::PARAM_INT);
→ $age が文字列 "25" でも、確実に整数として扱われる。
2. 第3引数なしの場合(自動判断)
$stmt->bindValue(':gender', $gender);
$stmt->bindValue(':mail_address', $mail_address);
→ PDO が値の型を自動で判断してくれる。
-
$gender が 'woman'→ 文字列扱い -
$mail_address が 'aaa@example.com'→ 文字列扱い
省略しても動くことが多いため、
実務でも「よほど理由がなければ省略」しているコードもよく見かけます。
第3引数を指定すべきケース
次のような場面では、明示的に型を指定する方が安全です。
- 数値か文字列かで検索結果が変わる場合
- 厳密に型チェックしたい API・DB を扱う場合
- バイナリ(画像など)を扱う場合
- 型の誤判定でバグが起きると困る処理
例えば、"00123" を「数字として扱うか」「文字列として扱うか」で意味が変わる場合など。
さいごに
今回あらためて bindValue() を調べたことで、
「第3引数は必須ではないけれど、意味がある場面が確かにある」
という点を理解することができました。
今までは「なんとなく動いているからOK」と思いがちでしたが、
PDO が内部でどう値を扱っているかを知ることで、
より安全で意図した動作のコードを書けるようになると感じています。
Laravel や PHP を学んでいると、
小さな疑問から大きな理解につながる瞬間が多いので、
これからも一つ一つ調べながら知識を積み上げていきたいと思います。
この記事が、同じように学習している方の参考になれば幸いです。