我有一个脚本:
$friendnotes = mysql_query("SELECT nid,user,subject,message FROM friendnote
WHERE tousers LIKE '%$userinfo[username]%' ");
数据库“tousers”表中的内容:
Test
Example
User
该脚本似乎运作良好
但是,如果有一个名为“Test2”的用户,它还会显示数据库中包含“Test2”的内容,其中$ userinfo [用户名]只是“测试”
有没有办法解决这个问题?例如(这只是一个例子,我不介意你换另一种方式)让它搜索整行?
编辑:我认为没有人理解,“tousers”表包含多个值(按行分隔)而不仅仅是一个,我希望它搜索每个LINE(或任何类似的工作) ),而不是行
答案 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运算符的完美用例。