$dbh = new PDO("mysql:host=localhost; dbname=demo", "user", "pass");$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //禁用prepared statements的仿真效果$dbh->exec("set names 'utf8'");
$sql="select * from test where name = ? and password = ?";$stmt = $dbh->prepare($sql);
上面这段代码就可以防范sql注入。为什么呢? 当调用 prepare() 时,查询语句已经发送给了数据库服务器,此时只有占位符 ? 发送过去,没有用户提交的数据;当调用到 execute()时,用户提交过来的值才会传送给数据库,他们是分开传送的,两者独立的,SQL***者没有一点机会。
但是我们需要注意的是以下几种情况,PDO并不能帮助你防范SQL注入
1、你不能让占位符 ? 代替一组值,如:
1SELECT * FROM blog WHERE userid IN ( ? ); 2、你不能让占位符代替数据表名或列名,如:
SELECT * FROM blog ORDER BY ?; 3、你不能让占位符 ? 代替任何其他SQL语法,如:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;