抱歉,如果标题描述性不强,我真的不知道如何简短地表达这一点。在我的网站上,我有一个数据库表,里面全是视频游戏和电子竞技团队。当我在 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 变量注入(inject)到字符串中。但是对于 str_replace
,您无论如何都会破坏字符串,因此您不应该将其括起来。
这是你的新行:
$sql = "SELECT * FROM teams WHERE name LIKE '%{$search}%' OR replace(name, ' ', '') LIKE '%".str_replace(' ', '', $search)."%' ORDER BY name ASC"
关于php - SQL 使用 replace() 选择 LIKE 结果和精确结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32276841/