Подготовленный оператор в массиве и bind() для X DevAPI
Я хочу, чтобы в операторе выполнялся поиск по нескольким идентификаторам. Вот так.
const idsStr = "41, 42, 43";
const sqlStr = `SELECT * FROM table where id IN (${idsStr})`;
session.sql(sqlStr).execute()
Но если я использую метод привязки, он захватывает только первый экземпляр строки, остальные значения игнорируются.
const idsStr = "41, 42, 43";
const sqlStr = `SELECT * FROM table where id IN (?)`;
session.sql(sqlStr).bind(idsStr).execute()
Я хочу сделать подготовленный оператор в соответствии с поддерживаемым в настоящее время API, чтобы избежать SQL-инъекции.
1 ответ
Это ограничение API (и самого плагина X) и побочный продукт того факта, что выражения CRUD поддерживают альтернативный синтаксис, такой как IN [41, 42, 43]
. Прямо сейчас единственный способ сделать то, что вы хотите, - это чтобы сам оператор SQL содержал заполнители для всех этих идентификаторов:
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 для Node.js