6.2 · Dépannage express

Niveau 6 · Dans la pratique

6.2Dépannage express

Objectif : transformer la maîtrise technique de PHP en réflexes de production fiables, sûrs et maintenables.
Temps estimé : 14 min · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

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ômeCauses probablesActions
« syntax error, unexpected... » à une ligne qui semble correctepoint-virgule ou accolade/parenthèse manquant à la ligne PRÉCÉDENTEvé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éevérifier method du formulaire ; tester explicitement (isset, !== '', === 0) plutôt que if ($x) (1.2, 2.1)
Faille : injection SQL possibledonnées concaténées dans une requête SQLTOUJOURS 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 Gitré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/ absentvérifier namespace ↔ chemin (PSR-4) ; composer dump-autoload ; composer install (3.3)
Requête N+1 / application lenteune requête par élément (ORM) ; requêtes non indexées ; pas de cacheeager 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 productiondisplay_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)
Erreur d'interprétation fréquente : « le playbook remplace le diagnostic ». Non. Le tableau donne des causes probables, pas un verdict : lisez le message (fichier + ligne), vérifiez, puis appliquez l'action ciblée du niveau indiqué.
Version texte du schéma (SEO / lecteurs d'écran / traduction) : Méthode du playbook : 1) Nommer le symptôme observé (syntax error, variable littérale, POST vide, injection, XSS, secret, autoload, N+1, écart prod, erreurs exposées). 2) Retenir les causes probables du tableau sans conclure seul. 3) Appliquer les actions dans l'ordre (ligne précédente, casse, isset strict, préparées, htmlspecialchars, .env, dump-autoload, index, Docker). 4) Lire fichier + ligne du message et documenter pour éviter la récidive. Leçon : un symptôme qui revient appelle un réflexe, pas des modifications au hasard.

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.

Prudence : Rappel générique : en cas de secret exposé (mot de passe codé en dur, fuite dans Git), régénérez-le immédiatement, déplacez-le en variable d'environnement et faites valider par le référent désigné ; ce guide ne donne pas d'avis juridique.

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

Checklist sortie de section
  • 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.
Auto-évaluation 1-5 : diagnostic avant modification ?messages d'erreur lus attentivement ?
Vérifiez votre compréhension

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