PHP me da error… ¿y ahora?

Cuando estás comenzando con php es muy común encontrarte ante alguna situación similar a esta:

«por algún motivo no puedo insertar datos ni actualizar ni borrar.
Me da un error en las lineas 51 y 52″

«estoy queriendo insertar un string en una base de datos pero me da error, no me reconoce el formato de la hora»

«estoy haciendo un select php con un where, pero no me muestra los resultados, me da error

Seguramente te estarás preguntando qué puede estar pasando y más importante: ¿¿cómo resolverlo??

Hay pocas cosas más desesperantes que probar y probar y que nada funcione…

Te tengo buenas noticias: la solución está más cerca de lo que parece.

Lo primero que hay que hacer en una situación como esta es respirar hondo, tal vez dar una pequeña vuelta alrededor del escritorio y volver con la cabeza más fresca.

Una vez pasada la desesperación tenés que comprender algo fundamental:

No todos los errores son iguales

Con esto quiero decir que «me da error» ayuda poco cuando se trata de encontrar una solución.

Hay que comprender la causa del problema para avanzar.

Es como cuando vas al médico: si todo lo que el profesional sabe es que te sentís mal es difícil que te pueda curar.

Cómo encontrar la causa del error

Lo primero que necesitás es comprender exactamente cuál es el error.

Usualmente, cuando un programa no completa su ejecución, en algún lado se guarda información de qué fue lo que sucedió.

Dependiendo de la configuración es posible que esa información esté directo frente a tus ojos, a través de un mensaje de error en la pantalla:

O que se esconda detrás de un mensaje algo genérico como:

En este caso no significa que esta es toda la información que vas a obtener, sólo que vas a tener que buscar un poco más, probablemente en los archivos de log del servidor web.

Los mensajes pueden parecer un poco difíciles de leer e interpretar, especialmente si no sabés inglés, pero si les prestás atención notarás que son muy informativos.

Cerca del 80% de los errores de php se pueden comprender simplemente leyendo el mensaje. Clic para tuitear

Veamos algunos ejemplos.

Call to undefined function

Fatal error: Uncaught Error: Call to undefined function sqlsrv_query() in /home/mauro/Code/sunat/cambio.php on line 4

Desmenucemos un poco el mensaje.

La primera parte dice Fatal error.

Suena feo ¿no? Error fatal… tranquilo, no se murió nadie, simplemente significa que se ha producido un error que impide que el script siga ejecutándose.

Luego vemos que dice Uncaught error.

Uncaught significa «no atrapado», lo que da una idea de que los errores pueden atraparse… tema un poco avanzado para este momento, por lo pronto dejémoslo de lado.

Y ahora sí llegamos a la parte jugosa: Call to undefined function sqlsrv_query().

Este es realmente el problema: se está intentando llamar a una función que no ha sido definida aún (o al menos, el intérprete no la conoce).

¿Cuál es la función desconocida? sqlsrv_query.

En php existen dos tipos de funciones:

  1. Propias del lenguaje (o de librerías escritas en C)
  2. Definidas por el programador (vos)

El caso de sqlsrv_query es el primero, pero si intentaras llamar a una función tuya que el intérprete desconoce el problema sería el mismo.

Así que aquí tenemos la primera pista.

Luego tenemos otros dos datos muy importantes:

in /home/mauro/Code/sunat/cambio.php

Está indicando cuál es exactamente el archivo que se estaba ejecutando cuando el problema se presentó.

Por último on line 4 te está indicando cuál fue exactamente la línea que disparó el error.

Con todo esto tenés bastante de dónde agarrarte: sabés qué línea de qué archivo tenés que ir a mirar… no está mal, ¿cierto?

Ahora vamos al caso específico.

Si no sabés mucho sobre la función sqlsrv_query siempre tenés un aliado poderoso: el viejo y querido Google.

Una búsqueda simple te va a dar estos resultados:

Y ya que apareció un link a la página oficial de php.net, yo te diría que lo sigas a ver qué aparece :).

Leyendo un poco vas a encontrar que la función sqlsrv_query pertenece a la extensión SQLSRV.

Como el resto de las extensiones, puede ser habilitada o deshabilitada en la configuración de PHP (el famoso archivo php.ini).

Así que una posibilidad es que la librería no esté instalada y/o habilitada.

Sólo lo vas a saber mirando cómo está tu instalación de php.

Undefined variable

Notice: Undefined variable: ejecutar in C:\wamp\www\demo\php\insertar.php on line 19

Acá lo que está diciendo el intérprete está diciendo:

  1. Que hay una variable no definida llamada ejecutar (Undefined variable: ejecutar)
  2. Que el problema aparece en la línea 19 del archivo C:\wamp\www\demo\php\insertar.php

Momento.

¿No era que en PHP no hacía falta definir las variables?

¿En qué quedamos?

Sin ver el código completo puedo inferir que en la línea 19 se está intentando usar esa variable antes de haberla asignado en algo como:

<?php

if ( $ejecutar == 'Otro ejemplo:algo' ) ...

En php la definición y la primera asignación de una variable se producen en el mismo momento.

Otro detalle interesante para notar es que el mensaje comienza con Notice (A diferencia del anterior que empezaba con Fatal Error).

PHP tiene diferentes niveles de errores, algunos más graves que otros.

Según el tipo específico del error se disparará (o no) alguna acción, como por ejemplo finalizar la ejecución del script ante la detección del error.

Object of class … could not be converted to String

Catchable fatal error: Object of class DateTime could not be converted to string

Aquí lo que está sucediendo es que se está tratando de usar un objeto de tipo DateTime en el contexto de un string… y la clase DateTime no tiene un método __toString.

Un código que podría dar este problema es:

<?php

echo 'Hoy es '.(new DateTime()).'!';

Qué hacer cuando el mensaje de error no alcanza

Claro que no siempre la vida es tan generosa… ¿Qué pasa cuando el mensaje de error no es suficiente?

¿Qué podés hacer?

Bueno… sí, es una opción, pero existen algunas mejores opciones 🙂

A veces sucede que encontrar la causa de un error requiere algo más que simplemente leer el código.

Esto sucede, por ejemplo, cuando el programa falla a veces

Tomemos un código como este:

<?php

$a = rand(1,3);

switch ($a) {
case 1:
        echo 'Hoy es: '.(new DateTime());
        break;
case 2:
        echo $a;
case 3:
        echo $a * 2;
}

echo PHP_EOL;

Estadísticamente este programa debería fallar una de cada 3 veces que es ejecutado.

¿Cuándo? Cada vez que $a == 1.

Y ¿cómo podés saber cuánto vale $a en cada ejecución?

Necesitás alguna herramienta que te permita ver su contenido.

Existen diferentes opciones:

Pero la realidad es que la mejor alternativa es no usar ninguna de ellas, si no más bien un debugger.

Qué es un debugger

Un debugger es un programa que te permite ejecutar tu código paso-a-paso.

Es decir, en lugar de correr el programa entero y, recién entonces, ver la salida y tratar de entender qué valor tenía cada variable al momento de la ejecución, con el debugger podés ver el contenido de tus variables en tiempo real.

Los más populares para PHP son

Si querés conocer más sobre cómo usar un debugger en tus aplicaciones podés seguir leyendo acá.

Si PHP te da errores no corras

La próxima vez que te encuentres ante un error de PHP (Y creeme, te va a pasar), no te desesperes.

Tomá un poco de aire y hacé un pequeño esfuerzo por comprender el mensaje de error que estás viendo.

Te sorprenderá la cantidad de veces que no necesitarás más para subsanar el problema 🙂

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

5 comentarios

  1. necesito ayuda amigo tengo un formulario creado pero no se como conectarlo a una base de datos e intentado conectarlo a localhost pero siempre me da error en alguna linea entonces arreglo las lineas y veo que todo esta muy bien y ahora solo me sigue dando error en una sola linea y la arreglo y la arreglo y nada ya no se que hacer tengo semanas en esto y estoy urgido ayudaaaaaaaaaaaaaa!

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.