我一直在研究PDO bindValue()。我知道用PDO准备我的SQL句子可以防止SQL注入。 6 _+ f. j! X" ~+ x代码示例:6 p% \" k n8 E7 o- a! m3 _
$stmt = $dbh->prepare('SELECT * FROM articles WHERE id = :id AND title = :title');$stmt->bindValue(':id',PDO:ARAM_INT);$stmt->bindValue(':title',PDO:ARAM_STR);$stmt->execute();通过将ID并且绑定成数字Title当有人试图在代码中进行字符串时,我们可以限制它SQL注入时造成的损坏。; _( G( D+ [+ L T! ^
我们是否应该始终将值与值与值a绑定,PDO:ARAM_可以限制SQL可以从数据库中从注入中提取的内容?所以在执行中PDO时会增加PDO的安全性bindValue()吗?0 ]% V! b& S5 o' y
( E1 ~! k i; p- w0 j+ y解决方案: , s, n+ G/ x. N9 b A. u X 一个有两个问题。重要的是不要混淆它们 ) @) Z0 a C6 ~$ N% V) T& h[ol]是否应该一直使用 占位符 表示查询中的变量数据?2 Y& x. [$ s9 U+ k' p
是否应该一直在 在应用程序代码中 使用某些功能遵循上述规则? + G+ R. e! h9 W! V* F另外,从对职位开头的评论中可以看出第三个问题:我们是应该一直使用第三个参数,还是默认让步?PDO可以将所有参数绑定到字符串中? 9 `* e" ~3 s" F[/ol]1.对于第一个问题,答案是绝对肯定的- 是。在第二篇文章中,出于代码的合理性和DRYness的考虑," W! N8 p! Z! L9 j( J9 k# z
2.尽量避免手动装订。有许多避免手动绑定的方法。他们之中有一些是: ' E/ R! Q( L+ m) L. N7 tORM是简单CRUD优秀的操作解决方案必须在现代应用作解决方案。它将完全隐藏给你SQL,绑定幕后: # h3 a/ v& ?& [) }& b+ M$user = User::model()->findByPk($id);Query Builder在某些方面,这也是一种可行的方法PHP伪装在操作符中SQL,但将绑定隐藏在幕后: 7 Q# `' O, U" s0 R. j$user = $db->select('*')->from('users')->where('id = ?',$id)->fetch();有些抽象库可能会通过 类型提示占位符 处理传输数据,再次隐藏实际绑定:! G- ~) c, [ f* Y
$user = $db->getRow("SELECT * FROM users WHERE id =?i",$id);如果你在上个世纪仍在使用它PHP,原始代码用于整个代码PDO-所以你可以在那里execute()传输变量仍然可以节省大量输入: 7 U' z6 O3 O" f0 t: P2 J- P6 s$stmt = $dbh->prepare('SELECT * FROM users WHERE id = ?');$stmt->execute([$id]); * b- I( O2 K4 q: ^9 n9 ^$user = $stmt->fetch();2 j' u( {7 d( l1 z 关于第三个问题-只要您将数字绑定为字符串(但不是相反!)- + \2 Q7 d ^" v6 Q7 i3. mysql没关系,几乎每个参数都以字符串的形式发送因为mysql你的数据总是被转换成正确的类型。我唯一知道的是LIMIT在这不能将数字格式化为字符串- " ~. p; a4 l. M因此,当设置在模拟模式下时PDO且必须在LIMIT当参数在句子中传输时,唯一相关的情况是。在所有其他情况下,您可以省略第三个参数或显式调用to,bindValue()没有问题。