Исходный ODBC-драйвер MSSQL для Linux и PHP 5.4 - программирование
Подтвердить что ты не робот

Исходный ODBC-драйвер MSSQL для Linux и PHP 5.4

У меня есть 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, эта функция не существует.

4b9b3361

Ответ 2

Я знаю, что это немного поздно, но так как я попал в эту нить, а я ударился головой о ту же проблему, вот некоторые предложения для любого, кто работает в нее в будущем: -)

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/

Удачи!

Ответ 3

Такая же конфигурация, за исключением 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 отлично работает для меня.

Надеюсь, это может вам помочь.

Ответ 5

У меня никогда не было возможности попробовать это сам, но я слышал, что php5-sybase отлично работает, и я знаю, что он доступен как для Debian, так и для Ubuntu в репозиториях.