带有转义引用的mysql选择记录

时间:2014-05-11 02:24:10

标签: php mysql quotes mysql-real-escape-string

我有一个功能,用户可以通过文本字段提取记录搜索。输入将放入以下SQL查询中:

$db->query("Select * from users where name = '".$db->real_escape_string($posted_var)."' limit 1");

$ db是一个mysqli连接对象

工作完美,直到我有一个'在名称中..然后用户需要手动转义引号以使其匹配........不应该为我做那个real_escape_string()函数?

我有一个测试记录,其中名称是数据库中的“test \'string”。

$posted_var = "test'string"; // no match 
$posted_var = "test\'string"; // match

任何人都知道为什么real_escape_string()不会添加反斜杠?

MySQL服务器和这个特定的表都是utf8_unicode_ci。我不知道还有什么可能导致这个....

感谢阅读!

1 个答案:

答案 0 :(得分:2)

如果\确实位于db记录中的文本内,则需要

$sql = "SELECT .... name='foo\\bar'";
                             ^^---double escaped

第一个\将被DB的sql解析器剥离。然后剩余的foo\bar将用于字段搜索。


评论跟进:您不了解转义的目的:

$name = "Miles O'Brien";
$sql = "SELECT * FROM yourtable WHERE name='" . $db->real_escape_string($name) . "';";

这将产生:

SELECT * FROM yourtable WHERE name='Miles O\'Brien';

这就是字面上发送到数据库引擎的内容。当SQL解析器获取它时,第一个\转义被删除,数据库将在Miles O'Brien字段中查找name - 请注意反斜杠不再存在。

由于您的数据库记录字面上包含Miles O\'Brien WITH 记录中嵌入的\,您需要双重转义,因此查询变为:

SELECT * FROM yourtable WHERE name='Miles O\\'Brien';

同样的事情发生:SQL解析器删除第一层转义,DB现在将搜索Miles O\'Brien