Top des erreurs des développeurs PHP débutants : de A à Z
PHP est l'un des langages les plus populaires pour le développement web, mais sa flexibilité et sa faible barrière à l'entrée jouent souvent un mauvais tour aux débutants. De nombreux développeurs novices commettent les mêmes erreurs, qui entraînent des vulnérabilités, des performances lentes du site ou simplement un code illisible. Dans cet article, nous analyserons le top des erreurs des développeurs PHP — des erreurs syntaxiques aux erreurs architecturales — et montrerons comment les corriger.
1. Erreurs de sécurité : injections et XSS
Injections SQL
L'erreur la plus courante et la plus dangereuse est l'insertion directe de données utilisateur dans une requête SQL. Ne faites jamais ceci :
<?php// ❌ DANGEREUX : vulnérabilité aux injections SQL$id = $_GET['id'];$query = "SELECT * FROM users WHERE id = $id";$result = mysqli_query($conn, $query);?>Un attaquant peut passer id=1; DROP TABLE users-- et détruire la base de données. Utilisez toujours des requêtes préparées (prepared statements) :
<?php// ✅ SÉCURISÉ : requête préparée$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");$stmt->bind_param("i", $_GET['id']);$stmt->execute();$result = $stmt->get_result();?>Attaques XSS (Cross-Site Scripting)
Afficher des données utilisateur sans échappement est une autre erreur classique des développeurs PHP :
<?php// ❌ DANGEREUX : vulnérabilité XSSecho "Bonjour, " . $_GET['name'];?>Si l'utilisateur passe ?name=<script>alert('XSS')</script>, le script s'exécutera. Utilisez la fonction htmlspecialchars() :
<?php// ✅ SÉCURISÉ : échappement HTMLecho "Bonjour, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');?>2. Problèmes de types de données et de comparaison
Conversion implicite de types
PHP est un langage à typage faible, et les débutants tombent souvent sur des comportements inattendus :
<?php// ❌ ERREUR : conversion implicitevar_dump("123abc" == 123); // true ! La chaîne est convertie en nombrevar_dump(0 == "string"); // true ! La chaîne est convertie en 0?>Utilisez la comparaison stricte === au lieu de == :
<?php// ✅ CORRECT : comparaison strictevar_dump("123abc" === 123); // falsevar_dump(0 === "string"); // false?>Confusion entre empty() et isset()
De nombreux développeurs PHP débutants ne comprennent pas la différence entre ces fonctions :
<?php$var = 0;// ❌ ERREUR : empty() considère 0 comme une valeur videif (empty($var)) { echo "La variable est vide"; // Affichera ce message !}
// ✅ CORRECT : isset() vérifie uniquement l'existenceif (isset($var)) { echo "La variable existe et vaut " . $var; // Affichera "0"}?>3. Mauvaise pratique de travail avec les formulaires et les données
Ignorer la validation côté serveur
Les développeurs débutants se fient souvent uniquement à la validation côté client (JavaScript), mais un attaquant peut envoyer une requête directement au serveur. Vérifiez toujours les données côté serveur :
<?php// ❌ ERREUR : pas de validation côté serveur$email = $_POST['email'];mail($email, "Sujet", "Message"); // Peut envoyer un email à n'importe quelle adresse
// ✅ CORRECT : vérifions l'email$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);if ($email === false) { die("Email invalide");}mail($email, "Sujet", "Message");?>Traitement incorrect du téléchargement de fichiers
Une autre erreur typique des développeurs PHP est de sauvegarder des fichiers sans vérifier l'extension et le type MIME :
<?php// ❌ DANGEREUX : peut télécharger un shell PHPmove_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);
// ✅ SÉCURISÉ : vérifions l'extension$allowed = ['jpg