繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM