Error Unable to connect to server mssql_connect()

Una de las desventajas de intentar conectar PHP con SQL Server desde linux es tener que utilizar la librería mssql. Esta librería si de algo es escasa es de mostrar errores con los cual cuando tenemos el error Warning: mssql_connect() [function.mssql-connect]: Unable to connect to server lo único que queremos es poner el grito en el cielo porque no sabemos el motivo como tal.

Como expliqué en el post Acceder desde Linux a SQL Server con PHP para instalar esta librería es necesario instalar previamente FreeTDS y esta desde la versión 0.6 viene con una utilidad llamada tsql que nos permitirá conectarnos al servidor SQL y en caso de fallo nos dará errores mucho más descriptivos.

Lo que tenemos que hacer es entrar como root a la consola de nuestro servidor y ejecutar el comando tsql, en caso del siguiente error tsql: command not found la solución es simple, hay primero que comprobar que existe el archivo y segundo incluir la ruta en la variable global PATH de linux. El archivo tsql se encuentra en /usr/local/freetds/bin, si por un casual abrimos esta carpeta y no le vemos allí es porque la distribución que hemos compilado no lo trae por defecto, en cambio si está debemos agregar la ruta al PATH de la siguiente manera export PATH=$PATH:/usr/local/freetds/bin.

Para comprobar que todo está OK ejecutamos echo $PATH y debería salirnos /sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/local/freetds/bin

Ahora si podemos ejecutar el comando pero antes recordar que el archivo freetds.conf ubicado en /usr/local/freetds/etc tiene la configuración de los servidores que nos queremos conectar

[newServer]
host = 192.168.0.0
port = 1433
tds version = auto

Para conectarnos ejecutamos tsql –S newServer –U user (tomará los datos del archivo freetds.conf), o bien por la IP tsql –H 192.168.0.0 –U user (todos los datos incluido el tds se tomarán de los valores por defecto que podemos ver ejecutando tsql –C)

Posibles errores de conexion con mssql_connect

Error 20009 (severity 9): Unable to connect: Adaptive Server is unavailable or does not exist OS error 110, "Connection timed out"

Este es el error típico de que el firewall del servidor SQL no está permitiendo las conexiones entrantes.

Error 20009 (severity 9): Unable to connect: Adaptive Server is unavailable or does not exist OS error 111, "Connection refused"

Este error significa que te estas conectando mal al servidor SQL, por ejemplo puedes estar conectandote por IP (tsql -H) con los datos por defecto en vez de conectarte utilizando tsql –S.

Si abres el SQL Managment Studio verás un error de este tipo:

Error: 17832, gravedad: 20, estado: 15. The login packet used to open the connection is structurally invalid; the connection has been closed. Please contact the vendor of the client library. [CLIENTE: IPSERVIDORWEB]

Error 20017 (severity 9): Unexpected EOF from the server OS error 115, "Operation now in progress"

Error 20002 (severity 9): Adaptive Server connection failed

Según la propia web oficial este error se produce por un equivocado número de TDS. Los números tds según la versión de SQL son los siguientes:
  • Microsoft SQL Server 6.x – 4.2
  • Microsoft SQL Server 7.0 – 7.0
  • Microsoft SQL Server 2000 – 7.1
  • Microsoft SQL Server 2005 – 7.2
  • Microsoft SQL Server 2008 – 7.2
Aunque yo en mi caso particular con Microsoft SQL Server 2008 he utilizado la 7.0 porque me daba un error leve, lo mejor es utilizar tds version = auto.

Si con todo esto seguimos teniendo errores recordar habilitar SQL Server para conexiones remotas o comprobar que estemos conectados correctamente con mssql_conect, por ejemplo para el servidor de ejemplo lo correcto es: mssql_connect(‘newSErver’,’user,’password’); estaría mal mssql_connect(‘192.168.0.0’,’user,’password’);

Comentarios

Anónimo ha dicho que…
Hola, desde mi servidor Linux soy capaz de acceder a la base de datos mediante "tsql –S newServer –U user", sin embargo, sigo obteniendo el dichoso error "mssql_pconnect(): Unable to connect to server:"

¿Qué más podría suceder?

Gracias
Reynier ha dicho que…
si puedes dejar de utilizar mssql mejor, utiliza el driver oficial sqlsrv en su lugar
Reynier ha dicho que…
También puedes intentar comprobar esto http://scriptinside.blogspot.com.es/2012/07/mssqlconnect-unable-to-connect-to-server.html