Подключение из 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);
Вот и всё. Дальше дело техники.