Блог Горошко Андрея 1C-Битрикс Кросс-платформенные SQL-запросы Возможности Bitrix\Main\DB\SqlHelper

Кросс-платформенные SQL-запросы Возможности Bitrix\Main\DB\SqlHelper

Средний рейтинг
Еще нет оценок

Если вы пишете «сырые» SQL-запросы (через $connection->query), вы рискуете привязаться к конкретной базе данных (обычно MySQL). SqlHelper — это абстракция, которая генерирует правильный SQL-синтаксис для текущей активной БД.

Получить хелпер можно так:

$connection = \Bitrix\Main\Application::getConnection();
$helper = $connection->getSqlHelper();

1. Экранирование данных (forSql)

Защита от SQL-инъекций.

$userInput = "O'Reilly";
$safeInput = $helper->forSql($userInput); 

$sql = "SELECT * FROM b_user WHERE LAST_NAME = '" . $safeInput . "'";

2. Работа с датами в SQL

Разные БД по-разному работают с датами.

  • getCurrentDateTimeFunction(): Возвращает функцию текущего времени (NOW(), SYSDATE).
  • getDateToCharFunction($field): Преобразует поле даты в строку.
  • addSecondsToDateTime($seconds): Добавляет секунды к текущему времени.

$sql = "UPDATE my_table SET DATE_UPDATE = " . $helper->getCurrentDateTimeFunction();

3. Лимиты и отступы (getTopSql)

В MySQL это LIMIT, в Oracle — ROWNUM. Хелпер решает эту проблему.

$sql = "SELECT * FROM b_user ORDER BY ID DESC";
$sqlWithLimit = $helper->getTopSql($sql, 10); // Вернет SQL с ограничением в 10 записей

4. Подготовка обновлений (prepareAssignment)

Генерирует строку FIELD = ‘VALUE’, FIELD2 = ‘VALUE2’ для UPDATE запросов.

$fields = [
    'NAME' => 'New Name',
    'SORT' => 500,
    'DESCRIPTION' => "Text' with quote"
];

// Автоматически экранирует значения и формирует строку
$updateString = $helper->prepareAssignment('b_iblock_element', $fields);

$sql = "UPDATE b_iblock_element SET " . $updateString . " WHERE ID = 1";

5. INSERT IGNORE (getInsertIgnore)

// Вернет "INSERT IGNORE INTO" для MySQL или аналог для других БД
$sql = $helper->getInsertIgnore("my_table", " (ID, NAME) VALUES (1, 'Test')");

Вывод:
Даже если вы используете только MySQL, привычка использовать SqlHelper (особенно forSql и prepareAssignment) делает ваш код безопаснее и чище.

Если же вы разрабатываете тиражные решения для Маркетплейса, использование SqlHelper обязательно для совместимости с разными окружениями (включая PostgreSQL, поддержка которого активно внедряется).

SqlHelper, getSqlHelper, forSql, getQueryDate, getInsertIgnore, prepareAssignment, экранирование SQL битрикс, кросс-платформенность.

Мой рейтинг:

Добавить комментарий

Related Post

Файл .parameters.php: Полное руководство по настройкам компонента БитриксФайл .parameters.php: Полное руководство по настройкам компонента Битрикс

Средний рейтинг Еще нет оценок Файл .parameters.php — это «пульт управления» вашего компонента. Он описывает, какие настройки будут доступны в визуальном редакторе при размещении компонента на странице. Правильно составленный .parameters.php делает компонент гибким и

Работа с пользователями в Битрикс: CUser::GetList, Add, UpdateРабота с пользователями в Битрикс: CUser::GetList, Add, Update

Средний рейтинг Еще нет оценок Управление пользователями — одна из ключевых задач любой CMS. В Битрикс для этого предназначен класс CUser. Глобальный объект $USER (экземпляр этого класса) доступен на каждой странице и содержит

Создание собственных D7 ORM сущностей (таблиц) в Битрикс: Пошаговое руководствоСоздание собственных D7 ORM сущностей (таблиц) в Битрикс: Пошаговое руководство

Средний рейтинг Еще нет оценок Работать с готовыми ORM-сущностями вроде ElementTable — это хорошо, но настоящая сила D7 ORM раскрывается, когда вы создаете собственные таблицы для хранения данных вашего модуля. Давайте создадим