Подготовленный оператор в массиве и bind () для X DevAPI - PullRequest
0 голосов
/ 14 марта 2020

Я хочу, чтобы оператор искал несколько идентификаторов. Вот так.

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 Ответ

3 голосов
/ 16 марта 2020

Это ограничение 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()

Конечно, это не работает, если вам нужен динамик c количество элементов в критериях фильтрации. В этом случае вы можете прибегнуть к чему-то вроде:

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 для Node.js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...