2012-05-23 36 views
16

Tengo Apache 2.2.16 y PHP 5.4.3 en Linux Debian 6 x64.Controlador ODBC nativo del servidor MSSQL para Linux y PHP 5.4

Para instalar el controlador nativo de ODBC del MSSQL Server para Linux, yo uso las siguientes instrucciones: http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/

he configurado mi archivo odbc.ini esta manera:

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

y mi odbcinst.ini este manera:

[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 

Para probar, corro el siguiente comando:

$ isql -v mydsn dbusername dbpassword 

Y tengo éxito:

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

Entonces, un phpize utilizar para instalar unixODBC en PHP 5.4, utilizando la siguiente: (El primer comando, ln -s ..., porque se utiliza ./ configure no puede encontrar las cabeceras de PHP en la ubicación predeterminada)

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

en mi phpinfo() me sale:

PDO support - enabled 
PDO drivers - odbc 

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

Ahora es el momento de probar todo en un script PHP 5.4:

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

Pero esto no funciona ... Tengo este mensaje de error:

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 

Así que mi pregunta es: ¿qué es ¿ocurrir? ¿Qué configuración me falta? ¿Cómo configurar correctamente el controlador ODBC nativo del servidor MSSQL en Linux y PHP 5.4?

Ps .: Cuando trato de usar el odbc_connect() PHP dice que la función no existe.

+0

Tenga en cuenta que no hay problema, simplemente intenta ofrecer sugerencias hasta que la persona adecuada abre la pregunta. 1) Verifique los permisos en ese directorio "no se puede abrir": asegúrese de que apache (o www, o cualquier PHP que se ejecute como) pueda leer/abrir ese directorio/archivo. 2) ¿Has probado "genérico" y no "unixODBC" para PHP PDO? – Robbie

+0

lo siento, ¿qué quisiste decir con "genérico"? ¿Cómo puedo probar esto? – vinigarcia87

+0

Cuando compiló con "--with-pdo-odbc = unixODBC", también hay una versión "--with-pdo-odbc = generic, dir, libname, ldflags, cflags" - no sé si funcionará como Nunca lo hice, pero solo lancé algo para que lo pruebes si nadie más da consejos. – Robbie

Respuesta

0

Nunca tuve la oportunidad de probarlo, pero escuché que php5-sybase funciona bien, y sé que está disponible tanto para Debian como para Ubuntu en los repositorios.

1

La misma configuración, a excepción de 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 

Reintentar después de quitar esta línea:

Threading=1 

Y su script php funciona bien para mí.

Espero que esto te pueda ayudar.

5

Sé que esto es un poco tarde, pero desde que llegué a este hilo, mientras golpeando mi cabeza contra el mismo problema exacto aquí son algunas sugerencias para cualquier persona que se encuentre con él en el futuro :-)

1) Compruebe los permisos en libsqlncli-11.0.so.1790.0 para asegurarse de que cualquier usuario Apache esté ejecutándose como pueda acceder (debería haber leído y ejecutado)

2) Use ldd para verificar que ninguna de las dependencias falte, basándome en el hecho de que isql está funcionando arriba, diría que están bien (sugerencia: está buscando "no encontrado"):

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

3) Intente ejecutar su script php desde la línea de comandos en lugar de a través de Apache. Si funciona así, ve a detener 4. Si no es así, te sugiero que corras a través de strace para ver qué está haciendo realmente.

4) ¡Este es el que lo hizo por mí! Intenta desactivar SELinux (es decir, establecer en modo no obligatorio/permisivo) y presionar la página en Apache nuevamente. No estoy seguro de qué era exactamente lo que estaba bloqueando (no he tenido tiempo ni ganas de entrar en detalles todavía) pero tan pronto como se apagó todo funcionó como un amuleto. Para cualquier persona con la inclinación, podría excavar y resolver cómo solucionarlo sin deshabilitar por completo :-)

Los comandos exactos para deshabilitar SELinux pueden variar según su sistema operativo, pero para mí (en CentOS) esto funcionó :

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

Buena suerte!

Cuestiones relacionadas