【问题标题】:NODEJS MySQL Bindings throws ER_PARSE_ERROR 1064NODEJS MySQL 绑定抛出 ER_PARSE_ERROR 1064
【发布时间】:2018-09-16 19:52:50
【问题描述】:

鉴于以下情况:

let sql: any = 'SELECT * FROM test_people ORDER BY :column :direction LIMIT :limit, :offset';
let binds: any = { column: 'name', direction: 'desc', limit: '1', offset: '10' };

let result = await mysql.query(sql, binds);

无论出于何种原因,它都会引发 mysql 语法错误,如果我替换绑定并在没有绑定的情况下将其硬编码,则查询实际上可以工作并获取结果。不知道这里有什么问题。帮助 ! :)

顺便说一句,我也尝试过问号版本,得到相同的语法错误。

错误输出:

 ...
 code: 'ER_PARSE_ERROR',
 errno: 1064,
'You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near \':column :direction LIMIT :limit, :offset\' at line 1',
 ...

欣赏任何解决方案,

【问题讨论】:

  • 看起来它需要传递一个数组,如下所示: let result = await mysql.query(sql, [ binds ]);
  • 我知道这个问题是关于一种完全不同的语言,但我敢打赌原因是一样的:stackoverflow.com/questions/182287/… 参数绑定用于将数据与查询分离,而不是用于构建动态查询.
  • @DZDomi 所以我已经用数组版本和问号试过了,没用。得到相同的语法错误
  • 请记住在这样的问题中包含 exact 错误消息:即使它对您没有多大意义,它可能会帮助某人发现问题并帮助您。
  • @IMSoP 你是对的。我用更多细节更新了我的问题。顺便说一句,我记得 PHP 有同样的问题,但我解决了,节点库必须有类似的方法来解决这个问题。我会看看你发给我的东西。谢谢!

标签: mysql node.js typescript


【解决方案1】:

只能绑定值。列名(在ORDER BY 中)和:direction 不能绑定。此外,FYI 表名、数据库名和 SQL 语法的其他部分也不能绑定。

【讨论】:

  • 好的,是的,看起来是这样......谢谢!这实际上很有意义,关于如何处理来自客户端的动态数据的任何建议/良好实践?说客户想要 DESC 而不是 ASC 我应该如何在查询中使用它?你会自己逃脱吗?我在想也许检查 var direction = ('param' === 'DESC') ? 'DESC' : 'ASC';够好吗?列名呢?或限制?你如何实现这些?
  • 我认为您对ASC/DESC 的处理方法很好。列名,如果您正确清理输入。 LIMIT/OFFSET 是否受到影响?
  • 抱歉回复晚了,在路上,LIMIT 和 OFFSET 也要求是动态的(我猜你已经想通了……它用于数据表项目)。无论如何,非常感谢您的指导,我会尝试找到一种方法来清理其余部分,或者我会留下它,就像它只用于演示目的一样......再次感谢! :)
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 2020-06-30
  • 2016-02-16
  • 2018-01-02
  • 2020-02-09
相关资源
最近更新 更多