Yandex Metrika
sanches.free

MSSQL из PHP: sqlsrv/pdo_sqlsrv, Docker и очень старый mssql_*

Современный путь: драйверы Microsoft

Для поддерживаемых версий PHP Microsoft публикует готовые инструкции для Ubuntu/Debian: ключ репозитория, пакет msodbcsql17 (или новее) и расширения sqlsrv/pdo_sqlsrv. В Docker часто копируют собранный .so из релиза msphpsql и подключают через drop-in в conf.d.

Пример фрагмента Dockerfile

RUN apt-get update && apt-get install -y gnupg curl && \
    curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - && \
    curl https://packages.microsoft.com/config/ubuntu/19.10/prod.list > /etc/apt/sources.list.d/mssql-release.list && \
    apt-get update && ACCEPT_EULA=Y apt-get install -y msodbcsql17 && \
    curl -L https://github.com/microsoft/msphpsql/releases/download/v5.9.0/Debian10-7.4.tar | \
    tar -xO Debian10-7.4/php_pdo_sqlsrv_74_nts.so > \
    /usr/local/lib/php/extensions/no-debug-non-zts-20190902/php_pdo_sqlsrv_74_nts.so && \
    echo extension=php_pdo_sqlsrv_74_nts.so > /usr/local/etc/php/conf.d/sqlsrv.ini && \
    php -m | grep pdo_sqlsrv

Версии тарбола и каталога расширений подставляйте под свой образ PHP.

Ошибки TLS/OpenSSL

На старых OpenSSL иногда помогает снижение SECLEVEL в /etc/ssl/openssl.cnf — это компромисс безопасности, применять только осознанно на изолированных контурах.

Проверки

php -m | grep pdo_sqlsrv
sqlcmd -S host -U user -P pass -d db -Q "SELECT @@VERSION"

В Laravel после настройки соединения sqlsrv: DB::connection('sqlsrv')->select('select @@VERSION');

Наследие PHP 5 и mssql_*

Расширение mssql_* удалено из современных сборок; остаётся только как историческая справка. Для бинарных полей требовались лимиты:

mssql.textlimit = 2147483647
mssql.textsize = 2147483647
$link = mssql_connect($server, $user, $pass);
mssql_select_db('DBNAME', $link);
$resp = mssql_query('SELECT * FROM Table', $link);
while ($row = mssql_fetch_assoc($resp)) {
    var_dump($row);
}
mssql_free_result($resp);

Экранирование для старого API

Если по какой-то причине остались запросы через устаревший слой, строки экранируют удвоением одинарных кавычек и вычищением управляющих символов — но лучше перейти на параметризованные запросы ODBC/sqlsrv.

Итог

Новые проекты ставят на sqlsrv/pdo_sqlsrv и проверяют цепочку через sqlcmd. mssql_connect упоминаем только при поддержке легаси.

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

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

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