- 締切済み
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(); }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- t_ohta
- ベストアンサー率38% (5238/13705)
> もしexecute_query関数を修正せずにそのまま使う場合は、update_item_stock関数の{$stock} と {$item_id} の部分を?に変更するだけでOKですか? ダメです。 ? に置き換えた部分にどんな値を入れて欲しいかを execute_query() 関数の第3引数で渡す必要があります。 なので、SQL文の {$stock} と {$item_id} の部分を?に変更した上で、 return execute_query($db, $sql); を return execute_query($db, $sql, array($stock, $item_id)); と変更する必要があります。
- t_ohta
- ベストアンサー率38% (5238/13705)
> $paramsの意味がよく分からないです。 $params は bindValue で ? と置換するためのデータです。
- t_ohta
- ベストアンサー率38% (5238/13705)
function update_item_stock($db, $item_id, $stock){ $sql = "UPDATE items SET stock = ? WHERE item_id = ? LIMIT 1"; $params = array('item_id' => $item_id, 'stock' => $stock); return execute_query($db, $sql, $params); } function execute_query($db, $sql, $params = array()){ try{ $stmt = $db->prepare($sql); $stmt->bindValue(1, $params['stock'], PDO::PARAM_INT); $stmt->bindValue(2, $params['item_id'], PDO::PARAM_INT); return $stmt->execute(); }catch(PDOException $e){ set_error('更新に失敗しました。'); } return false; } って感じかな
補足
{$stock}と {$item_id}を?に変更して実行したら「更新に失敗しました」と表示されました。$paramsの意味がよく分からないです。
補足
もしexecute_query関数を修正せずにそのまま使う場合は、update_item_stock関数の{$stock} と {$item_id} の部分を?に変更するだけでOKですか?