将问号字符转义为NodeJS中MySQL查询的占位符

时间:2017-05-30 15:26:31

标签: mysql node.js

我在查询功能(https://github.com/mysqljs/mysql#escaping-query-values)中使用了以下查询:

database.query("UPDATE Project SET Content = 'Hello ?' WHERE Id = ?", [id], function(err, rows, fields) {
        if (err) {
            console.log(err);
            res.json({ status: 'FAIL QUERY' });
        } else {
            res.json({ status: 'SUCCESS' });
        }
    });

我有一个错误,因为它正在替换问号"'您好?'"和" WHERE Id =?"他只有一个属性:[id]。 怎么避免这个?

4 个答案:

答案 0 :(得分:3)

您有多种选择:

database.query("UPDATE Project SET Content = ? WHERE Id = ?", [ 'Hello ?', id], function(err, rows, fields) { ... })

或者:

database.query("UPDATE Project SET Content = 'Hello ?' WHERE Id =" + mysql.escape(id), function(err, rows, fields) { ... });

答案 1 :(得分:0)

预备语句将按顺序替换传递数组中元素的?的每个实例。如果要将其保留为占位符,或者在数组中包含2个元素,则需要使用不同的占位符字符,第一个是?替换Hello之后的内容(承担)请注意,它也会在该元素周围放置单引号),第二个引用Id = ?

答案 2 :(得分:0)

我会将此报告为该项目的错误。当这些字符出现时,它们不应该替换?个字符:

  • 内部字符串文字,如您的示例所示。
  • 内部分隔标识符。使用标点符号作为表名或列名的一部分,这是不常见但合法的SQL。
  • 内部评论。

如果Node.js项目正在替换?而不考虑上下文,那么这是一个不可接受的错误。

我会停止使用该软件包,直到修复错误。

答案 3 :(得分:0)

感谢您的所有答案!我学到了很多。 使用(mysql.escape(id))的robertklep答案对我有用。

然而,我发现了另一种与您共享的方式,即为查询添加多个参数:

您可以创建一个名为queryJSON的JSON并向其添加键值。例如:queryJSON = {Content: 'Hello ?', Address: '742 Evergreen Terrace'}。然后:

database.query("UPDATE Offer SET ? WHERE Id = ?", [queryJSON, id], function(err, rows, fields) {

这对我的请求添加一个或多个参数的放置请求非常有用。