Possible Duplicate:
why MySQLi prepared statements?
所以我对准备好的陈述有几个问题。
第一个是,我的朋友告诉我,他们比传统的“Select from*users where s id='$id';”更安全,这是关于数据库接受不同的输入,并且知道它是一个值而不是整个查询,所以,'没有结束查询。
第二,如果使用准备好的语句,是否还必须转义这些值?
第三,准备好的陈述对性能/可靠性有很大影响吗?

最佳答案

转义查询是区分值和命令所必需的:

SELECT * FROM foo WHERE name = 'O'Connor'

语法分析器不容易理解“O'Connor”中的'属于该值,它将把它当作终止字符串。转义有助于解析器区分:
SELECT * FROM foo WHERE name = 'O\'Connor'

准备好的语句分两步发送到数据库:首先是命令,然后是值:
command: SELECT * FROM foo WHERE name = ?
value:   O'Connor

这使得它对于解析器来说是明确的。因此,您不需要转义该值,因为您需要转义该值的唯一原因不再适用。这也是为什么它更安全的原因,因为您永远无法逃避这个值,而fall请求SQL注入。
至于速度,一个查询应该不会有太大变化。如果使用不同的值多次重复使用同一个准备好的查询,将有助于提高性能,因为数据库不需要一次又一次地解析整个查询。
如果您想要更深入的介绍:The Great Escapism (Or: What You Need To Know To Work With Text Within Text)

关于php - 关于准备好的陈述的几个问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9731339/

10-10 10:56