Подготовленный оператор в массиве и 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

Другие вопросы по тегам