我有一个功能,用户可以通过文本字段提取记录搜索。输入将放入以下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。我不知道还有什么可能导致这个....
感谢阅读!
答案 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
。