【问题标题】:SELECT WHERE IN in node-mysql在 node-mysql 中选择 WHERE
【发布时间】:2012-06-14 20:57:11
【问题描述】:

有人知道如何在 node-mysql 中使用SELECT WHERE IN 吗?

我已尝试以下代码,但收到以下错误消息:

'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''(`PHP`,`apache`)'' at line 1'

这是我的代码:

whereIn = '(';
for ( var i in tagArray ) {
    if ( i != tagArray.length - 1 ) {
        whereIn += "`" + tagArray[i] + "`,";    
    }else{
        whereIn += "`" + tagArray[i] + "`"; 
    }
}
whereIn += ')';

console.log(whereIn);

client.query(
    'SELECT tag_id FROM tag WHERE tag_name IN ?',
    [whereIn],
    function(err, result, fields) {
        client.destroy();

        if (err) {
            throw err;
        }

        console.log(result);

        res.redirect('/');
    }
);

【问题讨论】:

  • 您不喜欢 SQL 错误消息吗?太有帮助了

标签: javascript node.js node-mysql


【解决方案1】:

您只需将值的tagArray 传递给node-mysql,它会为您处理其余的:

client.query(
    'SELECT tag_id FROM tag WHERE tag_name IN (?)',
    [tagArray],
    function(err, result, fields) {
        client.destroy();

        if (err) {
            throw err;
        }

        console.log(result);

        res.redirect('/');
    }
);

有关更多信息,请参阅手册中有关如何自动转义不同值的部分:https://github.com/mysqljs/mysql#escaping-query-values

【讨论】:

    【解决方案2】:

    您必须使用IN (?) 而不是IN ?

    任何字符串操作都可能导致 SQL INJECTION 后门。

    【讨论】:

      【解决方案3】:

      对于避免转义值的更安全的解决方案,请使用 ?像你通常那样做的参数,但是像这样动态地创建参数占位符:

      var inlist = '';
      for(var i=0; i<ids.length; i++) {
        inlist += '?,';
      }
      inlist = inlist.substring(0,inlist.length-1);
      
      var sql = 'SELECT a, b, c FROM mytable WHERE id in (' + inlist + ')';
      
      conn.query( sql, ids, function(err, rows) {
        . . .
      })
      

      【讨论】:

        【解决方案4】:

        你需要引用你的字符串,而不是使用反引号。

        whereIn = '(';
        for ( var i in tagArray ) {
            if ( i != tagArray.length - 1 ) {
                whereIn += "'" + tagArray[i] + "',";    
            }else{
                whereIn += "'" + tagArray[i] + "'"; 
            }
         }
        whereIn += ')';
        

        【讨论】:

        • 是的,反引号不代表值。
        • 我已经试过了,我明白了,'你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ''(\'PHP\',\'apache\',\'Java\')'' 附近使用正确的语法:(
        • 看起来您的查询自动转义引号。有没有一个选项不会逃脱它们?
        • 不转义会不会有安全问题?
        • 您想转义 tagArray 内的任何引号,而不是每个值之外的引号。
        【解决方案5】:

        如果有人在 2021 年寻找答案。

         client.query(
              'SELECT tag_id FROM tag WHERE tag_name IN (?)', 
               [['val1', 'val2']],
               function(err, result, fields) {
            client.destroy();
        
            if (err) {
                throw err;
            }
        
            console.log(result);
        
            res.redirect('/');
        }
        

        );

        【讨论】:

          【解决方案6】:

          一个可行的解决方案:

          client.query(
              'SELECT tag_id FROM tag WHERE tag_name IN ?',
              [tagArray],
              function(err, result, fields) {
                  client.destroy();
          
                  if (err) {
                      throw err;
                  }
          
                  console.log(result);
          
                  res.redirect('/');
              }
          );
          

          无需手动将 tagArray 括在引号中。它被 mysql 模块转义。

          【讨论】:

          • 您应该在 ?: 'SELECT tag_id FROM tag WHERE tag_name IN (?)' 中添加括号,
          猜你喜欢
          • 2013-01-03
          • 1970-01-01
          • 2020-11-03
          • 2013-09-04
          • 2015-10-26
          • 2021-10-26
          • 1970-01-01
          • 2011-05-12
          • 2017-07-22
          相关资源
          最近更新 更多