MySQLi != 不适用于多个 AND/OR 子句
MySQLi != not working on multiple AND/OR clauses
所以我的数据库中有两行 - 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'";
您会注意到,支持工单 ID 是 999
,当它只是检查两个 ID 都不是 999
时,这段代码运行完美。尽管我还需要它来检查 user_one
或 user_two
的 ID 是否为 999
或 999d
。当前代码 returns 1
,当我知道一个事实时它应该 return 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_one = '$user_id' AND user_two != '999')
OR (user_one = '$user_id' AND user_two != '999d')
...是一个问题,它简化为user_one = '$user_id'
,AND
条件变得无关紧要。
如果您不相信我,请尝试 user_one = user_id
和 user_two = '999'
的一行。第一个括号条件未通过,但通过了第二个并且是 returned。
我假设你想要:
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'));
N.B。传入 '999'
或 '999d'
作为 $user_id
仍然会 return 支持票。我非常喜欢这个功能,但如果不需要,您可以使用:
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_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'";
您会注意到,支持工单 ID 是 999
,当它只是检查两个 ID 都不是 999
时,这段代码运行完美。尽管我还需要它来检查 user_one
或 user_two
的 ID 是否为 999
或 999d
。当前代码 returns 1
,当我知道一个事实时它应该 return 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_one = '$user_id' AND user_two != '999')
OR (user_one = '$user_id' AND user_two != '999d')
...是一个问题,它简化为user_one = '$user_id'
,AND
条件变得无关紧要。
如果您不相信我,请尝试 user_one = user_id
和 user_two = '999'
的一行。第一个括号条件未通过,但通过了第二个并且是 returned。
我假设你想要:
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'));
N.B。传入 '999'
或 '999d'
作为 $user_id
仍然会 return 支持票。我非常喜欢这个功能,但如果不需要,您可以使用:
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');