Conexión PHP (LiNUX) – MS SQL Server (NT)

NOTA: Ésta documentación es muy antigua, de diciembre de 2000. En su día me costó bastante conectar PHP con MS SQL Server y por eso me decidí a escribir éste turorial. Pero fue una necesidad puntual y desde entonces no he vuelto a trabajar con ésta combinación de tecnologías, por lo que a día de hoy (octubre de 2007) a penas recuerdo los detalles, posibles problemas, soluciones, etc. Por otra parte, en éstos siete años seguro que la tecnología ha evolucionado, tanto PHP (por aquel entonces, 4.0), como Debian (¡¡estamos hablando de una Potato!!), y es posible que no haya que recompilar PHP para añadir soporte Sybase, etc.

El caso es que sigo recibiendo ocasionalmente mails de gente que se está enfrentado a éste problema y me pide ayuda, a los que sólo puedo contestar con un “ánimo, pero ya no me acuerdo cómo iba”. Por eso me he decidido a pasar el viejo fichero HTML a una página de WordPress con su campo de comentarios: si alguien llega a ésta página y le surge una duda, que ponga un comentario; y cuando solucione un problema, igual. Así entre todos se cubrirán los huecos, dudas y diferencias entre el método a seguir hace siete años y el actual.

Dicho lo cual:

Cómo acceder desde PHP en LiNUX a una Base de Datos MS SQL Server en NT, utilizando software GPL

Hay varias formas de lograr conectar desde PHP en una máquina LiNUX a una BD MS SQL Server corriendo sobre NT. En este artículo de PHPBuilder se detallan algunas de estas formas, la mayoría de ellas utilizando unixODBC y alguna librería comercial. Aquí expondremos los pasos seguidos en el Departamento LiNUX del Laboratorio Multimedia de la Universidad de Alicante para conseguir acceder a MS SQL Server 7.0 utilizando únicamente software con licencia [L]GPL.

La máquina donde realizamos estas pruebas corría Debian Potato 2.2 con las últimas actualizaciones de seguridad (línea “deb http://security.debian.org/ potato/updates main contrib non-free” en /etc/apt/sources.list), por lo que en lugar del PHP 4.0b3 que viene en Potato utilizamos PHP 4.0.3pl1 tras actualizar el sistema utilizando apt. Puede que algunos de los pasos aquí descritos no funcionen correctamente en otras distribuciones de LiNUX o con otras versiones de PHP.

En nuestra solución, en lugar de ODBC utilizamos una librería para acceder a la base de datos utilizando directamente el protocolo de red utilizado por MS SQL y Sybase (MS compró a Sybase su base de datos para desarrollar MS SQL), conocido como TDS (Tabular DataStream). Hay varias librerías de acceso a TDS comerciales o gratuitas bajo licencias no libres para LiNUX y otros UNIX, pero en nuestro caso utilizamos FreeTDS que se distribuye bajo la licencia LGPL.

Utilizando esta librería en lugar de unixODBC y un driver para MS SQL o Sybase obtendremos mayor velocidad (trabajamos directamente sobre el protocolo nativo de la BD, no sobre varias capas de drivers y protocolos ODBC) y la instalación será bastante más sencilla.

Veamos por partes como proceder a la instalación:

  • Instalar PHP 4 en nuestro equipo

En el caso de Debian Potato, esto se puede realizar seleccionando el paquete php4 en dselect o bien con apt haciento “apt-get install php4” desde línea de comandos.

  • Obtener el código fuente de PHP 4

En Debian no hay ningún paquete con la extensión para acceder a Sybase desde PHP 4, así que vamos a tener que compilarlo nosotros. Hacer “apt-get source php4“.

  • Descomprimir y parchear PHP 4

apt-get nos habrá descargado tres ficheros: php4_4.0.3pl1.orig.tar.gz, php4_4.0.3pl1-0potato1.diff.gz y php4_4.0.3pl1-0potato1.dsc. Descomprimir php4_4.0.3pl1.orig.tar.gz en algún directorio de trabajo (p.ej. en /usr/src) y aplicarle el parche php4_4.0.3pl1-0potato1.diff.gz.

  • Obtener el código fuente de la librería FreeTDS

Descargar el código de http://www.freetds.org. La versión que utilizamos en nuestra prueba fue la 0.51, con cualquier versión posterior debería funcionar también sin problemas.

  • Instalar FreeTDS

Descomprimir el código de FreeTDS y compilar e instalar con “./configure –with-tdsver=7.0 && make && make install“. Debemos indicar la versión del protocolo TDS (opción –with-tdsver) que corresponda con nuestro servidor MS SQL Server.

  • Añadir el directorio de FreeTDS a ld.so.conf

Para hacer las librerías de FreeTDS accesibles a los programas de nuestro sistema, tendremos que añadir el directorio /usr/local/freetds/lib al fichero /etc/ld.so.conf y hacer “ldconfig“.

  • Configurar el código de PHP

Ir al directorio donde se descomprimió el código de PHP y hacer “./configure –with-sybase=shared,/usr/local/freetds“.

  • Compilar la extensión de Sybase

En lugar de compilar todo PHP, compilaremos sólo el módulo de Sybase y lo instalaremos manualmente. Para esto, vamos al directorio ext/sybase dentro del código de PHP y ejecutamos “make“. Esto creará un subdirectorio .libs con la extensión php_sybase_db.so, que habrá que copiar en /usr/lib/php4/apache y añadir como extension en /etc/php4/apache/php.ini.

  • Volver a enlazar la extensión Sybase

En nuestro caso, el fichero php_sybase_db.so obtenido tras el paso anterior no funcionó correctamente. Al intentar reiniciar Apache (y con él, PHP con la nueva extensión activa) obteníamos un error “undefined symbol: dbinit” al intentar PHP cargar el módulo, ya que no se enlazó correctamente con la libraría FreeTDS. Para enlazarlo tendremos que hacer esto en el directorio ext/sybase (es una sóla línea):

/bin/sh /usr/src/php4-4.0.3pl1/libtool --silent

--mode=link gcc -L/usr/local/freetds/lib -lsybdb -I.

-I/usr/src/php4-4.0.3pl1/ext/sybase

-I/usr/src/php4-4.0.3pl1 -I/usr/src/php4-4.0.3pl1/main

-I/usr/include/apache-1.3 -I/usr/src/php4-4.0.3pl1/Zend

-I/usr/src/php4-4.0.3pl1 -I/usr/include/db1

-I/usr/include/mysql -I/usr/local/include

-I/usr/include/ucd-snmp -I/usr/local/freetds/include

-I/usr/include/xmltok -I/usr/src/php4-4.0.3pl1/TSRM

-DEAPI -DXML_BYTE_ORDER=12 -g -O2   -o php_sybase_db.la

-avoid-version -module

-rpath /usr/src/php4-4.0.3pl1/modules  php_sybase_db.lo

  • Instalar manualmente la extensión Sybase

Copiaremos el fichero .libs/php_sybase_db.so en /usr/lib/php4/apache y añadiremos la línea “extension=php_sybase_db” en /etc/php4/apache/php.ini.

  • Reiniciar el servidor Apache

Por último, reiniciaremos el servidor Apache con “apachectl restart“.

Una vez hecho esto y si todo ha ido bien, ya podemos acceder directamente a nuestro servidor MS SQL Server utilizando la familia de funciones sybase_*().

7 pensamientos en “Conexión PHP (LiNUX) – MS SQL Server (NT)”

  1. hola mira tengo un gran problema quiero accesar a una base de datos sql server 2000 en windows desde linux en linux uso el xampp for windows osea el lampp tengo instaldo el frretds pero no se como referenciarlo a la carpeta de lampp ya que la tengo en op

  2. hola yo tengo un servidor de mu y subi la web a un host pago y no me deja conectar por medio de mssql y me da la otra opcion de conectarme a travez de ODBC y al intentar conectar con el servidor pe tira el siguiente error:

    Connection with SQL Server With Odbc MuOnline failed!
    Please check if Odbc MuOnline exist and db user and password are okey.

    no se como conectarlo si es algo de configuracion en mi pc por fabor contactenme

  3. Hola a todos, he visto este post y me parece estupendo. Y os explico cual es mi duda y mi problema:

    – tengo un servidor linux que tiene correctamente instalado el freetds. los se porque por consola puedo hacer una conexion al servidor windows que tiene un sqlserver. hacer selects…

    – el problema en si viene cuando quiero utilizar la libreria y comandos mssql ya que veo que esta bien escrito el codigo pero me devuelve un unable to connect to server.

    me gustaria si alguein conoce otros comandos para conectar al servidor windows. saludos y suerte :)

    sigo buscando …

  4. hola tengo un problema tengo una pagina desarrollada en php la cual tengo que ponerla en un servidor apache en debian pero tengo que conectarla a una base de datos en sql server en windows server 2003 y te agradeceria que me ayudaras a configurar la conexion y que siempre me manda error

  5. Buenas, tengo un problema, he internatdo conectarme a una base de datos sql desde un aplicacion web alojada en UNIX.
    Que necesito configurar para hacer ese trabajo.

    saludos

  6. Cordial saludo a todos tengo un gran problemita, desde hace rato e querido configurar sql server con wordpress y no e dado con la conexion… evisto que en la misma pag hay un tuto pero lo e seduido al pie de la letra y no doy, le agradesco si me puedes ayudar…

    1. Hola Ricardo

      Este tutorial es de diciembre del 2000… prehistoria. :-) Es muy probable que la forma de configurar esto haya cambiado desde entonces. Siento no poder ser de más ayuda.

Deja un comentario