Подключение из PHP к MSSQL

В этой статье я постараюсь изложить большинство проблем и их решений при коннекте php -> MSSQL. Как для Windows (в частвности Windows 7) так и для Linux (в частности Ubuntu).

Windows

Для windows проблема как правило заключается в некорректной библиотеке ntwdblib.dll. Обычно, если возникает проблема подключения, то библиотека либо вовсе отсутствует, либо является устаревшей.

Решение элементарно — необходимо обновить библиотеку. Я скачал её вот с этого с сайта, обновил и всё заработало. Копировать библиотеку нужно в директорию
\<Директория с Windows>\system32

Не забываем включить расширение для работы с MSSQL в php.ini.


extension=php_mssql.dll


Производим все эти нехитрые манипуляцие и рестартуем веб-сервер.

Linux (Ubuntu)


Для начала убедитесь, что у Вас есть поддержка MSSQL из php. Для работы с MSSQL вам понадобится пакет «php5-sybase».


apt-get install php5-sybase


Помимо этого PHP должен быть скомпилирован с поддержкой freetds. Да и сама конфигурация FreeTDS как правило требует корректив.

В /etc/freetds/freetds.conf добавляем такой конфиг:


[global]
; tds version = 4.2
tds version = 8.0
client charset = UTF-8


Перезапускаем web-сервер. На этом танцы с бубном для конфигирования у нас закончились. Теперь разберёмся как работать с базой.

Работа с MsSQL
Можно работать напрямую через PDO:


$dsn      = 'dblib:dbname=<DB_NAME>;host=<DB_HOST>';
$user     = '<DB_USER>';
$password = '<DB_PASS>';
$dbh      = new PDO($dsn, $user, $password);


но проще всего работать через готовую библиотеку Zend_Db:


$config = array(
        'host'     => <DB_HOST>,
        'username' => <DB_USER>,
        'password' => <DB_PASS>,
        'dbname'   => <DB_NAME>,
        'pdoType'  => <PDO_TYPE>
);

$db = Zend_Db::factory('Pdo_Mssql', $config);
$db->getConnection();


Ещё один важный момент. Который поможет Вам преодолеть большинство проблем при коннекте, особенно если придётся работать с хранимыми процедурами. Выполняем нижеприведённый запрос один раз, перед всеми другими SQL запросами к MSSQL.


$sqlSetQuery = "SET CONCAT_NULL_YIELDS_NULL ON SET ANSI_WARNINGS ON SET ANSI_PADDING ON SET ANSI_DEFAULTS ON";
$db->query($sqlSetQuery);


Вот и всё. Дальше дело техники.