bindValueを省略しない書き方
prepareメソッドは変動値を持つSQLを実行したいときに使うメソッド。
基本的な流れは
変動値にプレースホルダーを持たせてprepareメソッドを記述
↓
prepareメソッドの返り値のPDOExeptionの中にあるbindValueメソッドで、
設定しているプレースホルダーに割り当てたい値、$PDOデータ型定数を設定する
↓
executeで実行する
↓
fetchで実行結果の返り値を取得
$sql = 'select * from contacts where id = :id';
$stmt = $pdo->prepare($sql);
$stmt->bindValue('id', 3, PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetchAll();
bindValueを省略する書き方
基本的な流れは
変動値にプレースホルダーを持たせてprepareメソッドを記述
↓
bindValueを使わない代わりに、exectueメソッドにarray型の引数をもたせる
↓
fetchで実行結果の返り値を取得
$params = [
'id' => null,
'your_name' => '追加名前4',
'email' => 'params@udemy2.com',
'url' => 'http://params2.com',
'gender' => '0',
'age' => '3',
'contact' => 'ダミーテキスト4',
'created_at' => null
];
$count = 0;
$colums = '';
$values = '';
foreach(array_keys($params) as $key){
if($count++>0){
$colums .= ',';
$values .= ',';
}
$colums .= $key;
// 名前付きプレースホルダー
$values .= ':'.$key;
}
$sql = "insert into contacts ($colums) values ($values)";
$stmt = $pdo->prepare($sql);
// bindValueを使わない代わりに、exectueメソッドにarray型の引数をもたせる
$stmt->execute($params);
/*
bindValueを省略しないバージョン
*/
// $stmt = $pdo->prepare($sql);
// $stmt->bindValue(':id',$params["id"],PDO::PARAM_INT);
// $stmt->bindValue(':your_name',$params["your_name"],PDO::PARAM_STR);
// $stmt->bindValue(':email',$params["email"],PDO::PARAM_STR);
// $stmt->bindValue(':url',$params["url"],PDO::PARAM_STR);
// $stmt->bindValue(':gender',$params["gender"],PDO::PARAM_INT);
// $stmt->bindValue(':age',$params["age"],PDO::PARAM_INT);
// $stmt->bindValue(':contact',$params["contact"],PDO::PARAM_STR);
// $stmt->bindValue(':created_at',$params["created_at"],PDO::PARAM_STR);
// $stmt->execute();
bindValueを省略しないバージョンは記述量がとてつもなく長くなる・・・
変動値が複数ある場合にはbindValueを使わない記述の方が見やすくて良い感じ!
ただ、bindValueを使わないことで$PDOデータ型変数が指定できないことがデメリットみたいだなあ