我正在使用如下的PDO声明
select * from `admine_user` where `user_id` = ? and passw = ?
$resultfm1 = DB::instance()->prepare($query)->execute
(array($escapedid,$hashedpass))->fetchAll();
Run Code Online (Sandbox Code Playgroud)
我在考虑使用
select * from `admine_user` where `user_id` = :user and passw = :pwd
$resultfm1 = DB::instance()->prepare($query)->execute
(array(":user"=>$escapedid,":pwd"=>$hashedpass))->fetchAll();
Run Code Online (Sandbox Code Playgroud)
以上语句中哪些更好用,可以有效防止SQL注入,因为现在我无法使用 mysql_real_escape_string
MySQL仅支持位置参数(?占位符),因此PDO在准备步骤中将命名参数内部转换为位置参数.
事实上,这两种风格最终都与MySQL相同.
此外,"模拟准备"实际上并没有在准备步骤中执行任何操作,它只是保存查询字符串.执行时,您提供值并将它们插入查询中,然后提交给MySQL.如果您不信任此过程,则禁用模拟准备.
这并不是说PDO做任何不安全的事情,尽管早期版本的PDO有一些错误.
只需确保您使用的是当前版本的PDO(基本上是PHP 5.3或更新版本中的任何版本),然后这两种样式都可以安全使用.
尽管我写这篇文章后可能会出现任何回归错误......