Php MySQLi!=不处理多个和/或子句

Php MySQLi!=不处理多个和/或子句,php,mysql,where,clause,Php,Mysql,Where,Clause,因此,我的数据库中有两行-user_one和user_two,这些行被用户ID占用,作为消息系统的编号,我还在同一消息功能中包含了一个支持票证系统,但此代码段存在一些问题 $sqlc="SELECT * FROM ap_conversations WHERE user_one = '$user_id' AND user_two != '999' OR user_two = '$user_id' AND user_one != '999' OR user_one = '$user_id' AND

因此,我的数据库中有两行-
user_one
user_two
,这些行被用户ID占用,作为消息系统的编号,我还在同一消息功能中包含了一个支持票证系统,但此代码段存在一些问题

$sqlc="SELECT * FROM ap_conversations WHERE user_one = '$user_id' AND user_two != '999' OR user_two = '$user_id' AND user_one != '999' OR user_one = '$user_id' AND user_two != '999d' OR user_two = '$user_id' AND user_one != '999d'";
$sqlc="SELECT * FROM ap_conversations WHERE (user_one = '$user_id' AND user_two != '999') OR (user_two = '$user_id' AND user_one != '999') OR (user_one = '$user_id' AND user_two != '999d') OR (user_two = '$user_id' AND user_one != '999d')";
正如您所注意到的,支持票证ID是
999
,当它被保留为仅检查两个ID是否都是
999
时,此代码工作正常。虽然我还需要它来检查
user\u one
user\u two
的ID是否为
999
999d
。当前代码返回
1
,当我知道某个事实时,它应该返回
0
,因此我知道某些地方明显出错,我想我可能设置不正确。我曾尝试以多种不同的格式设置它:

$sqlc="SELECT * FROM ap_conversations WHERE user_one = '$user_id' AND (user_two != '999' OR user_two != '999d') OR user_two = '$user_id' AND (user_one != '999' OR user_one != '999d')";

但仍然得到同样的结果?有人能告诉我我做错了什么,或者我怎样才能使代码更好地执行吗

您需要使用括号来建立运算符优先级:

$sqlc="SELECT * FROM ap_conversations 
WHERE (user_one = '$user_id' AND user_two != '999') 
OR (user_two = '$user_id' AND user_one != '999') 
OR (user_one = '$user_id' AND user_two != '999d') 
OR (user_two = '$user_id' AND user_one != '999d')";

您需要使用括号来建立运算符优先级:

$sqlc="SELECT * FROM ap_conversations 
WHERE (user_one = '$user_id' AND user_two != '999') 
OR (user_two = '$user_id' AND user_one != '999') 
OR (user_one = '$user_id' AND user_two != '999d') 
OR (user_two = '$user_id' AND user_one != '999d')";

请尝试在查询中添加括号,如下所示:


请尝试在查询中添加括号,如下所示:

…是一个问题,它简化为
user\u one='$user\u id'
条件变得无关

如果您不相信我,请尝试一行,其中
user\u one=user\u id
user\u two='999'
。。它不满足第一个括号内的条件,但通过第二个条件并返回

我想你想要:

SELECT * FROM ap_conversations 
 WHERE (user_one = :user_id AND user_two NOT IN ('999','999d')) 
    OR (user_two = :user_id AND user_one NOT IN ('999','999d'));
注意:将
'999'
'999d'
作为
$user\u id
传递仍将返回支持票证。我非常喜欢此功能,但如果不需要此功能,您可以使用:

SELECT * FROM ap_conversations 
 WHERE (user_one = :user_id OR user_two = :user_id) 
   AND user_one NOT IN ('999','999d')
   AND user_two NOT IN ('999','999d');
…是一个问题,它简化为
user\u one='$user\u id'
条件变得无关

如果您不相信我,请尝试一行,其中
user\u one=user\u id
user\u two='999'
。。它不满足第一个括号内的条件,但通过第二个条件并返回

我想你想要:

SELECT * FROM ap_conversations 
 WHERE (user_one = :user_id AND user_two NOT IN ('999','999d')) 
    OR (user_two = :user_id AND user_one NOT IN ('999','999d'));
注意:将
'999'
'999d'
作为
$user\u id
传递仍将返回支持票证。我非常喜欢此功能,但如果不需要此功能,您可以使用:

SELECT * FROM ap_conversations 
 WHERE (user_one = :user_id OR user_two = :user_id) 
   AND user_one NOT IN ('999','999d')
   AND user_two NOT IN ('999','999d');

这是个大问题;)新年快乐,约翰洛文的“解释”;-)谢谢你的回答,这似乎对我来说仍然不起作用,代码似乎仍然返回结果,即使结果包括
999d
。你确定
$userid
已填充并且具有你期望的值吗?@Arth请不要在其他答案中征求你的答案。你对OP的评论应该放在他们的问题下面。除非你的评论是针对约翰的。这是一个很大的谎言;)新年快乐,约翰洛文的“解释”;-)谢谢你的回答,这似乎对我来说仍然不起作用,代码似乎仍然返回结果,即使结果包括
999d
。你确定
$userid
已填充并且具有你期望的值吗?@Arth请不要在其他答案中征求你的答案。你对OP的评论应该放在他们的问题下面。除非你的评论是针对约翰的。这似乎很有效!非常感谢!我可以看出它忽略了一些东西,但只是在努力找出哪一部分,它似乎也在某种程度上简化了它。
不在
中的函数是否有相反的作用?是的,
中,但要注意操作数/运算符的空值。函数可能无法按预期执行。这似乎工作得很好!非常感谢!我可以看出它忽略了一些东西,但只是在努力找出哪一部分,它似乎也在某种程度上简化了它。函数中的
不在
中是否有相反的作用?是的,
中,但要注意函数可能无法按预期执行的操作数/运算符的空值。