Yandex Metrika
sanches.free

Работа с базой данных в Bitrix D7: класс Connection

Связка с ядром

В типовом приложении основная масса запросов идёт через ORM таблицы и высокоуровневые классы модулей. Тем не менее административные задачи, отладка, временные импорты и интеграции порой быстрее закрыть низкоуровневым API. Точкой входа в D7 становится объект Bitrix\\Main\\DB\\Connection, который можно взять у стартового приложения.

Основная и именованная базы

Дефолтный пул читают без аргумента. Дополнительный задаёт тем же методом строкой ключа из секции подключений (имя второго блока массива connections в /bitrix/.settings.php или переопределениях через окружение). Если ключа нет, при создании упадёте уже на этапе разбора конфигурации — это нормальная диагностика опечаток.

use Bitrix\\Main\\Application;

$primaryLink = Application::getConnection();
$coldArchiveLink = Application::getConnection('warehouse_archive');

Селекты, одиночное число и DML без результата

Метод query() даёт объект результата; пока нужны строки, вызывают fetch(). Для простого счётчика удобнее queryScalar() — минус лишний цикл по одной ячейке. Изменение схемы или данных без ожидания набора строк обычно отправляют в queryExecute().

use Bitrix\\Main\\Application;

$conn = Application::getConnection();
$cursor = $conn->query("SELECT ID, SORT FROM staging_queue ORDER BY SORT ASC");
while ($queueRow = $cursor->fetch()) {
    echo (string)$queueRow['ID'];
}

$activeRows = (int)$conn->queryScalar("SELECT COUNT(1) FROM staging_queue WHERE IS_RUN = 'Y'");
$conn->queryExecute("INSERT INTO audit_trace(code, logged_at) VALUES('sync_ok', UNIX_TIMESTAMP())");

Для производительности на больших выборках добавляют LIMIT и нужные столбцы сразу в текст SQL. Расширенные сигнатуры некоторых версий допускали отдельные аргументы лимита — ориентируйтесь на документацию вашей редакции перед копированием старых сниппетов один в один.

Строковые параметры и SqlHelper

Динамический фрагмент, который всё-таки вставили в текст запроса, лучше прогонять через getSqlHelper()->forSql(): он режет строку до лимита длины и добавляет нужное экранирование для литералов. Полностью пользовательские конструкции безопаснее закрывают параметризацией на уровне драйвера или ORM, потому что «склеенный из кусков» SQL остаётся классической зоной риска.

use Bitrix\\Main\\Application;

$conn = Application::getConnection();
$dialectTools = $conn->getSqlHelper();
$incomingLabel = isset($_REQUEST['marker']) ? (string)$_REQUEST['marker'] : '';
$safeSnippet = $dialectTools->forSql($incomingLabel, 96);
$conn->queryExecute(
    "UPDATE staging_queue SET memo = '" . $safeSnippet . "' WHERE id = " . (int)$primaryKeyQueue
);

Что держать в голове

  • Веб-запросы к БД — горячее место: избегайте «сырой» интерполяции без типизации и санитизации.
  • Долгоживущие соединения к дополнительным инстансам проверьте под нагрузкой: пул уже управляется приложением, лишних ручных pconnect не нужно.
  • Смесь старого $DB и D7 возможна только на переходном коде — для нового лучше оставаться на Connection.

Итог

Application::getConnection() централизует доступ к нужному пулу, а связка query/queryScalar/queryExecute покрывает большинство сценариев низкой обвязки. Оставляйте прямые SQL только там, где ORM уже мешает, и не забывайте про параметры вместо ручной склейки значений.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии