6.2Resolución rápida de problemas
Lo esencial en 30 segundos
- Reflejo : un síntoma = causas probables = una acción concreta — se diagnostica antes de tocar el código.
- Leer : el mensaje de error da el archivo y la línea : el fallo suele estar en la línea anterior.
- Producción : toda diferencia entre local y línea se trata con versiones, mayúsculas, Docker y variables de entorno.
Hilo Riad — el playbook pegado junto a la pantalla
Riad guarda este playbook junto a su pantalla. Veredicto tras un año : tres líneas fueron las que más le sirvieron — el punto y coma que faltaba en la línea anterior, la consulta concatenada que abría una inyección, y el secreto que casi acaba en Git. Para cada una, acabó aplicando la secuencia (leer el error, verificar la causa, corregir) en lugar de modificar al azar.
Síntoma observado, causas verificadas, acciones en orden : el reflejo cabe en tres tiempos.
Diagnosticar antes de reiniciar
Un problema PHP rara vez se resuelve al azar : cada síntoma tiene causas típicas y una acción concreta. La tabla siguiente agrupa las situaciones más frecuentes, desde la sintaxis hasta el despliegue.
| Síntoma | Causas probables | Acciones |
|---|---|---|
| « syntax error, unexpected... » en una línea que parece correcta | punto y coma o llave/paréntesis que falta en la línea ANTERIOR | revisar la línea anterior ; activar la visualización de errores en dev ; indentar (0.3, 1.x) |
| Mi variable no se muestra (texto literal $nom) | comillas simples (literal) en lugar de dobles ; o mayúsculas de variable ($nom ≠ $Nom) | comillas dobles o concatenación ; verificar las mayúsculas exactas de la variable (1.1) |
| $_POST vacío o condición que ignora « 0 » | método incorrecto (GET vs POST) ; valor « falsy » (0, '', '0') mal comprobado | verificar el method del formulario ; comprobar explícitamente (isset, !== '', === 0) en lugar de if ($x) (1.2, 2.1) |
| Fallo : posible inyección SQL | datos concatenados en una consulta SQL | SIEMPRE consultas preparadas (PDO : marcadores + execute) ; nunca concatenación (3.1) |
| Fallo : XSS (un script inyectado se ejecuta) | datos mostrados sin escape | escapar al mostrar con htmlspecialchars() ; los motores de plantillas escapan por defecto (3.4) |
| Un secreto (contraseña de base, clave) se ha filtrado | secreto en duro o versionado en Git | regenerar de inmediato ; mover a variable de entorno (.env fuera del repositorio) ; nunca versionar .env (3.1, 5.4) |
| Class not found / autoload roto | namespace incoherente con PSR-4 ; autoloader no regenerado ; vendor/ ausente | verificar namespace ↔ ruta (PSR-4) ; composer dump-autoload ; composer install (3.3) |
| Consulta N+1 / aplicación lenta | una consulta por elemento (ORM) ; consultas sin índices ; sin caché | carga anticipada de relaciones ; indexar las columnas buscadas ; cachear (Redis) ; medir ANTES (5.2) |
| « Funciona en local pero no en línea » | entorno distinto (versión PHP, extensiones, mayúsculas Windows/Linux, config) | alinear las versiones ; rigor con las mayúsculas de archivos ; contenerizar (Docker) ; config por entorno (0.2, 5.3) |
| Errores detallados mostrados en producción | display_errors sigue activado (config de dev desplegada tal cual) | desactivar la visualización, registrar los errores ; adaptar la config a producción (5.4) |
Guion listo para decir — diagnosticar sin tocar al azar (30 s)
« Mi síntoma : [syntax error / variable literal / POST vacío / inyección / lentitud / diferencia prod]. Leo el archivo y la línea, identifico la causa probable del playbook, aplico la acción concreta y verifico. »
Modelo copiar-pegar — base de errores sana (dev vs prod)
prepare("SELECT id FROM articles WHERE id = :id");
$stmt->execute(["id" => $id]);
} catch (PDOException $e) {
error_log($e->getMessage());
echo $enProd ? "Service indisponible." : $e->getMessage();
}
TPE / presupuesto pequeño
Sin tabla formal : un síntoma, la causa probable del playbook, la acción y el responsable anotado.
Pyme Constantine
Integrar las realidades locales en el diagnóstico : versiones instaladas, puestos compartidos, picos de actividad conocidos.
Remoto / híbrido
Añadir los logs escritos inmediatos a las acciones : a distancia, un síntoma no registrado parece un sistema que funciona.
Intercultural
Explicitar las constataciones por escrito : lo que parece evidente (qué versión, qué entorno) no lo es para todos.
Desafío 48h — aplica mañana
Detecta 1 síntoma actual (error de sintaxis, POST vacío, lentitud), aplica la línea del playbook (mensaje leído + causa verificada + acción concreta).
- Sé relacionar un síntoma con sus causas probables.
- Leo archivo + línea antes de corregir.
- Conozco la referencia al nivel a profundizar para mi caso.
La página de Riad muestra un script introducido por un visitante en lugar de mostrarlo como texto. ¿Qué reflejo aplica el playbook ?
Un mismo síntoma que vuelve no son diez averías : es un reflejo que falta por fijar (línea anterior, mayúsculas exactas, isset estricto, preparadas, htmlspecialchars, .env, dump-autoload).