【问题标题】:how to pass list of ids to mysql delete query from NodeJs如何将ID列表传递给来自NodeJs的mysql删除查询
【发布时间】:2017-07-06 00:02:44
【问题描述】:

我需要使用 list (id1,id2..) 中的 where 子句执行多行删除查询 但是由于我们在 JS 中没有列表,所以我在将参数传递给查询时遇到了问题。这是我的代码:

 let list =[1,2,..];
 let Query = 'DELETE FROM Table WHERE id IN (?)';
 connection.query(Query,list, function (err, result) {
     `enter code here`
 };

当我以这种方式传递它并将 mysql 服务器记录到日志文件后,我看到它实际上只传递了第一个 id。

PS:我试过没有括号?并且还在列表上做一个 Array.join 但都没有工作。

【问题讨论】:

标签: javascript mysql node.js


【解决方案1】:

阅读https://github.com/mysqljs/mysql#performing-queries的文档(如果你使用这个lib连接mysql)

 let list =[1,2,..];
 let Query = 'DELETE FROM Table WHERE id IN (?)';
 // values param need is a array of value to binding to "?"
 // you can try [list.toString()] if the block above not working
 connection.query(Query,[list], function (err, result) {
     `enter code here`
 };

【讨论】:

  • 这正是我想要的。在 node mysql2 包中运行良好
【解决方案2】:

很遗憾,? 占位符不适用于 IN 运算符。所以你应该逃避这些价值观。假设list 变量来自外部源;因此,为了防止 SQL 注入,您可以:

// `list` is filled in outside this process
const Query = `DELETE FROM Table WHERE id IN (${list.map((item) => connection.escape(item))})`;
connection.query(Query, function (err, result) {
  // handle error or result here
};

我注意到list.map(connection.escape) 不起作用并抛出: TypeError: Cannot read property 'config' of undefined

【讨论】:

    【解决方案3】:

    只需将项目列表附加到查询字符串:

     let list = [1, 2, 3];
     let Query = `DELETE FROM Table WHERE id IN (${list})`;
     connection.query(Query, function (err, result) {
         `enter code here`
     };
    

    【讨论】:

    • 只要list变量没有被系统外部的数据填充就好了,例如用户输入的数据。否则,SQL 注入将是一个问题。
    • MySQL 说“总是逃避你的数据”是有原因的。你不想发现它
    猜你喜欢
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多