[英]mysql select record with an escaped quote
我有一个功能,用户可以通过文本字段提取记录搜索。 输入将放入以下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。 我不知道还有什么可能导致这个....
谢谢阅读!
如果\\
字面意思是在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解析器获取它时,第一个\\
escape被删除,数据库将在name
字段中查找Miles O'Brien
- 请注意反斜杠不再存在。
由于您的数据库记录字面上包含Miles O\\'Brien
, 用 \\
嵌入记录,你需要加倍逃避,因此该查询:
SELECT * FROM yourtable WHERE name='Miles O\\'Brien';
同样的事情发生:SQL解析器删除第一层转义,DB现在将搜索Miles O\\'Brien
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.