Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用LIKE和撇号的Mysql查询问题_Php_Mysql_Database - Fatal编程技术网

Php 使用LIKE和撇号的Mysql查询问题

Php 使用LIKE和撇号的Mysql查询问题,php,mysql,database,Php,Mysql,Database,所以我有一个有趣的问题,我从来没有遇到过,似乎找不到关于纠正这个问题的很多信息。我有一个巨大的数据库,里面有大量的数据(10年的价值),并试图通过它进行搜索 现在搜索功能很好,但最近有人提醒我注意一个“bug”,如果你愿意的话。我试着费劲地拍摄它以获得预期的结果,但没有效果 这是我的问题: 当有人在搜索中使用撇号时,并不是搜索出错,而是搜索不返回结果。例如,当搜索Pete的时,查询执行,但不返回任何结果。是的,我确保查询包含mysql\u real\u escape\u string(),以便P

所以我有一个有趣的问题,我从来没有遇到过,似乎找不到关于纠正这个问题的很多信息。我有一个巨大的数据库,里面有大量的数据(10年的价值),并试图通过它进行搜索

现在搜索功能很好,但最近有人提醒我注意一个“bug”,如果你愿意的话。我试着费劲地拍摄它以获得预期的结果,但没有效果

这是我的问题:

当有人在搜索中使用撇号时,并不是搜索出错,而是搜索不返回结果。例如,当搜索Pete的时,查询执行,但不返回任何结果。是的,我确保查询包含mysql\u real\u escape\u string(),以便
Pete的
变成
Pete的

即使当我尝试使用phpmysql的搜索功能查询它时,我也会得到奇怪的结果。查询的目的如下:

SELECT * FROM  `smd_article` WHERE  `copy` LIKE  '%Pete\'s%'
但当我在phpmyadmin中使用搜索功能时,它会给我:

SELECT * FROM  `smd_article` WHERE  `copy` LIKE  '%Pete''s%'
当我在sql选项卡中实际键入查询时,它仍然不会返回任何结果。但是,当我只使用Pete时,会返回17K条记录,而当我只使用Pete时,会返回3k条记录


因此,我很好奇我做错了什么,或者遗漏了什么,以便在使用LIKE语句的查询中允许撇号。想法?

试试看
mysql\u real\u escape\u string

LIKE '%" . mysql_real_escape_string($find) . "%' 

或者,如果您正在使用pdo,您也可以这样做

$search ='Pete\'s'
$stmt = $db->prepare("SELECT * FROM  `smd_article` WHERE  `copy` LIKE ?");
$stmt->bindValue(1, "%$search%", PDO::PARAM_STR);
$stmt->execute();

问题不在于
单引号。你逃对了。(作为phpmyadmin中的搜索功能):

字符串:皮特的

MySQL:“皮特的”

因此,下面的查询将起作用。(我已经测试过了)

您还可以查看语句中的

SELECT *
FROM `smd_article`
WHERE copy
IN (
 'Pete', 'Pete''s'
)

离题了,但值得一提的是,像这样的通配符查询是查询数据库最慢的方式。我可以选择一张小桌子,但如果你有一张中等大小的桌子,它真的可以让事情变慢。请注意,数据库中存储了什么?是皮特的还是皮特的?如果它是Pete的
,那就意味着你允许使用”,换句话说,你的代码是可以被sql注入攻击的。我从没想过只看一下原始数据。现在我知道了,我明白了问题所在。标题有:皮特';在内容上,Pete;嗯。我讨厌这个网站的编辑只是复制粘贴contentOP提到的他使用的是
mysql\u real\u escape\u string
。另外,将Pete的存储在数据库中并不意味着SQL注入。@MrTechie我已经用示例数据测试了查询,结果成功了。引用的转义不是问题所在。一定是另一个问题
SELECT *
FROM `smd_article`
WHERE copy
LIKE '%Pete''s%'
SELECT *
FROM `smd_article`
WHERE copy
IN (
 'Pete', 'Pete''s'
)