Php 类似MySQL的问题

Php 类似MySQL的问题,php,mysql,Php,Mysql,我有一个剧本: $friendnotes = mysql_query("SELECT nid,user,subject,message FROM friendnote WHERE tousers LIKE '%$userinfo[username]%' "); 以及数据库“tousers”表中的内容: Test Example User 该脚本似乎运行良好 但是如果有一个名为“Test2”的用户,它也会在数据库中显示包含“Test2”的内容,其中$userinfo[username]只

我有一个剧本:

$friendnotes = mysql_query("SELECT nid,user,subject,message FROM friendnote 
WHERE tousers LIKE '%$userinfo[username]%' ");
以及数据库“tousers”表中的内容:

Test 
Example 
User
该脚本似乎运行良好

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

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


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

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

where tousers = 'whatever'

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

那么你只想搜索确切的姓名匹配?如果是这样,只需使用
=
并删除
%
通配符:

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

如果删除允许模式匹配的
%
符号,这将起作用

$friendnotes = mysql_query("SELECT nid,user,subject,message FROM friendnote 
WHERE tousers LIKE '$userinfo[username]' ");
但一致的看法似乎是,使用平等会更快

所以在这种情况下,换成

$friendnotes = mysql_query("SELECT nid,user,subject,message FROM friendnote 
WHERE tousers = '$userinfo[username]' ");
编辑-关于您的编辑,这不是一个很好的设计。如果一个用户可以有多个“touser”(即一对多关系),则应将其表示为一个单独的表
touser
,其中每行表示一个“touser”,并且在用户id上有一个外键,以将其与
friendnote
表相匹配。但是,如果您完全无法更改设计,您可能希望这样匹配:

WHERE用户喜欢“%$userinfo[用户名]\n%”;

确保用户名后立即有换行符。

条件

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\u用户
表之间建立一个1:n关系模型…

好的,所以听起来tousers字段可以包含“stuff test option Anwhere”和“foo test2某物诸如此类”之类的值,您可以这样做要匹配第一个,但不匹配第二个。在这种情况下,您需要在搜索项周围包含分隔符。假设搜索项前面总是有空格,后面总是有空格或逗号,您可以执行以下操作:

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

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

这是运算符的完美用法。

您确定要使用通配符,而不仅仅是将值与整个字段内容匹配吗?您真的应该转义该用户名。最好是在小bobby表注册之前。好的,我正式感到困惑。Do你的意思是你想查看多个字段?我认为你需要发布表中的一些实际内容,以及一些你想搜索的内容的实际示例,因为否则我们只是在讨论交叉目的。是的,我同意,听起来这个数据库模式需要更改。可能需要一个单独的表来存储每个lin的内容e在不同的行中。re编辑:我不认为您理解,(1),“tousers”不是一个表,但实际上是一个列名,(2)在一个字段中存储多个值不是一个好主意,您应该使用多对多关系(意味着,额外的表)。另外,考虑sql注入。但是“tousers”不是一个好主意字段包含多个值,脚本需要搜索该字段