2017-05-30 74 views
0

MySQL查询我有以下查询我使用的查询功能(https://github.com/mysqljs/mysql#escaping-query-values):逃逸问号字符作为占位符中的NodeJS

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]。 如何避免这种情况?

回答

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) { ... }); 
0

准备好的语句将按顺序替换?的每个实例,并按顺序替换传递数组中的元素。如果要将其保留为占位符,或者在阵列中有2个元素,则需要使用不同的占位符字符,第一个元素将替换为Hello后的?(请记住,它也会将单引号围绕该元素),第二个为Id = ?

0

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

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

如果Node.js的项目替换的?不管上下文的,那么这是不可接受的错误。

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

+0

用户会被告知这种行为(并且还解释了这一点,尽管没有太多的说法,提供的功能比官方执行准备好的语句更方便)。还有其他选项可用。 – robertklep

+0

@robertklep,不管行为是否记录在案,这是错误的。我认为Node.js应该是如此的热门,比PHP好得多 - 但PDO确实解析了参数。对不起,我不接受这个错误的借口。这实在令人失望,特别是对于已经存在数年的软件包而言。 –

+0

PHP与此有什么关系?此外,如果您对此感到如此强烈,请随时发布错误报告:https://github.com/mysqljs/mysql/issues此外,这不是Node的唯一MySQL库,['mysql2']( https://开头github上。com/sidorares/node-mysql2#using-prepared-statements)支持正确的预处理语句。 – robertklep

0

感谢您的回答!我学到了很多。 使用(mysql.escape(id))的robertklep答案为我工作。

不过,我发现了另一种方式,我与你分享添加多个参数查询:

您可以创建一个名为JSON和queryJSON给它增加键 - 值。例如:queryJSON = {Content: 'Hello ?', Address: '742 Evergreen Terrace'}。然后:

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

这对我的请求添加一个或多个参数请求是有用的。