MySQL LIKE问题

时间:2010-01-16 16:28:50

标签: php mysql

我有一个脚本:

$friendnotes = mysql_query("SELECT nid,user,subject,message FROM friendnote 
WHERE tousers LIKE '%$userinfo[username]%' ");

数据库“tousers”表中的内容:

Test 
Example 
User

该脚本似乎运作良好

但是,如果有一个名为“Test2”的用户,它还会显示数据库中包含“Test2”的内容,其中$ userinfo [用户名]只是“测试”

有没有办法解决这个问题?例如(这只是一个例子,我不介意你换另一种方式)让它搜索整行?

编辑:我认为没有人理解,“tousers”表包含多个值(按行分隔)而不仅仅是一个,我希望它搜索每个LINE(或任何类似的工作) ),而不是行

6 个答案:

答案 0 :(得分:2)

条件

tousers LIKE '%Test%'

表示touser在某些时候包含“Test”,因此对于“Test”,“MyTest”,“Test3”,“MyTest3”等都是如此。

如果您只想匹配当前用户,请尝试

... WHERE tousers = '$userinfo[username]'

编辑如果你真的想在一个列中存储多个名称(由换行符分隔),你可以使用像

这样的REGEXP模式
WHERE tousers REGEXP '(^|\\n)($userinfo[username])($|\\n)'

请注意确保$userinfo[username]不包含任何类似正则表达式的字符('$','^','|','('等)。另外(如上所述)上面的评论)这个解决方案在安全性/性能/等方面是次优的:最好对friendnote表和某个friendnotes_user表之间的1:n关系进行建模......

答案 1 :(得分:1)

如果删除允许模式匹配的%符号,这将有效。

$friendnotes = mysql_query("SELECT nid,user,subject,message FROM friendnote 
WHERE tousers LIKE '$userinfo[username]' ");

但共识似乎是使用equals会更快。 See https://stackoverflow.com/questions/543580/equals-vs-like

所以在那种情况下,改为

$friendnotes = mysql_query("SELECT nid,user,subject,message FROM friendnote 
WHERE tousers = '$userinfo[username]' ");

修改 - 关于您的修改,这不是一个非常好的设计。如果用户可以有多个“tousers”(即一对多关系),则应将其表示为单独的表tousers,其中每行代表一个“touser”并且在用户上具有外键id将其与friendnote表匹配。但如果你绝对无法改变你的设计,你可能希望这样匹配:

WHERE tousers LIKE '%$userinfo[username]\n%' ");

确保在用户名后紧跟换行符。

答案 2 :(得分:1)

好的,所以听起来tousers字段可以包含'stuff test option whatever'和'foo test2 something blah blah'等值,并且你想要匹配第一个而不是第二个。在这种情况下,您需要在搜索字词周围添加分隔符。假设搜索词之前总是有空格,后面有空格或逗号,你可以这样做:

... WHERE tousers LIKE '%[ ]$userinfo[username][ ,]%'

但是,如果您的搜索词可以出现在字段的开头(前面没有空格字符)或字段的末尾(后面没有分隔符),则会遇到问题。在这种情况下,您可能需要有多个LIKE子句。

答案 3 :(得分:0)

根据我的理解,你应该使用严格的比较:

where tousers = 'whatever'

这是因为tousers like %whatever%匹配任何行,其中tousers字段在其内容中的任何位置都有'任何',因此它匹配'whatever','123whatever','whatever321'和'123whatever321 ”。我希望你明白这一点。

答案 4 :(得分:0)

所以你只想搜索确切的名字匹配?如果是这样,请使用=并删除%通配符:

$friendnotes = mysql_query("SELECT nid,user,subject,message FROM friendnote 
WHERE tousers = '$userinfo[username]' ");

答案 5 :(得分:0)

这是MySQL REGEXP运算符的完美用例。