我对放入数据库的东西使用mysql_real_escape_string,因此像Bob's Shop
这样的东西会变成Bob\'s Shop
。并且,例如,如果我尝试选择包含Bob\'s
的所有条目,我的select语句如下所示:
SELECT * FROM tbl WHERE name LIKE '%Bob\\\'s%'
无论出于何种原因,它都不起作用,即使它完全可以理解它会起作用。
答案 0 :(得分:1)
如果撇号由mysql_real_escape_string
函数转义,则在DB中输入的值将不包括反斜杠,仅出于安全目的。因此,数据库中的最终值应为Bob's
。这就像在引号中包含的字符串中转义相同的引号,例如"double \"quotes\""
和'single \'quotes\''
。
您是否尝试按原样查询%Bob\'s%
? 名称列的数据类型是什么?我无法复制您的问题,它与您和我的示例一起使用。
答案 1 :(得分:0)
我修好了(感谢Michael向我展示了如何)。我正在发布我所做的事情以防其他人遇到这个问题。
从来没有弄清楚如何在LIKE中正确放置转义字符,但问题是我启用了魔术引号,所以每当我使用mysql_real_escape_string时,它都会添加额外的转义字符,这样它就不会被存储为Bob的,而是存储为Bob的。这是禁用魔术引号的文档:http://www.php.net/manual/en/security.magicquotes.disabling.php
对我来说,将php_flag magic_quotes_gpc Off
或php_value magic_quotes_gpc Off
放在.htaccess中是行不通的,因为我使用的是购买的主机,主机不允许这样的设置。所以我将magic_quotes_gpc = Off
放在一个名为php.ini的文件中,并将其放在我需要的每个目录中。
由于我的MySQL数据库中已有很多行包含额外的反斜杠,因此当我关闭魔术引号时,我需要摆脱它们。您可以通过发出如下查询来轻松完成此操作:UPDATE tbl SET col=REPLACE(col,'\\\'','\'') WHERE col LIKE '%\'%'
将tbl替换为您的表名,将col替换为您正在使用的任何列。如果您需要修复其他转义字符,只需更改REPLACE和LIKE即可。可能有更好的代码可以一举完成所有列和所有转义字符,但出于我的目的,我不需要它。
答案 2 :(得分:-1)
嗨,我认为这可以帮助你学习mySQL和Java,
在Java中
char quotes ='"';
String sql =" SELECT * FROM tb1 where name LIKE "+quotes+"%Bob's%"+quotes+" ;";
mySQL查询
SELECT * FROM tbl WHERE name LIKE "%Bob's%"