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. Share on XVeamos 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:
- Propias del lenguaje (o de librerías escritas en C)
- 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:
- Que hay una variable no definida llamada ejecutar (
Undefined variable: ejecutar
) - 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
- XDebug (Mi favorito)
- ZendDebugger
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 🙂
- Cómo agregar una página de error 500 en un proyecto PHP - 31/10/2024
- ¿Cuántos contenedoresnecesita tu php? - 28/10/2024
- Cuál es el mejor framework PHP para hacer APIs REST - 25/10/2024
como configurar el starttls en php ??
Hola Verónica:
Podrías darme algo más de contexto sobre lo que estás queriendo lograr?
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!
Hola Luichi:
Si pudieras compartir tu código y el error que ves probablemente pueda darte alguna pista 😉