mysql - 使用设置值数组通过 myCon.query 更新表

标签 mysql node.js

我正在尝试使用值数组来填充转义的 SQL 查询。数组被接受。

我正在使用:


function genUpdateString(settings) {
  var sql = "";
  var first = true;
  for (attr in settings) {
    if (
      settings[attr] != undefined &&
      attr != "userid" &&
      attr != "api_key"
    ) {
      if (first) {
        first = false;
      } else {
        sql += ", ";
      }
      sql += attr + "='" + settings[attr] + "'";
    }
  }
  return sql;
}

sql_update = genUpdateString(...);

var sql = "UPDATE user SET " + sql_update + " WHERE name = '" + newSettings.userid + "'";  
myCon.query(sql, (err, result) => {

这工作正常,但是当我尝试移动到转义格式时它崩溃了:

var sql = "UPDATE user SET ? WHERE name = ?";  
myCon.query(sql, [sql_update, userid], (err, result) => {

当我手动创建字符串时,它运行良好并更新我的数据库表,但使用第二种方法时它会崩溃并出现错误:

Error: ER_PARSE_ERROR: 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 ''age=\'33\'' WHERE name = 'Josephy Krakowski'' at line 1

最佳答案

您的 genUpdateString 函数也不是 SQL 注入(inject)安全的 - 仅添加单引号并不安全。

类似这样的事情 - 我们正在“并行”生成带有问号和参数的查询片段。

function genUpdateAndArgs(map) {
  const names = [];
  const args = [];
  for(var key in map) {
    const value = map[key];
    if(value !== undefined) {
      names.push(key);
      args.push(value);
    }
  }
  // ['foo', 'bar'] => 'foo = ?, bar = ?'
  const namesFragment = names.map((name) => `${name} = ?`).join(', ');
  return [namesFragment, args];
}

const settings = {
  'foo': 123,
  'bar': 456,
};
const userId = 1337;

const [namesFragment, updateArgs] = genUpdateAndArgs(settings);
const query = `UPDATE user SET ${namesFragment} WHERE name = ?`;
const args = [].concat(updateArgs).concat(userId);
console.log(query, args);

输出为

UPDATE user SET foo = ?, bar = ? WHERE name = ?
[ 123, 456, 1337 ]

然后您可以将其插入db.query...

但是,我真的衷心推荐像 Knex 这样的查询构建器 - 在 Knex 中,大约是相同的

knex('user')
  .where('name', userId)
  .update(settings)

关于mysql - 使用设置值数组通过 myCon.query 更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57578283/

相关文章:

php - 在sql数据库中的多个表中插入一个条目

Node.js 未捕获类型错误 : callback is not a function in process. nextTick

node.js - 如何在 express 网站中使用node的集群模块?

arrays - 如果数组包含 id mongoose 则获取数组

javascript - 包.json : dependency in a local directory?

mysql - 无法初始化提供程序。架构缺失或不正确。用于 MySql.Web 连接器

mysql - MySQL 中的 Like 关键字问题

MySQL/Percona 5.6 : INSERT INTO a table after a table is ALTERed

java - 将 Envers 修订添加到现有且未经审核的表

javascript - Node.js - 连接到同一个服务器,同一个用户,使用多个 html 文件