En HTML, un error casi nunca se nota: el navegador adivina y dibuja algo. PHP es
estricto: si algo está mal, avisa, y su mensaje dice qué pasó, en qué archivo y
en qué línea. Saber leerlo es la habilidad que más tiempo te va a ahorrar en la
unidad.
Dónde aparece el error
Depende de cómo ejecutaste el archivo.
Ejecutas con
El error aparece en
php archivo.php
La misma terminal, antes o entre la salida
php -S localhost:8000
La terminal del servidor. El navegador muestra una página en blanco o HTTP ERROR 500
php -S localhost:8000 -d display_errors=1
La terminal y el navegador, dentro de la página
Incorrecto: mirar solo el navegador
Ubuntu instala PHP con los errores ocultos para el navegador (es lo seguro en
un servidor real). Si la página sale en blanco y solo miras el navegador, no vas
a saber qué pasó.
Correcto: mientras programas, levanta el servidor con display_errors
php -S localhost:8000 -d display_errors=1
-d display_errors=1 cambia esa opción solo para este servidor. El mensaje
aparece en la página y además sigue en la terminal. Es el comando que usaremos
en clases.
Anatomía de un mensaje
Las tres preguntas que responde cada error
PHP Warning: Undefined variable $nombre in /home/ana/sitio/index.php on line 12
---+--- ------------+------------- ------------+------------ ^
| | | `-- ¿en qué línea?
| | `-- ¿en qué archivo?
| `-- ¿qué pasó?
`-- ¿qué tan grave? (el tipo)
Lee siempre en ese orden: el tipo te dice si la página se detuvo; la
descripción te dice qué buscar; el archivo y la línea te dicen dónde.
En el navegador se ve parecido
Con display_errors activado, el mismo error aparece dentro de la página, en
negrita: Warning: Undefined variable $nombre in /home/ana/sitio/index.php
on line 12.
Los cuatro tipos
Tipo
¿Se detiene?
Qué significa
Ejemplo
Parse error
Sí, no se ejecuta nada
El código está mal escrito: PHP no lo puede leer
Falta un ;, una comilla o una llave
Fatal error
Sí, en esa línea
El código se lee bien, pero hace algo imposible
Llamar a una función que no existe, dividir por cero
Warning
No, sigue ejecutando
Algo salió mal y el resultado probablemente está incompleto
Usar una variable que no existe, leer una posición que no está
Deprecated
No
Funciona, pero esa forma de escribirlo va a desaparecer en otra versión
Funciones antiguas de PHP
Incorrecto: ignorar un Warning porque "la página se ve"
Un Warning significa que PHP usó un valor vacío en lugar del que esperabas. La
página se ve, pero con un dato faltante. Un programa que muestra un Warning no
está terminado.
Correcto: cero mensajes antes de dar algo por terminado
Una página está lista cuando no muestra ningún mensaje de PHP, ni en el
navegador ni en la terminal del servidor.
Los errores que más vas a ver
Parse error: falta el punto y coma
<?php$curso = "Diseño Web"echo $curso;
PHP Parse error: syntax error, unexpected token "echo" in /home/ana/prueba.php on line 3
La línea 3 está bien. El ; falta en la línea 2: PHP lo nota cuando encuentra
el echo siguiente.
Parse error: una llave sin cerrar
<?phpif (true) { echo "Hola";
PHP Parse error: Unclosed '{' on line 2 in /home/ana/prueba.php on line 4
Este mensaje trae dos líneas: la llave se abrió en la 2 y el archivo terminó (línea
4) sin cerrarla.
AntesPHP Fatal error: Uncaught Error: Call to undefined function fecha() in /home/ana/prueba.php:3
La función se llama date(), no fecha(). “Después” no se imprime: el
programa se detuvo en la línea 3.
Lo que viene después de "Stack trace"
Bajo un Fatal error aparece un bloque Stack trace: #0 {main}. Es el camino de
funciones que llevó al error; mientras tus programas sean de un solo archivo,
puedes ignorarlo. Lo importante está en la primera línea.
Método para resolver un error
Lee la primera línea del mensaje, no la última.
Mira el tipo: ¿Parse (no se ejecutó nada) o Warning (se ejecutó con un hueco)?
Abre el archivo que indica (puede no ser el que estás mirando).
Ve a la línea: en VSCode, Ctrl + G y el número.
Si la línea se ve bien, revisa la anterior.
Corrige un error, guarda y recarga. Muchas veces el primer error causa los siguientes.
Correcto: copiar la descripción, no la ruta
Si vas a buscar el error en internet, copia la parte que describe el problema
(Undefined variable, unexpected token "echo"), sin la ruta de tu computador.
Es la parte que comparte todo el mundo que tuvo el mismo error.
Pruébalo
Levanta el servidor sin -d display_errors=1, provoca un error y comprueba que la página sale en blanco
Mira la terminal del servidor: el error está ahí
Levanta el servidor de nuevo con -d display_errors=1 y recarga
Error provocado: escribe mal el nombre de una variable y lee el Warning
Error provocado: llama a fecha("Y") y comprueba que lo de abajo no se ejecuta
Errores comunes
Síntoma
Causa
Solución
Página en blanco o HTTP ERROR 500
Hay un Parse o Fatal error y display_errors está apagado
Mira la terminal del servidor, o levántalo con -d display_errors=1
El error indica un archivo que no estás editando
El error está en un archivo incluido (nav.php, datos.php)
Abre el archivo que dice el mensaje
Corregiste y el error sigue igual
No guardaste el archivo, o estás editando otra copia
Ctrl + S y revisa la ruta del archivo en la pestaña de VSCode
Aparecen diez errores juntos
Uno solo provocó los demás
Corrige el primero y recarga
Checkpoint
Intenta responder antes de desplegar cada pregunta.
Tu página sale completamente en blanco. ¿Dónde está el error?
En la terminal donde corre php -S. Ubuntu oculta los errores en el navegador.
Para verlos también en la página, levanta el servidor con
php -S localhost:8000 -d display_errors=1.
¿Qué diferencia práctica hay entre un Warning y un Fatal error?
El Warning deja que el programa siga, con un valor faltante. El Fatal error lo
detiene en esa línea: nada de lo que viene después se ejecuta.
El mensaje dice Undefined variable $nombe. ¿Qué es lo primero que revisas?
El nombre: lo más probable es un error de tipeo ($nombe en vez de $nombre).
Si el nombre está bien, revisa que la variable se haya creado antes de esa línea.
Un Parse error en la línea 20 de un archivo de 20 líneas. ¿Qué sospechas?
Que algo quedó abierto más arriba: una llave, un paréntesis o una comilla. PHP
llegó al final del archivo esperando que se cerrara.