前提・実現したいこと
SQLインジェクション対策として、変数を直接SQLに埋め込むのではなく、PDOのprepareメソッドを利用して作成したステートメントに値をバインドする形式にする場合、ユーザー定義関数をどのように修正すればいいですか?下記のようにbindValueを用いて表す場合、$stmt->bindValueの部分をユーザー定義関数のどこに追加すればいいのか教えていただきたいです。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
PHP
1 2 3 4function update_item_stock($db, $item_id, $stock){ 5 $sql = " 6 UPDATE 7 items 8 SET 9 stock = {$stock} 10 WHERE 11 item_id = {$item_id} 12 LIMIT 1"; 13 return execute_query($db, $sql); 14} 15 16function execute_query($db, $sql, $params = array()){ 17 try{ 18 $stmt = $db->prepare($sql); 19 return $stmt->execute($params); 20 }catch(PDOException $e){ 21 set_error('更新に失敗しました。'); 22 } 23 return false; 24} 25 26try { 27 $sql = 'UPDATE item_stock 28 SET stock = ?, update_date = ? 29 WHERE item_id = ?'; 30 $stmt = $db->prepare($sql); 31 $stmt->bindValue(1, $update_stock, PDO::PARAM_INT); 32 $stmt->bindValue(2, $date, PDO::PARAM_STR); 33 $stmt->bindValue(3, $item_id, PDO::PARAM_INT); 34 $stmt->execute(); 35 $complete_msg[] = '在庫変更に成功しました。'; 36} catch (PDOException $e) { 37 $err_msg[] = '更新に失敗しました。理由:' . $e->getMessage(); 38}
試したこと
update_item_stock関数の{$stock}と{$item_id}を?に変更して実行してみましたが、「更新に失敗しました。」と表示されました。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー