nodejs mysql中多个占位符的一个值

nodejs mysql中多个占位符的一个值,mysql,sql,node.js,Mysql,Sql,Node.js,要允许用户使用他们的用户名或电子邮件或电话号码登录,我使用以下查询: res.post('/api/userlogin', function(req, res){ connection.query( 'SELECT * FROM users WHERE username=? OR email=? OR phonenumber=? AND password=?', [req.body.loginfield, req.body.loginfield,req.

要允许用户使用他们的
用户名
电子邮件
电话号码
登录,我使用以下查询:

res.post('/api/userlogin', function(req, res){
    connection.query(
        'SELECT * FROM users WHERE username=? OR email=? OR phonenumber=? AND password=?', 
        [req.body.loginfield, req.body.loginfield,req.body.loginfield, req.body.password], 
        function(){  
        ...
        ...
        //res.send
    });
});
我相信mysql就是这样工作的,但我想也许有一种方法可以在多个占位符中只使用一个值(
req.body.loginfield
),而无需重复键入

但是,我在文档中找不到关于它的任何信息。

您可以使用:


旁注:原始查询有一个预相关性问题,这使得它非常不安全。实际上,这将授权用户使用其用户名或电子邮件登录而不检查其密码,因为:

username=? OR email=? OR phonenumber=? AND password=?
在句法上等同于:

(username=? OR email=?) OR (phonenumber=? AND password=?)
这是因为逻辑运算符
的预设值低于
。您需要用括号括住
ed条件,如下所示:

(username=? OR email=? OR phonenumber=?) AND password=?)

令人惊奇的是,像这样使用IN操作符对我来说是新的。谢谢你的旁注。宝贵的信息。欢迎@Dohab,乐于帮助@多哈布:你不接受答案有什么特别的原因吗?是的,当然,很抱歉,我刚刚测试了这个,我得到了一些不想要的结果。当phonenumber为0(在数据库中)时,即使用户名和电子邮件不等于?占位符,绝对是。使用这种语法,您需要绑定变量两次。
(username=? OR email=? OR phonenumber=?) AND password=?)