如何在mysql / express中使用变量作为列名?

时间:2018-09-20 15:18:33

标签: javascript mysql node.js express

当前我有这个问题,问题在于表名得到了一组引号(如果是字符串),这会使服务器崩溃。

const update =  'the name of my column';
const UpdateQuery = `UPDATE scores
    SET ${mysql.escape(update)} = ${mysql.escape(newValue)}
    WHERE score_id = ${mysql.escape(singleScore.score_id)}`;

mysql.escape()除了列名之外的所有内容都可以正常工作。

这是我在注入变量后用console.log查询的结果:

UPDATE scores
SET 'the name of my column' = 1
WHERE score_id = 1

4 个答案:

答案 0 :(得分:1)

泰米尔瓦南解决方案稍作改动即可解决该问题

 db.query(
            'UPDATE scores SET '+update+' = ? Where score_id = ?',
            [newValue, singleScore.score_id],
            (err, result) => {
              if (err) throw err;
              console.log(`Changed ${result.changedRows} row(s)`);
            }
          );

答案 1 :(得分:0)

对于怪异的MySQL列名,您不能在它们周围加上单引号。单引号将值转换为字符串。

在MySQL中为此使用了反引号。例如

UPDATE `table with space` SET `column with space` = 'bar';

答案 2 :(得分:0)

检查以下代码。可能有用,

con.query(
  'UPDATE scores SET '+update+' = ? Where score_id = ?',
  // Old - [${mysql.escape(newValue)}, ${mysql.escape(singleScore.score_id)}],
  /* Update - */ [newValue,singleScore.score_id],
  (err, result) => {
    if (err) throw err;
    console.log(`Changed ${result.changedRows} row(s)`);
  }
);

根据您的查询,${mysql.escape(update)}包含值中的单引号。

答案 3 :(得分:0)

您似乎在使用 mysql NPM package

escape 方法用于转义查询值。要转义查询标识符(如列名),您应该改用 escapeId 方法。您的代码应如下所示:

const update =  'the name of my column';
const UpdateQuery = `UPDATE scores
    SET ${mysql.escapeId(update)} = ${mysql.escape(newValue)}
    WHERE score_id = ${mysql.escape(singleScore.score_id)}`;

同样,如果您使用替换,请使用双问号而不是单问号来转义标识符。

const update =  'the name of my column';
const UpdateQuery = `UPDATE scores
    SET ?? = ?
    WHERE score_id = ?`;
const replacements = [update, newValue, singleScore.score_id];

See the mysql docs for more details.