很抱歉,如果标题不是很具描述性,我真的不知道如何简短地说出来。在我的网站上,我有一个充满电子游戏和数据库的数据库表。电子竞技队。当我在URL中显示团队名称时,我会从中删除所有空格。出于这个原因,我需要在搜索时接受名称的无空格版本,以防有人尝试输入他们在URL中找到的名称。
球队名称示例:Los Santos Kings
网址示例:mysite.com/teams/LosSantosKings
搜索查询#1示例:“Los San”(不含引号)
搜索结果示例#1:Los Santos Kings
搜索查询#2示例:“LosSan”(不含引号)
示例搜索结果#1:空 - 返回0行
如果搜索“Los San”,则返回Team的数据库行。但是,如果您搜索“LosSan”,则不会。这种使用SQL的replace()
函数的方法在我测试精确匹配时工作正常,但是当在LIKE查询旁边设置时,它在后一个实例中不起作用。
这是我的问题:
$sql = "SELECT * FROM teams WHERE name LIKE '%{$search}%' OR replace(name, ' ', '') LIKE '%{".str_replace(' ', '', $search)."}%' ORDER BY name ASC"
这是语法错误,还是我需要以另一种方式解决这个问题,可能会对团队名称进行2次单独的查询/检查?
答案 0 :(得分: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"
答案 1 :(得分:1)
你不需要在第二个上花括号。
$sql = "SELECT * FROM teams WHERE name LIKE '%{$search}%' OR replace(name, ' ', '') LIKE '%".str_replace(' ', '', $search)."%' ORDER BY name ASC";