【发布时间】:2014-09-11 11:25:05
【问题描述】:
在php中,有什么区别,哪个更好,为什么,使用mysqli。
我有一个用真正的转义字符串编写的整个项目,是否有必要转换为面向对象的预处理语句?
【问题讨论】:
-
感谢您的文章,但它没有解释差异
标签: php mysqli sql-injection
在php中,有什么区别,哪个更好,为什么,使用mysqli。
我有一个用真正的转义字符串编写的整个项目,是否有必要转换为面向对象的预处理语句?
【问题讨论】:
标签: php mysqli sql-injection
从程序员的角度来看,手动转义值和 PDO 实现的参数化/准备语句之间的区别在于分离程度、自动化程度和责任转移。
对于*_escape_string,开发人员必须确保所有值:
*_escape_string函数传递*_escape_string 函数仅用于转义字符串文字值。如果开发人员有规律地跟踪每个参数的处理,这可以完美地工作。但它往往会变得更复杂,因此越复杂的语句就越容易出错。
如果只有一个参数缺少适当的处理或处理,则该语句很容易受到 SQL 注入的攻击。老实说,Stack Overflow 上实际上有很多案例表明这种手动技术更容易出错,因为很容易错过上述几点。
与此相反,PDO 通过在语句中仅包含占位符来提供抽象层。参数值单独传递,PDO 负责正确的处理和处理。开发人员所要做的就是使用占位符准备语句,然后使用实际值执行准备好的语句。
现在哪个更好?显然后一种 PDO 变体,因为它更不容易出错并且更干净。开发人员需要考虑和处理的事情更少,因为现在由 PDO 完成。
【讨论】:
*_escape_string 函数并不神奇。他们只是转义了某些在字符串文字中很关键的字符。例如,mysql_real_escape_string 转义字符 NULL (\0)、LINE FEED (\n)、回车 (\r)、反斜杠 (\)、撇号 (')、引号 (@ 987654333@) 和替代 (\x1a)。其中一些在 MySQL string literals 中很关键,因为它们表示字符串文字的结尾或引入了转义序列。