PDOStatement::execute のマニュアルによると、このようなことが記載されています。
プリペアドステートメントを実行します。 プリペアドステートメントがパラメータマーカを含む場合、次のいずれかを行わなければなりません。 (1)パラメータマーカに PHP 変数や値をバインドするためPDOStatement::bindValue() 等をコールする。 (2)あるいは、入力専用のパラメータ値の配列を渡す
(2)はexecuteの引数に値を配列に渡すということですよね?これはバインドされているのでしょうか?
例えば以下のようなコードです。性別、名前、住所を入力してDBにアクセスして検索するシステムです。
PHP
1 $pdo = new PDO($dsn, $user, $password); 2 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 3 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 4 5 $where = []; 6 $data = []; 7 8 if ($sex !== '') { 9 $where[] = '(sex=?)'; 10 $data[] = $sex; 11 } 12 13 if ($name !== '') { 14 $where[] = '(name like ?)'; 15 $data[] = '%' . addcslashes($name, '\_%') . '%'; 16 } 17 18 if ($address !== '') { 19 $where[] = '(address like ?)'; 20 $data[] = '%' . addcslashes($address, '\_%') . '%'; 21 } 22 23 $sql = "select * from member_table"; 24 25 if (count($where) > 0) { 26 $sql .= ' where ' . implode('and', $where); 27 } 28 29 $stm = $pdo->prepare($sql); 30 $stm->execute($data);
このようにbindValue()を使っていなくても、SQLインジェクションの心配はないのでしょうか?
また、LIKE検索する際に、addcslashes($name, '_%')のようにエスケープするより良い方法があれば教えてほしいです。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/17 10:01
2017/10/17 10:05
2017/10/17 10:25