SQLインジェクション対策
SQLインジェクション対策として、変数を直接SQLに埋め込むのではなく、PDOのprepareメソッドを利用して作成したステートメントに値をバインドする形式にする場合、ユーザー定義関数をどのように
修正すればいいですか?
function update_item_stock($db, $item_id, $stock){
$sql = "
UPDATE
items
SET
stock = {$stock}
WHERE
item_id = {$item_id}
LIMIT 1";
return execute_query($db, $sql);
}
function execute_query($db, $sql, $params = array()){
try{
$stmt = $db->prepare($sql);
return $stmt->execute($params);
}catch(PDOException $e){
set_error('更新に失敗しました。');
}
return false;
}
上記のユーザー定義関数を下記のようにbindValueを用いて表す場合、$stmt->bindValueの部分を
上記のどこに追加すればいいですか?
try {
$sql = 'UPDATE item_stock
SET stock = ?, update_date = ?
WHERE item_id = ?';
$stmt = $db->prepare($sql);
$stmt->bindValue(1, $update_stock, PDO::PARAM_INT);
$stmt->bindValue(2, $date, PDO::PARAM_STR);
$stmt->bindValue(3, $item_id, PDO::PARAM_INT);
$stmt->execute();
$complete_msg[] = '在庫変更に成功しました。';
} catch (PDOException $e) {
$err_msg[] = '更新に失敗しました。理由:' . $e->getMessage();
}
補足
すみません、私の書き方がまずかったのですが・・・。 SQLインジェクションを防ぐためにはクォテーション文字はエスケープする必要があると思いますが、今回は質問の意図を明確にするために複文によるSQLインジェクション以外は考慮していません。 複文によるSQLインジェクションという意味では、「;(コロン)」の除去でOKでしょうか?