2012-05-23 14 views
16

Mam Apache 2.2.16 i PHP 5.4.3 na Linux Debian 6 x64.Natywny sterownik ODBC serwera dla Linux i PHP 5.4

Aby zainstalować sterownik ODBC Native MSSQL Server dla systemu Linux, używam następujących instrukcji: http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/

skonfigurowałem mój ODBC.INI plik w ten sposób:

[mydsn] 
Driver  = SQL Server Native Client 11.0 
Database = datbase 
Server  = xxx.xxx.xxx.xxx,port 

i moją ODBCINST.INI ten sposób:

[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 

Aby przetestować, uruchomić następujące polecenie:

$ isql -v mydsn dbusername dbpassword 

I mam sukces:

+---------------------------------------+ 
| Connected!       | 
|          | 
| sql-statement       | 
| help [tablename]      | 
| quit         | 
|          | 
+---------------------------------------+ 
SQL> 

Następnie użycie phpize zainstalować unixodbc na PHP 5.4, używając tego: (pierwsze polecenie ln -s ..., ponieważ jest używany ./ skonfigurować nie może znaleźć nagłówki PHP w domyślnej lokalizacji)

$ sudo ln -s /usr/include/php5 /usr/include/php 
$ phpize 
$ ./configure --with-pdo-odbc=unixODBC && make && make test 
$ sudo make install 

na moim phpinfo() uzyskać:

PDO support - enabled 
PDO drivers - odbc 

PDO Driver for ODBC (unixODBC) - enabled 
ODBC Connection Pooling  - Enabled, strict matching 

Teraz nadszedł czas, aby przetestować wszystko na PHP 5.4 skryptu:

<?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>"; 
    } 
?> 

Ale to nie działa ... Mam ten komunikat o błędzie:

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 

Więc moje pytanie brzmi: co to jest zdarzyć? Jakiej konfiguracji brakuje? Jak poprawnie ustawić macierzysty sterownik ODBC serwera MSSQL na Linux i PHP 5.4?

Ps .: Kiedy próbuję użyć odbc_connect() PHP mówi, że funkcja nie istnieje.

+0

Zauważ, że problem jest prosty - po prostu próbuj zaproponować sugestie, aż właściwa osoba otworzy pytanie. 1) Sprawdź uprawnienia do katalogu "nie można otworzyć" - upewnij się, że apache (lub www, lub jakikolwiek inny PHP działa) może odczytać/otworzyć ten katalog/plik. 2) Czy próbowałeś "ogólnego", a nie "unixODBC" dla PHP PDO? – Robbie

+0

Przepraszam, co miałeś na myśli przez "rodzajowy"? jak mogę to przetestować? – vinigarcia87

+0

Podczas kompilacji z opcją "--with-pdo-odbc = unixODBC" dostępna jest również wersja "--with-pdo-odbc = generic, dir, libname, ldflags, cflags" - nie ma pojęcia, czy będzie działać jako Nigdy tego nie robiłem, ale po prostu rzuciłem coś na ciebie, żeby spróbować, jeśli nikt nie daje żadnych wskazówek. – Robbie

Odpowiedz

0

Nigdy nie miałem okazji sam tego spróbować, ale słyszałem, że php5-sybase działa dobrze, co, jak wiem, jest dostępne zarówno dla Debiana, jak i Ubuntu w repozytoriach.

1

tej samej konfiguracji, z wyjątkiem 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 

ponawiania po usunięciu tej linii:

Threading=1 

A skrypt php działa dobrze dla mnie.

Mam nadzieję, że to może ci pomóc.

5

Wiem, że to trochę późno, ale od kiedy uderzyć ten wątek podczas walić głową o dokładnie tej samej kwestii tutaj są pewne sugestie dla nikogo z systemem do niej w przyszłości :-)

1) sprawdzania uprawnień libsqlncli-11.0.so.1790.0 się upewnić co użytkownik Apache działa jak do niego dostęp (powinien przeczytać i wykonać)

2) Użyj ldd, aby sprawdzić, czy nie ma żadnej zależności - na podstawie faktu, że isql działa powyżej, powiedziałbym, że są one w porządku (wskazówka: szukasz "nie znaleziono"):

ldd /opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0

3) Spróbuj uruchomić swój skrypt php z wiersza poleceń zamiast z Apache. Jeśli to działa, przejdź do zatrzymania 4. Jeśli tak nie jest, sugerowałbym przejście przez strace, aby zobaczyć, co faktycznie robi.

4) To jest ten, który zrobił to dla mnie! Spróbuj wyłączyć SELinux (tzn. Ustawić tryb wymuszania/permisywny) i ponownie przejść do strony w Apache. Nie jestem pewien, co dokładnie blokowało (nie miałem jeszcze czasu ani ochoty, aby dostać się do szczegółów), ale jak tylko wszystko było gotowe, wszystko działało jak czar. Dla każdego, kto ma na to ochotę, możesz go zagłębić i dowiedzieć się, jak to naprawić, nie wyłączając całkowicie :-)

Dokładne polecenia wyłączania SELinux mogą się różnić w zależności od systemu operacyjnego, ale dla mnie (na CentOS) to działało :

http://rbgeek.wordpress.com/2012/08/06/how-to-disable-selinux-on-centos-without-rebooting/

Powodzenia!

Powiązane problemy