2013-06-12 27 views
2
  1. 是否有任何PDO的替代品,因为在MySQL是mysql_real_escape_string?
  2. 为什么我们应该设置'false' - > ATTR_EMULATE_PREPARES常量?
+0

了解'PDO预处理语句' – Fabio

+3

*您不*使用'mysql_real_escape_string'和预处理语句。阅读[伟大的逃避现实(或:你需要知道如何处理文本中的文本)](http://kunststube.net/escapism/),特别是在最后。 – deceze

+1

您可以在[PHP文档](http://www.php.net/manual/en/pdostatement.execute.php)中找到如何使用参数化查询的示例。有了这些准备好的陈述,你不必自己逃脱任何事情,PDO会照顾它。 – martinstoeckli

回答

0
  1. 你没有在事先准备好的声明中使用mysql_real_escape_string在PDO
  2. 不一定。你可以用任何一种方式

要回答的问题编辑

NO,有没有办法。你应该使用准备好的语句。

+2

2.为什么不准确? – deceze

+0

是什么原因造成的,而不是停用仿真(至少对于较新的数据库版本)?我从来没有深究这个问题的底部,我仍然不确定要使用什么。 – martinstoeckli

+2

难怪因为没有一个答案*应该*使用。或者是可以接受的 –

9

使用mysql扩展,只有这样,才能动态地嵌入值插入查询是:

$query = "SELECT ... WHERE foo = '$bar'"; 

为了避免在最坏的情况下,可以利用如SQL注入语法错误,你需要申请mysql_real_escape_string$bar这里以转义的值正确。如果您不知道这意味着什么,请阅读The Great Escapism (Or: What You Need To Know To Work With Text Within Text)

准备语句提供通过完全分离的查询和所述值,以使用动态值完全不同的方式:

$stmt = $db->prepare('SELECT ... WHERE foo = :bar'); 
$stmt->execute(array(':bar' => $bar)); 

这实际上是发送到数据库作为两个单独的件;语法永远不会被搞砸或被利用,因为这两个部分从来没有实际合并过。

尽管所有数据库都不支持此功能,但有些(旧的)数据库仍然希望使用旧式的未准备好的转义查询。 ATTR_EMULATE_PREPARES给出了选项,好吧,模拟准备好的语句。您仍然可以在代码中使用$db->prepare()->execute() API,但在幕后,PDO将转义该值并将其连接到查询中。要明确禁止PDO执行此操作并强制它使用数据库提供的本地准备语句API,请将ATTR_EMULATE_PREPARES设置为false

如果您的数据库本地支持预处理语句,则应该执行此操作;最近的所有数据库都是这样。如果让PDO模拟预准备语句,则在某些条件下(主要是在人工构建的多字节连接编码情况AFAIK下),SQL注入的可能性仍然很小。

在任何情况下,您都不能使用mysql扩展中的函数和PDO扩展;它不会起作用,因为mysql_real_escape_string需要通过mysql_connect建立单独的数据库连接。

+1

自5.3.6 PDO不会让这个虚构的机会 –

相关问题