MySQL查询如何排除当前登录用户ID 避免个人资料编辑校验冲突?
问题根因
- 核心错误是逻辑运算符使用错误,你把排除当前用户的条件和用户名/邮箱匹配条件用
OR连接,完全违背了预期逻辑。
原语句错误原因解析
你写的查询:
SELECT * FROM users WHERE (username='$username' OR email='$email' OR id!='$id');
这个WHERE条件的判断逻辑是:只要满足以下三个条件的任意一项,就会命中查询返回结果:
- 用户名和提交的用户名一致
- 邮箱和提交的邮箱一致
- 用户ID不等于当前登录用户的ID
哪怕你提交的用户名和邮箱全是当前用户自己的,库中所有其他用户都满足id!='$id'的条件,一定会返回大量匹配结果,自然会触发拦截逻辑,完全达不到排除自己的效果。
正确的查询写法
你需要先把「用户名/邮箱匹配」的条件作为一个整体,再用AND连接排除当前用户的条件:
SELECT * FROM users WHERE (username='$username' OR email='$email') AND id != '$id';
这个语句的逻辑是:
查找所有用户名和提交值相同、或邮箱和提交值相同的用户,同时排除当前登录用户自己
如果这条查询返回了结果,就说明有其他用户已经占用了你要修改的用户名/邮箱,此时再拦截提交即可,不会出现用户没改用户名/邮箱时被误拦截的问题。
额外安全提示
当前直接把变量拼接入SQL语句的写法存在SQL注入风险,建议改用PHP的PDO或MySQLi预处理机制传参,不要直接拼接$username/$email/$id这类用户可控的变量到SQL语句中,避免被攻击者利用注入漏洞拖库。
内容的提问来源于stack exchange,提问作者YKKY
相关产品推荐
相关产品推荐

