PDOを利用する場合、バインド変数を利用すればSQLインジェクションが防げる。
$sql = "select * from sample_t where col = :col";
$con = new PDO(PDO_DSN, PDO_USER, PDO_PASS);
$stmt = $con->prepare($sql);
$stmt->bindValue(':col', $col, PDO::PARAM_STR);
$stmt->fetch(PDO::FETCH_ASSOC);
しかし、LIKE句を利用する場合、"%"
と"_"
のエスケープはしてくれない。
"#"
をエスケープ句にする独自関数ESCAPE
を定義する。
/**
* LIKE句のエスケープ用
* ESCAPE句の指定すること。
* ESCAPE句の値は'#'で。
*/
function escape_wildcard($s) {
return mb_ereg_replace('([_%#])', '#\1', $s);
}
$col = escape_wildcard($col);
$col = '%' . $col;
$sql = "select * from sample_t where col like :col ESCAPE '#'";
$stmt->bindValue(':col', $col, PDO::PARAM_STR);
$stmt->fetchAll(PDO::FETCH_ASSOC);