Middle База данных Обязательно

Прямые запросы: Connection и SqlHelper

Прямые запросы выполняются методами соединения Connection::query() и queryExecute() с обязательным экранированием значений через плейсхолдеры SqlExpression или хелпер SqlHelper. Массив $binds в методах ядра не защищает от SQL-инъекций, а методы SqlHelper обеспечивают совместимость синтаксиса при переходе между MySQL и PostgreSQL.

Прогресс хранится в этом браузере. Войдите, чтобы сохранить его в аккаунте.

Что нужно понимать

  • 1
    \Bitrix\Main\DB\Connection
  • 2
    Метод query()
  • 3
    Подготовленные запросы
  • 4
    Экранирование значений
  • 5
    Формирование условий
  • 6
    SQL-выражения

Материалы

Официальная документация

Проверь себя

Разработчик передал значения через массив 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: он знает документацию и материалы сайта по этой теме.

Знаете материал лучше?

Предложите ссылку: после проверки она появится в этом разделе.

Войти, чтобы предложить
Поделиться в Telegram
Мы используем файлы cookie для улучшения работы сайта. Продолжая использовать сайт, вы соглашаетесь с нашей политикой конфиденциальности.
AI Домовой

AI Домовой История

на связи

пишет…
Нет истории чатов
AI Домовой

Нужна авторизация

Войдите, чтобы задавать вопросы AI Домовому.

Войти