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();
}
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
No.2の回答の補足について
execute_query を変えず bindValue を使わない方式ならば
* {$stock} を :stock の名前付きプレースホルダに変更
* $params に [ ":stock" => 値 ] 形式の連想配列を渡す
の二点の変更となります。
疑問符のプレースホルダは間違いえやすいので避けるべきかと。
ただし、
PDOStatement::execute の取説に明記してある通り、
パラメータ値は全て PDO::PARAM_STR として扱われてしまい、
場合によっては不具合がおきるので、お勧めできません。
例) MySQL の LIMIT 句の値は整数型でないとエラー発生
No.5
- 回答日時:
NO.4です。
ごめんなさい、投稿ミスりました。
訂正
↓
$params = array();
$params[] = array('value' => $item_id, 'type' => PDO::PARAM_INT);
$params[] = array('value' => $stock, 'type' => PDO::PARAM_INT);
とかして、
foreach($params AS $key => $param){
$stmt->bindValue($key, $param['value'],$param['type']);
}
とかですかね。
No.4
- 回答日時:
回答ありがとうございます。
update_item_stock関数に$params = array();
$params[] = array('value' => $item_id, 'type' => PDO::PARAM_INT);
$params[] = array('value' => $stock, 'type' => PDO::PARAM_INT);
とかして、
foreach($params AS $key => $param){
$stmt->bindValue($key, $params[$key]['value'],$params[$key]['type']);
}
とかですかね。
No.3
- 回答日時:
プレースホルダーを名前付きにしないと、仮に同じ値を設定したい箇所が複数あったとき、その数分、同じ値を設定しなければなりませんので不便です。
Name,Value,Typeというプロパティを持ったクラス、もしくは連想配列を設けて、そこにパラメーターの情報を設定し、それを複数有する配列をexecute_queryに渡す。
prepareの後に、配列の個数分、パラメーターをバインドするとかすればいいのでは。
No.2
- 回答日時:
取説の「例1 名前付けされたプレースホルダを用いてプリペアドステートメントを実行する」が参考になります
https://www.php.net/manual/ja/pdostatement.execu …
# SQL に名前付きプレースホルダを埋め込む
$sql = " ... WHERE stock = :stock ... ";
# パラメータ値を決める
execute_query($db, $sql, [ ':stock' => $stock ]);
# パラメータ値を結び付けて SQL を実行する
foreach ($params as $k => $v) {
_ $stmt->bindValue($k, $v, 明示的な型の指定);
}
$stmt->execute();
No.1
- 回答日時:
↓ここに追加すればいいんでないかと思います。
function execute_query($db, $sql, $params = array()){
try{
$stmt = $db->prepare($sql);
<ここ>
return $stmt->execute($params);
}catch(PDOException $e){
set_error('更新に失敗しました。');
}
return false;
}
{$stock}だとか {$item_id}は『?』にして、$paramでexecute_query()に渡してやる感じになると思いますけど。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- MySQL SQLで日付別のIDを生成するには 3 2022/10/09 10:34
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JAVA SQLServerException 列名 ...
-
ResultSetインターフェイスでの...
-
MySQLのINSERT時にたまに重複に...
-
phpでforeach ($stmt as $row)...
-
データベースに存在するデータ...
-
VB.NET エラーになる箇...
-
PHP初心者です。syntax error, ...
-
Q&Aサイトを作成していてURLの...
-
PDOを使って複数キーワード検索...
-
<VB.NET>INSERT文でDBにデータ...
-
PHP + MySQLを使用して詳細画面...
-
MySQLでデータベースにデータin...
-
VBAをつかってクエリの情報を抽...
-
テーブルに入っているデータと...
-
PHP 10件表示 "前へ" "次へ"
-
dbに登録したデータをphpのプル...
-
実行時エラー3131 FROM 句の構...
-
PHPで[]の使い方について
-
エラー3011
-
PHPでフォームからデータDBに書...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JAVA SQLServerException 列名 ...
-
Q&Aサイトを作成していてURLの...
-
<VB.NET>INSERT文でDBにデータ...
-
insert1つの処理でもトランザ...
-
Pro*Cの構文エラー
-
ResultSetインターフェイスでの...
-
データベースに存在するデータ...
-
PHP&MySQLでの文字列+数列の一...
-
VBA ACCESS SQL...
-
phpで複数の検索語を検索対象に...
-
MySQLのINSERT時にたまに重複に...
-
PHP+PDO+MYSQL で実行されたSQ...
-
C# で発生したException.Messag...
-
like検索の複数キーワードで、...
-
INSERT,DELETEを同時に
-
PHPのUndefined index や varia...
-
VB.NET エラーになる箇...
-
php postgres Insert と updat...
-
配列をループさせてUPDATE
-
C#でDBの特定列をUpdate
おすすめ情報
回答ありがとうございます。 update_item_stock関数に$params = array('item_id' => $item_id, 'stock' => $stock);を追加して、?に変更しました。
$stmt->bindValue(1, $params['stock'], PDO::PARAM_INT);
$stmt->bindValue(2, $params['item_id'], PDO::PARAM_INT);
$params['stock']と$params['item_id']を一般化した形に直すことは可能でしょうか?
execute_query関数を修正しない場合は、update_item_stock関数の{$stock} と {$item_id} の部分を?に変更するだけでOKですか?
もしexecute_query関数を修正せずにそのまま使う場合は、update_item_stock関数の{$stock} と {$item_id} の部分を?に変更するだけでOKですか?