- 是否有任何PDO的替代品,因为在MySQL是mysql_real_escape_string?
- 为什么我们应该设置'false' - > ATTR_EMULATE_PREPARES常量?
回答
- 你没有在事先准备好的声明中使用mysql_real_escape_string在PDO
- 不一定。你可以用任何一种方式
要回答的问题编辑
NO,有没有办法。你应该使用准备好的语句。
2.为什么不准确? – deceze
是什么原因造成的,而不是停用仿真(至少对于较新的数据库版本)?我从来没有深究这个问题的底部,我仍然不确定要使用什么。 – martinstoeckli
难怪因为没有一个答案*应该*使用。或者是可以接受的 –
使用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
建立单独的数据库连接。
自5.3.6 PDO不会让这个虚构的机会 –
- 1. 为什么不能禁用PDO :: ATTR_EMULATE_PREPARES?
- 2. PDO MySQL:是否使用PDO :: ATTR_EMULATE_PREPARES?
- 3. PDO :: ATTR_EMULATE_PREPARES问题
- 4. PDO :: ATTR_EMULATE_PREPARES =>假
- 5. 什么是PDO,我为什么要使用它?
- 6. mysql_real_escape_string与PDO PHP
- 7. 我为什么要在我的应用程序中使用PDO?
- 8. 为什么在需要之前选择?
- 9. 什么是... mysql_real_escape_string?危险吗?
- 10. PHP:为什么我的PDO选择不起作用?
- 11. 为什么我的mysql_real_escape_string不起作用?
- 12. 受PostgreSQL中ATTR_EMULATE_PREPARES影响的PDO异常
- 13. 为什么mysql_real_escape_string()不应该避免任何SQL注入?
- 14. PDO选择什么都不返回
- 15. PHP从mysql_real_escape_string改为PDO的表名
- 16. 使用PHP,为什么选择的选项不总是工作?
- 17. PDO mysql_real_escape_string如何在准备好的陈述中使用
- 18. 为什么在mysql_real_escape_string中有资源?
- 19. PDO :: FETCH_ASSOC什么是PDO :: FETCH_ARRAY?
- 20. 为什么选择菜单需要window.location?
- 21. 将PDO :: ATTR_EMULATE_PREPARES设置为false不起作用
- 22. 在$ PDO_OPTIONS中将PDO :: ATTR_EMULATE_PREPARES设置为False时出错
- 23. PDO :: ATTR_EMULATE_PREPARES(多种绑定和限制)
- 24. 错误处理对于PDO :: ATTR_EMULATE_PREPARES =>假
- 25. 如何在ATTR_EMULATE_PREPARES关闭时模拟PDO中的DEFAULT参数?
- 26. aosp's lunch combos的含义是什么?我需要选择什么?
- 27. 为什么在SQL查询中使用Prepard Statements/mysql_real_escape_string
- 28. 要选择什么版本?
- 29. 为什么要检查mysql_real_escape_string()的返回值
- 30. 未调用UISwipeGestureRecognizer选择器。任何想法为什么?
了解'PDO预处理语句' – Fabio
*您不*使用'mysql_real_escape_string'和预处理语句。阅读[伟大的逃避现实(或:你需要知道如何处理文本中的文本)](http://kunststube.net/escapism/),特别是在最后。 – deceze
您可以在[PHP文档](http://www.php.net/manual/en/pdostatement.execute.php)中找到如何使用参数化查询的示例。有了这些准备好的陈述,你不必自己逃脱任何事情,PDO会照顾它。 – martinstoeckli