6.2 · Resolución rápida de problemas

Nivel 6 · En la práctica

6.2Resolución rápida de problemas

Objetivo: transformar el dominio técnico de PHP en reflejos de producción fiables, seguros y fáciles de mantener.
Tiempo estimado: 14 min · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

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íntomaCausas probablesAcciones
« syntax error, unexpected... » en una línea que parece correctapunto y coma o llave/paréntesis que falta en la línea ANTERIORrevisar 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 comprobadoverificar el method del formulario ; comprobar explícitamente (isset, !== '', === 0) en lugar de if ($x) (1.2, 2.1)
Fallo : posible inyección SQLdatos concatenados en una consulta SQLSIEMPRE consultas preparadas (PDO : marcadores + execute) ; nunca concatenación (3.1)
Fallo : XSS (un script inyectado se ejecuta)datos mostrados sin escapeescapar al mostrar con htmlspecialchars() ; los motores de plantillas escapan por defecto (3.4)
Un secreto (contraseña de base, clave) se ha filtradosecreto en duro o versionado en Gitregenerar de inmediato ; mover a variable de entorno (.env fuera del repositorio) ; nunca versionar .env (3.1, 5.4)
Class not found / autoload rotonamespace incoherente con PSR-4 ; autoloader no regenerado ; vendor/ ausenteverificar namespace ↔ ruta (PSR-4) ; composer dump-autoload ; composer install (3.3)
Consulta N+1 / aplicación lentauna 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óndisplay_errors sigue activado (config de dev desplegada tal cual)desactivar la visualización, registrar los errores ; adaptar la config a producción (5.4)
Error frecuente de interpretación: « el playbook sustituye el diagnóstico ». No. La tabla da causas probables, no un veredicto : lee el mensaje (archivo + línea), verifica, luego aplica la acción concreta del nivel indicado.
Versión en texto del esquema (SEO / lectores de pantalla / traducción): Método del playbook : 1) Nombrar el síntoma observado (syntax error, variable literal, POST vacío, inyección, XSS, secreto, autoload, N+1, diferencia prod, errores expuestos). 2) Retener las causas probables de la tabla sin concluir solo. 3) Aplicar las acciones en orden (línea anterior, mayúsculas, isset estricto, preparadas, htmlspecialchars, .env, dump-autoload, índice, Docker). 4) Leer archivo + línea del mensaje y documentar para evitar la reincidencia. Lección : un síntoma que vuelve pide un reflejo, no modificaciones al azar.

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.

Prudencia: Recordatorio genérico : en caso de secreto expuesto (contraseña en duro, fuga en Git), regenéralo de inmediato, muévelo a variable de entorno y haz que lo valide el responsable designado ; esta guía no da asesoramiento jurídico.

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).

Lista de salida de la sección
  • 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.
Autoevaluación 1-5 : ¿diagnóstico antes de modificar ?¿mensajes de error leídos con atención ?
Comprueba tu comprensión

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).