Errores driver SQL Server para PHP

En este post voy a describir algunos de los errores menos comunes que nos podemos encontrar utilizando el driver de SQL server para PHP elaborado por Microsoft. Son errores poco comunes y poco descriptivos en la información, no son los errores típicos de inserción de datos duplicados o de actualizaciones erróneas.

Este post es un poco más específico y en el voy a mostrar errores más bien de conexión o errores que de aparecer deberíamos tirarnos de los pelos por su gravedad ya no solo de instalación del servidor sino de vulnerabilidad con los datos.

Para mostrar los errores y warnings este drive de Microsoft para PHP nos presenta la función sqlsrv_errors las cual nos devuelve un array con todos los errores captados en la última ejecución, para cada error hay 3 parámetros fundamentales. SQLSTATE, código y mensaje. Para un listado de los posibles SQLSTATE podemos consultar el siguiente listado, como estos son para errores que se originan en el controlador ODBC, los valores SQLSTATE son devueltos por la conexión ODBC y existen discrepancias entre las versiones 2.x y 3.x del driver (aquí tenemos una tabla que correlaciona estos códigos entre una versión y la otra).

SQLSTATE: 08S01
CODE: 121
MESSAGE: TCP Provider: The semaphore timeout period has expired. 
MESSAGE: Communication link failure

SQLSTATE: 08S01
CODE: 258
MESSAGE: TCP Provider: Timeout error [258].
MESSAGE: Communication link failure

Estos 2 errores se producen por un fallo en la red que ralentiza la comunicación con el servidor de SQL Server, son errores debidos a que el tiempo de espera ha sido superado por una conexión de red lenta. Puede ser un caso puntual y si no va acompañado de más errores y no es habitual no deberíamos preocuparnos demasiado con él.

SQLSTATE: 08S02
CODE: -1
MESSAGE: Proveedor de SMux: La conexión física es inservible [xFFFFFFFF]. 
MESSAGE: No se puede abrir una sesión lógica

SQL STATE: HY000
CODE: 7105
MESSAGE: The Database ID 8, Page (1:153792), slot 59 for LOB data type node does not exist. 
This is usually caused by transactions that can read uncommitted data on a data page. 
Run DBCC CHECKTABLE.

SQLSTATE: HY000
CODE: 605
MESSAGE: Attempt to fetch logical page (1:154360) in database 5 failed. 
It belongs to allocation unit 72057594046119936 not to 72057594130923520.

SQLSTATE: HY000
CODE: 0
MESSAGE: Error sin especificar en SQL Server. Es posible que el servidor diera por terminada la conexión.

SQLSTATE: 22007
CODE: 211
MESSAGE: Possible schema corruption. Run DBCC CHECKCATALOG.

Estos 5 errores anteriores son graves, representan un fallo general de la base de datos, no solo a nivel de conexión sino que pueden llegar a implicar una pérdida de datos, es muy difícil decir el origen de los mismos pero hay que comenzar con apagar el servidor y restaurar una copia de seguridad de los datos, revisar los logs e intentar descifrar el origen de los mismos.

SQLSTATE: 08S01
CODE: 10054
MESSAGE: TCP Provider: An existing connection was forcibly closed by the remote host. 
MESSAGE: Communication link failure

Este error siempre lo recibiremos cuando se está ejecutando una consulta SQL y en ese momento apagamos el servidor SQL Server.

SQLSTATE: IMSSP
CODE: -14
MESSAGE: An invalid parameter was passed to sqlsrv_query.

Este error ocurre durante el proceso de apagado e inicio del servidor SQL cuando el script PHP intenta conectarse al mismo y no recibe respuesta de su parte.

SQLSTATE: 42000
CODE: 105
MESSAGE: Unclosed quotation mark after the character string ' WHERE a=b'.

Este es el único de los errores mostrados que no pertenece a la categoría de error de conexión, no es más que un error de sintaxis cuando incluimos en nuestra consulta alguna comilla de más sin escapar la misma.

Comentarios