このコードはユーザーが不正な値を入力した場合、SQLインジェクションという脆弱性を発生させてしまいます。
そういう場合は
- mysqli_prepare 関数を用いてパラメータを疑問符(?)にする
- mysqli_stmt_bind_param 関数を用いてユーザー入力をエスケープする
- mysqli_stmt_execute 関数でSQLを実際に実行する
- mysqli_stmt_bind_result関数を呼び出して実行結果を取得する
- mysqli_stmt_close関数を呼び出してプリペアステートメントを終了
php
1<?php
2
3function insert_cart($link, $user_id, $item_id){
4
5 $date = date("Y/m/d H:i:s");
6
7 $result = null;
8
9 $parameters = [
10 'user_id' => $user_id,
11 'item_id' => $item_id,
12 'amount' => 1,
13 'created_date' => $date
14 ];
15
16 $sql = 'INSERT INTO cart_table SET ';
17 foreach($parameters as $column_name => $value) {
18 $sql .= sprintf('`%d` = ?, ', $column_name);
19 }
20 $sql = preg_replace('/,\s$/', '', $sql);
21
22 if ($stmt = mysqli_prepare($link, $sql)) {
23 foreach(array_values($parameters) as $param) {
24 mysqli_stmt_bind_param($stmt, 's', $param);
25 }
26 mysqli_stmt_execute($stmt);
27 mysqli_stmt_bind_result($stmt, $result);
28 }
29 mysqli_stmt_close($stmt);
30 return $result;
31}
$sql = preg_replace('/,\s$/', '', $sql);
としているのは、ループするとカンマとスペースが入って文字列が生成されるため、それを詰めるための処理です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/11 08:16
2017/11/11 09:20