数组中的准备语句和用于 X DevAPI 的 bind()
Prepared statement in an array and bind() for X DevAPI
我要查询多个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做prepared statement,避免SQL注入
这是 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
类别打开错误报告。
免责声明:我是 MySQL X DevAPI Connector for Node.js
的首席开发人员
我要查询多个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做prepared statement,避免SQL注入
这是 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
类别打开错误报告。
免责声明:我是 MySQL X DevAPI Connector for Node.js
的首席开发人员