Ответ 1
Драйвер ODBC для сервера MSSQL для Linux имеет bug на нем
Чтобы правильно подключить MS SQL Server, используйте FreeTDS Подробнее см.: PHP 5.4 в Linux: как подключиться к MS SQL Server 2008?
У меня есть Apache 2.2.16 и PHP 5.4.3 на Linux Debian 6 x64.
Чтобы установить собственный драйвер ODBC для сервера MSSQL для Linux, я использую следующие инструкции: http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/
Я сконфигурировал файл odbc.ini таким образом:
[mydsn]
Driver = SQL Server Native Client 11.0
Database = datbase
Server = xxx.xxx.xxx.xxx,port
и мой odbcinst.ini следующим образом:
[SQL Server Native Client 11.0]
Description=Microsoft SQL Server ODBC Driver V1.0 for Linux
Driver=/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0
Threading=1
UsageCount=1
Чтобы проверить, я запускаю следующую команду:
$ isql -v mydsn dbusername dbpassword
И я добился успеха:
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
Затем используйте phpize для установки unixODBC на PHP 5.4, используя это: (Первая команда, ln -s..., используется потому, что. /configure не может найти заголовки php в местоположении по умолчанию)
$ sudo ln -s /usr/include/php5 /usr/include/php
$ phpize
$ ./configure --with-pdo-odbc=unixODBC && make && make test
$ sudo make install
На моем phpinfo() я получаю:
PDO support - enabled
PDO drivers - odbc
PDO Driver for ODBC (unixODBC) - enabled
ODBC Connection Pooling - Enabled, strict matching
Теперь самое время проверить все на PHP 5.4 script:
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
$conn = new PDO('odbc:DSN=mydsn;UID='.$usr.';PWD='.$psw);
$query = 'select * from my_table';
$stmt = $conn->prepare($query);
$stmt->execute();
while ($row = $stmt->fetch()) {
echo "<pre>";
print_r($row);
echo "</pre>";
}
?>
Но это не работает... Я получил это сообщение об ошибке:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[01000] SQLDriverConnect: 0
[unixODBC][Driver Manager]Can't open lib '/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0' : file not found'
in /var/www/testemssql.php:17
Stack trace:
#0 /var/www/testemssql.php(17): PDO->__construct('odbc:DSN=mydsn...')
#1 {main} thrown in /var/www/testemssql.php on line 17
Итак, мой вопрос: что происходит? Какую конфигурацию мне не хватает? Как правильно настроить собственный драйвер ODBC сервера MSSQL на Linux и PHP 5.4?
Ps: Когда я пытаюсь использовать odbc_connect() PHP, эта функция не существует.
Драйвер ODBC для сервера MSSQL для Linux имеет bug на нем
Чтобы правильно подключить MS SQL Server, используйте FreeTDS Подробнее см.: PHP 5.4 в Linux: как подключиться к MS SQL Server 2008?
Я знаю, что это немного поздно, но так как я попал в эту нить, а я ударился головой о ту же проблему, вот некоторые предложения для любого, кто работает в нее в будущем: -)
1) Проверьте разрешения на libsqlncli-11.0.so.1790.0, чтобы убедиться, что любой пользователь Apache работает, поскольку он может получить к нему доступ (должен быть прочитан и исполнен)
2) Используйте ldd, чтобы проверить отсутствие каких-либо зависимостей - на основании того, что isql работает выше, я бы сказал, что они в порядке (подсказка: вы ищете "не найден" ):
ldd/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0
3) Попробуйте запустить php script из командной строки, а не через Apache. Если он работает так, переходите к остановке 4. Если это не так, я бы предложил запустить через strace, чтобы посмотреть, что он на самом деле делает.
4) Это тот, который сделал это для меня! Попробуйте отключить SELinux (т.е. Установить не применять/разрешительный режим) и снова нажать на страницу в Apache. Я не уверен, что он блокировал (у меня не было времени или желания вдаваться в подробности), но как только это было отключено, все работало как шарм. Для тех, у кого есть склонность, я могу заглянуть туда и выяснить, как исправить это, не отключая полностью: -)
Точные команды для отключения SELinux могут отличаться в зависимости от вашей ОС, но для меня (в CentOS) это сработало:
http://rbgeek.wordpress.com/2012/08/06/how-to-disable-selinux-on-centos-without-rebooting/
Удачи!
Такая же конфигурация, за исключением odbcinst.ini:
[SQL Server Native Client 11.0]
Description=Microsoft SQL Server ODBC Driver V1.0 for Linux
Driver=/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0
UsageCount=1
Повторите попытку после удаления этой строки:
Threading=1
И ваш php script отлично работает для меня.
Надеюсь, это может вам помочь.
Если вы исправляете и перекомпилируете php с патчем, прикрепленным к https://bugs.php.net/bug.php?id=61777, это решит проблему.
Также проверьте это сообщение в блоге для примеров для DSN и использования:
У меня никогда не было возможности попробовать это сам, но я слышал, что php5-sybase отлично работает, и я знаю, что он доступен как для Debian, так и для Ubuntu в репозиториях.