如何在一次SQL查询中完成用户名、邮箱是否已存在的校验?
结论
可以在你当前的代码架构下仅执行一次SQL查询完成校验,你猜测的实现方向是对的,仅需要调整SQL语法和传参逻辑即可。
正确的SQL写法
你示例的select * from users where username && email = ?存在语法错误,逻辑上我们需要匹配「用户名等于目标值 或 邮箱等于目标值」的记录,正确SQL如下:
SELECT 1 FROM users WHERE username = ? OR email = ?
小优化:这里用
SELECT 1替代SELECT *可以减少不必要的数据查询,性能更好,只要能查到记录就代表重复,不需要返回整行字段内容。
代码调整说明
- 如果你要校验的是用户输入的同一个值(允许用户用用户名/邮箱任意一种登录,提前查重),就把查询参数改成同一个值传两次:
var checkExist = "SELECT 1 FROM users WHERE username = ? OR email = ?"; ibmdb.open(ibmdbconn, function(err, conn) { if (err) return console.log(err); // 两个占位符都传用户输入的待校验值 conn.query(checkExist, [inputValue, inputValue], function(err, rows) { if (err) { console.log(err); } if (rows.length > 0) { alert("该用户名或邮箱已被注册使用") } conn.close(function() { // 关闭连接的后续逻辑 }); }); });
- 如果你要校验的是注册场景下用户分别输入的用户名和邮箱两个字段,只要其中一个重复就拦截,就把两个不同的输入值按顺序传给占位符即可:
conn.query(checkExist, [inputUsername, inputEmail], function(err, rows) { // 后续逻辑和上面一致 })
内容的提问来源于stack exchange,提问作者gianlps
相关产品推荐
相关产品推荐

