Работа с MSSQL из PHP

Laravel (PHP 7.4)

Устанавливаем необходимые пакеты, как написано тут. Или сниппет для Dockerfile:

RUN apt-get update && \
    apt-get install -y gnupg && \
    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

Если возникает ошибка SSL, можно понизить версию SSL как написано тут:

sed -i -E 's/(CipherString\s*=\s*DEFAULT@SECLEVEL=)2/\11/' /etc/ssl/openssl.cnf

Проверить, что PHP расширение установлено:

php -m | grep pdo_sqlsrv

Проверить подключение из bash:

sqlcmd -S mssql-server.host.tld -U user -P password -d database_name -Q "SELECT @@VERSION"

Или из PHP, предварительно прописав подключение sqlsrv:

DB::connection("sqlsrv")->select("select @@VERSION");

Через mssql_connect (PHP 5, устаревший способ)

Этот способ устарел, и оставлен для истории.

Для корректной загрузки бинарных данных необходимо исправить конфигурацию, увеличив лимит с 4096 до 2147483647:

php.ini
mssql.textlimit = 2147483647
mssql.textsize = 2147483647

Подключение, выбор базы данных и получение результатов

$servername = 'server.name';
$username = 'username';
$password = 'password';
 
$link = mssql_connect($servername, $username, $password);
 
mssql_select_db('DBNAME', $link);
 
$resp = mssql_query('SELECT * FROM Table');
while($row = mssql_fetch_assoc($resp)) {
  echo var_dump($row).PHP_EOL;
}
mssql_free_result($resp);
  • mssql_fetch_object - в виде объекта

Экранирование

Аналог addslashes и mysql_real_escape_string:

mssql_escape.php
function mssql_escape($data) {
  if (!isset($data) or empty($data)) return '';
  if (is_numeric($data)) return $data;
 
  $non_displayables = array(
    '/%0[0-8bcef]/',            // url encoded 00-08, 11, 12, 14, 15
    '/%1[0-9a-f]/',             // url encoded 16-31
    '/[\x00-\x08]/',            // 00-08
    '/\x0b/',                   // 11
    '/\x0c/',                   // 12
    '/[\x0e-\x1f]/'             // 14-31
  );
  foreach ( $non_displayables as $regex )
    $data = preg_replace($regex, '', $data);
  $data = str_replace("'", "''", $data);
  return $data;
}
Печать/экспорт