Прямые запросы: Connection и SqlHelper
Прямые запросы выполняются методами соединения Connection::query() и queryExecute() с обязательным экранированием значений через плейсхолдеры SqlExpression или хелпер SqlHelper. Массив $binds в методах ядра не защищает от SQL-инъекций, а методы SqlHelper обеспечивают совместимость синтаксиса при переходе между MySQL и PostgreSQL.
Прогресс хранится в этом браузере. Войдите, чтобы сохранить его в аккаунте.
Что нужно понимать
-
1
\Bitrix\Main\DB\Connection
-
2
Метод query()
-
3
Подготовленные запросы
-
4
Экранирование значений
-
5
Формирование условий
-
6
SQL-выражения
Материалы
Официальная документация
-
Формирование запросов Новая дока
-
Как писать код, совместимый с PostgreSQL Новая дока
Проверь себя
Разработчик передал значения через массив binds в Connection::query() и считает запрос защищённым. Так ли это?
Нет. Документация прямо говорит, что binds в query(), queryScalar() и queryExecute() не защищают от инъекций. Для подстановки значений нужны SqlExpression с плейсхолдерами или SqlHelper::forSql() и convertToDb().
Чем forSql() отличается от convertToDb() и что сломается, если перепутать?
forSql() только экранирует строку, кавычки вокруг неё вы ставите сами. convertToDb() возвращает готовый литерал в кавычках, а null превращает в NULL. Забытые кавычки вокруг forSql() — это инъекция, лишние вокруг convertToDb() — синтаксическая ошибка.
Заказчик переводит проект на PostgreSQL, и часть прямых запросов перестала работать. Что ломается первым?
Обратные кавычки вокруг имён и функции MySQL вроде IFNULL, DATE_FORMAT, GET_LOCK. Имена нужно оборачивать в SqlHelper::quote(), функции брать из методов хелпера (getIsNullFunction(), formatDate()), а вместо ручного ON DUPLICATE KEY использовать prepareMerge().
Почему после foreach по DB Result второй проход по нему ничего не даёт?
Result читается только вперёд: строки отдаются по мере fetch() и не буферизуются. Нужны два прохода — сохраните строки в массив или сделайте fetchAll().
Не сходится?
Спросите ассистента BXMax: он знает документацию и материалы сайта по этой теме.
Знаете материал лучше?
Предложите ссылку: после проверки она появится в этом разделе.
Войти, чтобы предложить