【问题标题】:One value for multiple placeholders in nodejs-mysqlnodejs-mysql 中多个占位符的一个值
【发布时间】:2019-09-15 22:51:46
【问题描述】:

为了允许用户使用他们的usernameemailphonenumber 登录,我使用了这个查询:

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) 而无需重复输入。

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

【问题讨论】:

    标签: mysql sql node.js


    【解决方案1】:

    你可以使用the IN operator:

    SELECT * 
    FROM users 
    WHERE ? IN (username, email, phonenumber) AND password = ? 
    

    附注:您的原始查询存在出现问题,这使得它非常不安全。实际上,这将授权使用用户名或电子邮件登录而不检查密码的用户,因为:

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

    在语法上等同于:

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

    这是因为逻辑运算符OR 的优先级低于AND。您需要用括号将ORed 条件括起来,如下所示:

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

    【讨论】:

    • 太棒了,像这样使用 IN 运算符对我来说是新的。也感谢旁注。宝贵的信息。
    • 欢迎@Dohab,乐于助人!
    • @Dohab:你不接受这个答案有什么特别的原因吗?
    • 是的,很抱歉,我刚刚对此进行了测试,但得到了一些不需要的结果。当 phonenumber 为 0(在数据库中)时,即使 username 和 email 不等于 ?占位符。
    • 绝对是的。使用这种语法,您需要将变量绑定两次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2016-06-21
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    相关资源
    最近更新 更多