Содержание
Работа с 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; }