抱歉,如果标题不是很有描述性,我真的不知道如何简单地表达。在我的网站上,我有一个数据库表充满了视频游戏& &;电子竞技团队。当我在URL中显示团队名称时,我删除了其中的所有空白。出于这个原因,我需要在搜索时接受名称的无空格版本,以防有人试图键入他们在URL中找到的名称。
球队名称示例:Los Santos Kings
URL示例:mysite.com/teams/LosSantosKings
示例查询#1:"Los San"(不带引号)
示例搜索结果#1:Los Santos Kings
示例查询#2:"LosSan"(不带引号)
示例搜索结果#1:空-返回0行
如果您搜索"Los San",那么它将返回团队的数据库行。然而,如果你搜索"LosSan",它就不会出现。当我测试它的精确匹配时,使用SQL的replace()
函数的这种方法工作得很好,但是当设置在LIKE查询旁边时,它在后一个实例中不起作用。
这是我的查询:
$sql = "SELECT * FROM teams WHERE name LIKE '%{$search}%' OR replace(name, ' ', '') LIKE '%{".str_replace(' ', '', $search)."}%' ORDER BY name ASC"
这是一个语法错误,还是我需要以另一种方式处理这个问题,可能有2个单独的查询/检查团队名称?
你的LIKE
不是问题。就是花括号。当你写了{$search}
,这是因为你已经注入了一个PHP变量到字符串。但是对于str_replace
,无论如何您都要破坏字符串,因此您不应该将其括起来。
这是你的新行:
$sql = "SELECT * FROM teams WHERE name LIKE '%{$search}%' OR replace(name, ' ', '') LIKE '%".str_replace(' ', '', $search)."%' ORDER BY name ASC"
第二个不需要花括号
$sql = "SELECT * FROM teams WHERE name LIKE '%{$search}%' OR replace(name, ' ', '') LIKE '%".str_replace(' ', '', $search)."%' ORDER BY name ASC";