6.2Dépannage express
L'essentiel en 30 secondes
- Réflexe : un symptôme = des causes probables = une action ciblée — on diagnostique avant de toucher au code.
- Lire : le message d'erreur donne le fichier et la ligne : la faute est souvent à la ligne précédente.
- Production : tout écart entre local et ligne se traite par versions, casse, Docker et variables d'environnement.
Fil Riad — le playbook scotché à côté de l'écran
Riad garde ce playbook à côté de son écran. Verdict après un an : trois lignes l'ont le plus servi — le point-virgule manquant à la ligne précédente, la requête concaténée qui ouvrait une injection, et le secret qui a failli partir dans Git. Pour chacune, il a fini par appliquer la séquence (lire l'erreur, vérifier la cause, corriger) au lieu de modifier au hasard.
Symptôme observé, causes vérifiées, actions dans l'ordre : le réflexe tient en trois temps.
Diagnostiquer avant de relancer
Un problème PHP se résout rarement au hasard : chaque symptôme a des causes typiques et une action ciblée. Le tableau ci-dessous regroupe les situations les plus fréquentes, de la syntaxe au déploiement.
| Symptôme | Causes probables | Actions |
|---|---|---|
| « syntax error, unexpected... » à une ligne qui semble correcte | point-virgule ou accolade/parenthèse manquant à la ligne PRÉCÉDENTE | vérifier la ligne précédente ; activer l'affichage des erreurs en dev ; indenter (0.3, 1.x) |
| Ma variable ne s'affiche pas (texte littéral $nom) | guillemets simples (littéral) au lieu de doubles ; ou casse de variable ($nom ≠ $Nom) | guillemets doubles ou concaténation ; vérifier la casse exacte de la variable (1.1) |
| $_POST vide ou condition qui ignore « 0 » | mauvaise méthode (GET vs POST) ; valeur « falsy » (0, '', '0') mal testée | vérifier method du formulaire ; tester explicitement (isset, !== '', === 0) plutôt que if ($x) (1.2, 2.1) |
| Faille : injection SQL possible | données concaténées dans une requête SQL | TOUJOURS des requêtes préparées (PDO : marqueurs + execute) ; jamais de concaténation (3.1) |
| Faille : XSS (script injecté s'exécute) | données affichées sans échappement | échapper à l'affichage avec htmlspecialchars() ; les moteurs de template échappent par défaut (3.4) |
| Un secret (mot de passe base, clé) a fuité | secret codé en dur ou versionné dans Git | régénérer immédiatement ; déplacer en variable d'environnement (.env hors dépôt) ; ne jamais versionner .env (3.1, 5.4) |
| Class not found / autoload cassé | namespace incohérent avec PSR-4 ; autoloader non régénéré ; vendor/ absent | vérifier namespace ↔ chemin (PSR-4) ; composer dump-autoload ; composer install (3.3) |
| Requête N+1 / application lente | une requête par élément (ORM) ; requêtes non indexées ; pas de cache | eager loading des relations ; indexer les colonnes recherchées ; mettre en cache (Redis) ; profiler AVANT (5.2) |
| « Ça marche en local mais pas en ligne » | environnement différent (version PHP, extensions, casse Windows/Linux, config) | aligner les versions ; rigueur sur la casse des fichiers ; conteneuriser (Docker) ; config par environnement (0.2, 5.3) |
| Erreurs détaillées affichées en production | display_errors resté activé (config de dev déployée telle quelle) | désactiver l'affichage, journaliser les erreurs ; adapter la config à la production (5.4) |
Script prêt à dire — diagnostiquer sans toucher au hasard (30 s)
« Mon symptôme : [syntax error / variable littérale / POST vide / injection / lenteur / écart prod]. Je lis le fichier et la ligne, j'identifie la cause probable du playbook, j'applique l'action ciblée et je vérifie. »
Modèle copier-coller — base d'erreurs saine (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 / petit budget
Pas de tableau formel : un symptôme, la cause probable du playbook, l'action et le responsable noté.
PME Constantine
Intégrer les réalités locales dans le diagnostic : versions installées, postes partagés, pics d'activité connus.
Remote / hybride
Ajouter les logs écrits immédiats aux actions : à distance, un symptôme non consigné ressemble à un système qui marche.
Interculturel
Expliciter les constats par écrit : ce qui semble évident (quelle version, quel environnement) ne l'est pas pour tous.
Défi 48h — appliquez demain
Repérez 1 symptôme actuel (erreur de syntaxe, POST vide, lenteur), appliquez la ligne du playbook (message lu + cause vérifiée + action ciblée).
- Je sais relier un symptôme à ses causes probables.
- Je lis fichier + ligne avant de corriger.
- Je connais le renvoi vers le niveau à creuser pour mon cas.
La page de Riad affiche un script saisi par un visiteur au lieu de l'afficher en texte. Quel réflexe applique le playbook ?
Un même symptôme qui revient n'est pas dix pannes : c'est un réflexe manquant à ancrer (ligne précédente, casse exacte, isset strict, préparées, htmlspecialchars, .env, dump-autoload).