#PDOのprepareメソッドでSQL文を実行する手順
①DBに接続
②実行したいSQL文をprepareメソッドにセット
③bindValueメソッドを実行して、SQLにパラメーターをセット
④executeメソッドで実際にSQLを実行
⑤返り値を取得
#prepareメソッドとは
変動値を含むSQL文を実行するのに使うPDOクラス内のメソッド。
変動値を含むため、悪意のあるユーザーが変動値を入力する箇所に攻撃をしてきても大丈夫なようにSQLインジェクション対策としてプレースホルダを使って安全にSQL文を割り当てる必要がある。
プレースホルダーの書き方は、変数が入る箇所に「?」または「:(任意の名前)」をつければOK!
$sql = 'select * from contacts where id = ?'; //疑問符プレースホルダー
$sql = 'select * from contacts where id = :id'; //名前付きプレースホルダー
#bindValueメソッドとは
・・・そもそもバインドって何?
→バインド(bind)とは何かを割り当てるという意味
そのため、bindValue=割り当てられた値となるので、この場合ではbindValueは変動値のことを表す。
//名前付きプレースホルダーの場合
bindValue (指定した任意の名前(:id), 割り当てたい値 [, $PDOデータ型定数] )
//疑問符プレースホルダーの場合
bindValue (1(何個目の「?」か), 割り当てたい値 [, $PDOデータ型定数] )
$PDOデータ型定数(PHPマニュアル)
https://www.php.net/manual/ja/pdo.constants.php
デフォルト値はPDO::PARAM_STR
#executeメソッドとは
executeを直訳すると実行するという意味。
PODクラスのprepareメソッドを使ったSQLを実行するにはexecuteメソッドを使って実行する必要がある。
*queryメソッドは実行までしてくれるメソッドになるため、executeメソッドを使う必要はない!
$sql = 'select * from contacts where id = :id';
$stmt = $pdo->prepare($sql);
$stmt->bindValue('id', 3, PDO::PARAM_INT);
$stmt->execute(); //ここで初めてSQLが実行される
$result = $stmt->fetchAll(); //返り値を取得
#結論
変動値がある場合、prepare⇒bindValue⇒executeでSQL文が実行できる