Conexión a SQL Server desde PHP en Linux usando ADODB

21/02/2007

Red Hat, PHP y MSSQL
Ayer acudieron a mí unos compañeros que tenían una aplicación escrita en PHP que usaba una conexión con SQL Server usando ADODB y la querían pasar a un equipo con Red Hat Enterprise 9 y PHP 4.3.9.

En esta nota cuento los pasos que tuve que realizar para instalar el módulo de PHP necesario para dar soporte a la conexión con SQL Server desde Linux.

La solución pasa por utilizar un módulo para PHP que nos permita usar los drivers FreeTDS. TDS es el protocolo usado por Sybase y por MSSQL y por tanto nos permitirán conectar una máquina Linux con MSSQL Server.

Como no tenía pensado ponerme a bajar fuentes y compilar todo el software, lo que hice fue buscar por la red algún paquete precompilado que me sirviese.

Paquetes necesarios (rpm -ihv <<paquete.rpm>>):

  • php-sybase_ct-4.3.9-alt0.cvs20040802.i586.rpm (OJO: Este no lo instalé con rpm)
  • freetds-0.62.3-1.2.el4.rf.i386.rpm
  • unixODBC-2.2.9-1.i386.rpm
  • libtool-libs-1.5.6-4.i386.rpm

Los paquetes php-sybase_ct-4.3.9-alt0.cvs20040802.i586.rpm y freetds-0.62.3-1.2.el4.rf.i386.rpm son los que realmente necesitamos, ya que son el módulo PHP que nos permite usar las librerías TDS para acceder al SQL Server y las propias librerías. El resto solamente son dependencias.

Como no me servía cómo estaba empaquetado php-sybase_ct-4.3.9-alt0.cvs20040802.i586.rpm (ya que no lo encontré para el sistema en el que estoy instalando), lo desempaqueté a mano usando el siguiente comando:

rpm2cpio php-sybase_ct-4.3.9-alt0.cvs20040802.i586.rpm | cpio -i –make-directories

Una vez desempaquetado hice lo siguiente:

  • Copié:
    usr/lib/php/4.3.9/extensions/sybase_ct.so
    a
    /usr/lib/php4/sybase_ct.so
  • Dí permisos de ejcución a la librería:
    chmod +x /usr/lib/php4/sybase_ct.so
  • Basándome en el archivo
    usr/share/php/4.3.9/extconf/sybase_ct/config
    creé el archivo
    /etc/php.d/sybase_ct.ini
    con el siguiente contenido:

    extension=sybase_ct.so

    [Sybase-CT]
    ; Allow or prevent persistent links.
    sybct.allow_persistent = On

    ; Maximum number of persistent links. -1 means no limit.
    sybct.max_persistent = -1

    ; Maximum number of links (persistent + non-persistent). -1 means no limit.
    sybct.max_links = -1

    ; Minimum server message severity to display.
    sybct.min_server_severity = 10

    ; Minimum client message severity to display.
    sybct.min_client_severity = 10

Además, resulta que en la versión de RedHat que estoy usando, SELinux está activado lo que hace que no se cargue la librería sybase_ct.so. Para corregir esto, edité el archivo /etc/selinux/config:

  • Modificando
    SELINUX=enforcing
    por
    SELINUX=permissive.

(NOTA: Para que este cambio tenga efecto hay que reiniciar el sistema.)

Ahora, desde PHP podemos realizar una conexión con SQL Server mediante ADODB usando el siguiente código:


$db = ADONewConnection('mssql');
$db->Connect($dbserver, $dbusername, $dbpassword, $dbname);

Qué comprobar si algo no funciona

Tres cosas:

  • Comprobar que tengo conexión con el sqlserver desde el equipo
    telnet <servidor.sql.server> 1433
  • Comprogar que me puedo conectar al sqlserver usando la librería TDS
    tsql -S <servidor.sql.server> -U <nombre.usuario>
    pedirá la contraseña y si todo va correcto nos acabará apareciendo el prompt

    1>

  • Habilitar la depuración de ADODB para mostrar los errores (si los hay) y las sentencias ejecutadas en PHP

    $db = ADONewConnection(’mssql’);
    $db->debug = true;
    $db->Connect($dbserver, $dbusername, $dbpassword, $dbname);

Algunos enlaces de interés

Accessing a Microsoft SQL Server database from PHP running under Linux
Making a PHP Site on Linux Work with a Microsoft SQL Server Database
RPM phone.net
How to extract all the files from an RPM package
Cannot load /etc/httpd/modules/libmod_cplusplus.so into server: /etc/httpd/modules/libmod_cplusplus.so: failed to map segment from shared object: Permission denied [FAILED]
FreeTDS User Guide: stunnel HOWTO
‘secure connection’ to SQL server. Integrated security, ssl?

7 Responses to “Conexión a SQL Server desde PHP en Linux usando ADODB”

  1. adrian velazquez Says:

    no encuentro de donde descargar e archivo php-sybase_ct-4.3.9-alt0.cvs20040802.i586.rpm que mencionas, podiras ayudarme y decirme donde lo encuentro???

    Gracias

  2. rubensa Says:

    Hola Adrian

    Puedes buscarlo, por ejemplo, en RPM phone.net o descargarlo directamente desde aquí.

  3. yo Says:

    Warning: odbc_connect() [function.odbc-connect]: SQL error: [unixODBC][Driver Manager]Data source name not found, and no default driver specified, SQL state IM002 in SQLConnect in /var/www/html/sitio/adodb/drivers/adodb-odbc.inc.php on line 60

  4. Chileno Says:

    Saludos,

    Tengo el mismo problema que expones, pero en un PC con CentOS 5, PhP 5.2.6, freetds 0.6, he seguido los pasos que indicas y no me funciona, supongo que debe ser por la versión del precompilado donde sacas el sybase_ct.so

    Si saben como hacerlo en un equipo con estas caracteristicas les agradeceria mucho que me puedan ayudar.

    Atte.

  5. Federico Says:

    necesito conectarme desde un debian a un sqlserver. Alguna idea?
    gracias.

  6. alejon Says:

    para quienes aun busquen configurar esta cosa, y no pueden desempaquetar, recomiendo 7z465.exe, fue lo unico q me resulto.

  7. Jorge Diaz Says:

    Como podría usar la misma librería, pero con un SP de la BD.

    Gracias de antemano


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: