在X DevAPI中为数组和bind()准备的语句

问题描述 投票:0回答:1

我希望该语句搜索多个ID。像这样。

const idsStr = "41, 42, 43";
const sqlStr = `SELECT * FROM table where id IN (${idsStr})`;
session.sql(sqlStr).execute()

但是如果我使用bind方法,它仅捕获字符串的第一个实例,其余值将被忽略。

const idsStr = "41, 42, 43";
const sqlStr = `SELECT * FROM table where id IN (?)`;
session.sql(sqlStr).bind(idsStr).execute()

我想根据当前支持的API编写准备好的语句,以避免SQL注入。

node.js mysql-connector mysql-8.0
1个回答
0
投票

这是API(和X插件本身)的限制,并且是CRUD表达式支持诸如IN [41, 42, 43]之类的替代语法的事实的副产品。现在,执行所需操作的唯一方法是使SQL语句本身包含所有这些ID的占位符:

const sqlStr = `SELECT * FROM table where id IN (?, ?, ?)
await session.sql(sqlStr).bind(41, 42, 43).execute()

当然,如果您在过滤条件中需要动态数量的元素,这将不起作用。在这种情况下,您可以使用类似的方法:

const ids = [41, 42, 43]
const sqlStr = `SELECT * FROM table where id IN (${ids.map(() => '?').join(',')})`
await session.sql(sqlStr).bind(ids).execute()

这可能有点令人费解,但这是我目前可以想到的最聪明的解决方法。

同时,也许您可​​以使用https://bugs.mysql.com/类别在Connector for Node.js打开错误报告。

免责声明:我是负责Node.js的MySQL X DevAPI Connector的主要开发人员

© www.soinside.com 2019 - 2024. All rights reserved.