🔧 Fonctions PHP Essentielles

Le guide complet

Formation DWWM - Les fonctions qu'on utilise TOUT le temps

2025 - 2026

Au programme aujourd'hui

  • 📝 Chaînes de caractères : trim, strlen, substr...
  • 📋 Tableaux : count, array_push, in_array...
  • ✅ Vérifications : isset, empty, is_numeric...
  • 📅 Dates & Temps : date, time, strtotime...
  • 🔢 Mathématiques : round, rand, min, max...
  • 🛡️ Sécurité : htmlspecialchars, filter_var...
  • 📁 Fichiers : file_exists, file_get_contents...
  • 🔍 Debug : var_dump, print_r, die...

📝 Partie 1

Fonctions de chaînes

Manipuler du texte

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

strlen($string) = Retourne le nombre de caractères
<?php
$nom = "Marie";
$longueur = strlen($nom);  // 5

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

// Vérifier qu'un champ n'est pas vide
$message = "  ";
if (strlen(trim($message)) == 0) {
    echo "Le message est vide";
}

// Compter avec espaces
$texte = "Bonjour tout le monde";
echo strlen($texte);  // 21 (espaces comptés)

// ⚠️ Attention aux accents
$mot = "été";
echo strlen($mot);  // 5 (pas 3) car UTF-8
echo mb_strlen($mot);  // 3 (correct pour UTF-8)
?>
💡 Utilisez mb_strlen() pour les caractères accentués

trim() - Supprimer les espaces ✂️

trim($string) = Enlève les espaces au début et à la fin
<?php
$nom = "  Marie  ";
echo trim($nom);  // "Marie"

// Utilisation typique avec formulaires
$email = trim($_POST['email'] ?? '');

// Variantes
$texte = "  Bonjour  ";
echo ltrim($texte);   // "Bonjour  " (gauche seulement)
echo rtrim($texte);   // "  Bonjour" (droite seulement)
echo trim($texte);    // "Bonjour" (les deux)

// 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"

// Combiné avec empty
$nom = "   ";
if (empty(trim($nom))) {
    echo "Le nom est vide ou contient que des espaces";
}
?>

strtolower() / strtoupper() - Casse 🔤

strtolower($string) = Convertit en minuscules
strtoupper($string) = Convertit en MAJUSCULES
<?php
$nom = "Marie DUPONT";

echo strtolower($nom);  // "marie dupont"
echo strtoupper($nom);  // "MARIE DUPONT"

// Comparaison insensible à la casse
$email1 = "Marie@Mail.com";
$email2 = "marie@mail.com";

if (strtolower($email1) === strtolower($email2)) {
    echo "Emails identiques";
}

// ucfirst() = Première lettre en majuscule
$prenom = "marie";
echo ucfirst($prenom);  // "Marie"

// ucwords() = Première lettre de chaque mot
$nom = "jean-paul sartre";
echo ucwords($nom);  // "Jean-Paul Sartre"

// Pour les accents
$texte = "ÉTÉ";
echo strtolower($texte);    // "ÉtÉ" (bugué)
echo mb_strtolower($texte); // "été" (correct)
?>

str_replace() - Remplacer du texte 🔄

str_replace($recherche, $remplacement, $texte)
<?php
$texte = "Bonjour Marie, comment vas-tu Marie ?";

// Remplacer simple
echo str_replace("Marie", "Jean", $texte);
// "Bonjour Jean, comment vas-tu Jean ?"

// Remplacer plusieurs valeurs
$texte = "J'aime les chats et les chiens";
$recherche = ["chats", "chiens"];
$remplacement = ["dogs", "cats"];
echo str_replace($recherche, $remplacement, $texte);
// "J'aime les dogs et les cats"

// Compter les remplacements
$texte = "test test test";
$resultat = str_replace("test", "OK", $texte, $count);
echo "Remplacé $count fois";  // 3

// Supprimer du texte (remplacer par vide)
$phone = "01-23-45-67-89";
$phone = str_replace("-", "", $phone);  // "0123456789"

// Sensible à la casse
echo str_replace("marie", "Jean", "Marie");  // "Marie" (pas de remplacement)

// Insensible à la casse
echo str_ireplace("marie", "Jean", "Marie");  // "Jean"
?>

substr() - Extraire une portion 📌

substr($string, $debut, $longueur)
<?php
$texte = "Bonjour tout le monde";

// Depuis le début
echo substr($texte, 0, 7);  // "Bonjour"

// Depuis une position
echo substr($texte, 8, 4);  // "tout"

// Depuis la fin (index négatif)
echo substr($texte, -5);    // "monde"

// Jusqu'à la fin
echo substr($texte, 8);     // "tout le monde"

// Cas pratiques
$email = "marie@example.com";
$username = substr($email, 0, strpos($email, '@'));  // "marie"

$phone = "0123456789";
$indicatif = substr($phone, 0, 2);  // "01"

// Tronquer un texte long
$description = "Un très long texte...";
if (strlen($description) > 50) {
    $description = substr($description, 0, 47) . "...";
}

// Code promo (3 premiers caractères)
$code = "PROMO2024";
echo substr($code, 0, 3);  // "PRO"
?>

strpos() - Trouver une position 🔍

strpos($haystack, $needle) = Position de la première occurrence
<?php
$email = "marie@example.com";

// Trouver la position du @
$position = strpos($email, '@');  // 5

// Vérifier si contient
if (strpos($email, '@') !== false) {
    echo "Email valide";
}

// ⚠️ PIÈGE : 0 vs false
$texte = "test";
if (strpos($texte, "t") !== false) {  // ✅ BON
    echo "Contient 't'";
}

if (strpos($texte, "t")) {  // ❌ MAUVAIS (0 = false)
    echo "Jamais affiché";
}

// Extraire le domaine d'un email
$email = "marie@example.com";
$positionAt = strpos($email, '@');
$domaine = substr($email, $positionAt + 1);  // "example.com"

// Vérifier une extension
$fichier = "photo.jpg";
if (strpos($fichier, '.jpg') !== false) {
    echo "C'est une image JPG";
}

// stripos() = insensible à la casse
echo strpos("Test", "t");   // false (pas trouvé)
echo stripos("Test", "t");  // 0 (trouvé)
?>

explode() / implode() - Découper/Joindre 🧩

explode($separateur, $string) = String → Array
implode($separateur, $array) = Array → String
<?php
// EXPLODE : String → Array
$tags = "php,html,css,javascript";
$tableau = explode(",", $tags);
// ["php", "html", "css", "javascript"]

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

// Limiter le nombre de divisions
$texte = "un:deux:trois:quatre";
$parts = explode(":", $texte, 2);
// ["un", "deux:trois:quatre"]

// IMPLODE : Array → String
$prenoms = ["Marie", "Jean", "Sophie"];
echo implode(", ", $prenoms);  // "Marie, Jean, Sophie"

// join() = alias de implode()
echo join(" - ", $prenoms);  // "Marie - Jean - Sophie"

// Construire une requête SQL
$ids = [1, 5, 12, 23];
$sql = "SELECT * FROM users WHERE id IN (" . implode(",", $ids) . ")";
// SELECT * FROM users WHERE id IN (1,5,12,23)

// CSV → Array
$csv = "Marie,Dupont,25";
$data = explode(",", $csv);
?>

Autres fonctions de chaînes utiles 🛠️

<?php
// str_repeat() - Répéter une chaîne
echo str_repeat("*", 10);  // "**********"
$ligne = str_repeat("-", 50);

// str_pad() - Compléter une chaîne
$numero = "42";
echo str_pad($numero, 5, "0", STR_PAD_LEFT);  // "00042"

// number_format() - Formater un nombre
$prix = 1234.56;
echo number_format($prix, 2, ',', ' ');  // "1 234,56"

// wordwrap() - Couper le texte
$texte = "Un très long texte qui doit être coupé";
echo wordwrap($texte, 20, "\n");

// strip_tags() - Supprimer les balises HTML
$html = "<p>Bonjour <strong>Marie</strong></p>";
echo strip_tags($html);  // "Bonjour Marie"

// nl2br() - Convertir \n en <br>
$texte = "Ligne 1\nLigne 2";
echo nl2br($texte);  // "Ligne 1<br>Ligne 2"

// sprintf() - Formater une chaîne
$nom = "Marie";
$age = 25;
echo sprintf("Je m'appelle %s et j'ai %d ans", $nom, $age);
?>

📋 Partie 2

Fonctions de tableaux

Manipuler des arrays

count() - Compter les éléments 🔢

count($array) = Nombre d'éléments dans le tableau
<?php
$fruits = ["Pomme", "Banane", "Orange"];
echo count($fruits);  // 3

// Vérifier si vide
if (count($panier) == 0) {
    echo "Panier vide";
}
// Mieux : empty()
if (empty($panier)) {
    echo "Panier vide";
}

// Tableau associatif
$utilisateur = [
    'nom' => 'Dupont',
    'prenom' => 'Marie',
    'age' => 25
];
echo count($utilisateur);  // 3

// Compter récursivement (tableaux imbriqués)
$data = [
    'user1' => ['nom' => 'Dupont', 'age' => 25],
    'user2' => ['nom' => 'Martin', 'age' => 30]
];
echo count($data);              // 2
echo count($data, COUNT_RECURSIVE);  // 6

// sizeof() = alias de count()
echo sizeof($fruits);  // 3
?>

in_array() - Vérifier la présence ✅

in_array($valeur, $array) = Vérifie si une valeur existe
<?php
$fruits = ["Pomme", "Banane", "Orange"];

if (in_array("Banane", $fruits)) {
    echo "Banane est dans le tableau";
}

// Validation de langue
$languesDisponibles = ['fr', 'en', 'es', 'de'];
$langue = $_GET['lang'] ?? 'fr';

if (!in_array($langue, $languesDisponibles)) {
    $langue = 'fr';  // Défaut
}

// Vérification stricte (type + valeur)
$nombres = [1, 2, 3, "4"];

in_array(4, $nombres);         // true (4 == "4")
in_array(4, $nombres, true);   // false (4 !== "4")

// Vérifier plusieurs valeurs
$roles = ['admin', 'editor'];
if (in_array($userRole, $roles)) {
    echo "Accès autorisé";
}

// Dans un tableau associatif (cherche les VALEURS)
$user = ['nom' => 'Dupont', 'age' => 25];
in_array('Dupont', $user);  // true
in_array('nom', $user);     // false (c'est une clé)
?>

array_push() / array_pop() - Pile 📚

array_push($array, $valeur) = Ajoute à la fin
array_pop($array) = Retire le dernier
<?php
$fruits = ["Pomme", "Banane"];

// Ajouter à la fin
array_push($fruits, "Orange");
// ["Pomme", "Banane", "Orange"]

// Ajouter plusieurs éléments
array_push($fruits, "Fraise", "Kiwi");

// Syntaxe courte (équivalent)
$fruits[] = "Orange";  // Plus simple !

// Retirer le dernier
$dernier = array_pop($fruits);
echo $dernier;  // "Kiwi"
// $fruits = ["Pomme", "Banane", "Orange", "Fraise"]

// Utilisation pratique : historique
$historique = [];
array_push($historique, "Page 1");
array_push($historique, "Page 2");
array_push($historique, "Page 3");

// Revenir en arrière
$dernierePage = array_pop($historique);

// Panier d'achat
$panier = [];
$panier[] = ['id' => 1, 'nom' => 'Produit 1'];
$panier[] = ['id' => 2, 'nom' => 'Produit 2'];
?>

array_shift() / array_unshift() - File 🎯

array_shift($array) = Retire le premier
array_unshift($array, $valeur) = Ajoute au début
<?php
$fruits = ["Pomme", "Banane", "Orange"];

// Retirer le premier
$premier = array_shift($fruits);
echo $premier;  // "Pomme"
// $fruits = ["Banane", "Orange"]

// Ajouter au début
array_unshift($fruits, "Fraise");
// $fruits = ["Fraise", "Banane", "Orange"]

// File d'attente (FIFO)
$queue = [];
array_push($queue, "Client 1");
array_push($queue, "Client 2");
array_push($queue, "Client 3");

// Servir le premier client
$client = array_shift($queue);
echo "Servir : $client";  // "Client 1"

// Pile (LIFO)
$stack = [];
array_push($stack, "A");
array_push($stack, "B");
array_push($stack, "C");

$dernier = array_pop($stack);  // "C"
?>

array_merge() - Fusionner 🔗

array_merge($array1, $array2, ...)
<?php
$fruits1 = ["Pomme", "Banane"];
$fruits2 = ["Orange", "Fraise"];

$tous = array_merge($fruits1, $fruits2);
// ["Pomme", "Banane", "Orange", "Fraise"]

// Tableaux associatifs
$user1 = ['nom' => 'Dupont', 'age' => 25];
$user2 = ['ville' => 'Paris', 'pays' => 'France'];

$user = array_merge($user1, $user2);
// ['nom' => 'Dupont', 'age' => 25, 'ville' => 'Paris', 'pays' => 'France']

// Écraser des valeurs
$defaults = ['lang' => 'fr', 'theme' => 'light'];
$userPrefs = ['theme' => 'dark'];

$config = array_merge($defaults, $userPrefs);
// ['lang' => 'fr', 'theme' => 'dark']

// Plusieurs tableaux
$a = [1, 2];
$b = [3, 4];
$c = [5, 6];
$all = array_merge($a, $b, $c);  // [1,2,3,4,5,6]

// ⚠️ Avec opérateur +
$a = ['a' => 1, 'b' => 2];
$b = ['b' => 3, 'c' => 4];

array_merge($a, $b);  // ['a'=>1, 'b'=>3, 'c'=>4] (b écrasé)
$a + $b;              // ['a'=>1, 'b'=>2, 'c'=>4] (b gardé)
?>

array_keys() / array_values() 🔑

array_keys($array) = Retourne les clés
array_values($array) = Retourne les valeurs
<?php
$user = [
    'nom' => 'Dupont',
    'prenom' => 'Marie',
    'age' => 25
];

// Récupérer les clés
$cles = array_keys($user);
// ['nom', 'prenom', 'age']

// Récupérer les valeurs
$valeurs = array_values($user);
// ['Dupont', 'Marie', 25]

// Vérifier si une clé existe
if (in_array('email', array_keys($user))) {
    echo "Email existe";
}
// Mieux : array_key_exists()
if (array_key_exists('email', $user)) {
    echo "Email existe";
}

// Obtenir la clé d'une valeur
$fruits = ['a' => 'Pomme', 'b' => 'Banane', 'c' => 'Orange'];
$cle = array_search('Banane', $fruits);  // 'b'

// Réindexer un tableau
$tableau = [5 => 'a', 10 => 'b', 15 => 'c'];
$reindexe = array_values($tableau);
// [0 => 'a', 1 => 'b', 2 => 'c']
?>

array_filter() / array_map() 🔄

array_filter($array, $callback) = Filtrer
array_map($callback, $array) = Transformer
<?php
// FILTER : Garder seulement certains éléments
$nombres = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// Garder les pairs
$pairs = array_filter($nombres, function($n) {
    return $n % 2 == 0;
});
// [2, 4, 6, 8, 10]

// Supprimer les valeurs vides
$data = ["", "test", null, "ok", 0, false];
$propre = array_filter($data);
// ["test", "ok"]

// MAP : Transformer chaque élément
$nombres = [1, 2, 3, 4, 5];

// Multiplier par 2
$doubles = array_map(function($n) {
    return $n * 2;
}, $nombres);
// [2, 4, 6, 8, 10]

// Mettre en majuscules
$prenoms = ["marie", "jean", "sophie"];
$majuscules = array_map('strtoupper', $prenoms);
// ["MARIE", "JEAN", "SOPHIE"]

// Ajouter TVA
$prix = [100, 200, 300];
$avecTVA = array_map(function($p) {
    return $p * 1.20;
}, $prix);
// [120, 240, 360]
?>

sort() / rsort() / asort() / ksort() 📊

Trier les tableaux
<?php
$nombres = [5, 2, 8, 1, 9];

// sort() - Tri croissant (réindexe)
sort($nombres);
// [1, 2, 5, 8, 9]

// rsort() - Tri décroissant (réindexe)
rsort($nombres);
// [9, 8, 5, 2, 1]

// asort() - Tri croissant (garde les clés)
$notes = ['Marie' => 15, 'Jean' => 12, 'Sophie' => 18];
asort($notes);
// ['Jean' => 12, 'Marie' => 15, 'Sophie' => 18]

// arsort() - Tri décroissant (garde les clés)
arsort($notes);
// ['Sophie' => 18, 'Marie' => 15, 'Jean' => 12]

// ksort() - Tri par clés croissant
ksort($notes);
// ['Jean' => 12, 'Marie' => 15, 'Sophie' => 18]

// krsort() - Tri par clés décroissant
krsort($notes);
// ['Sophie' => 18, 'Marie' => 15, 'Jean' => 12]

// usort() - Tri personnalisé
$produits = [
    ['nom' => 'B', 'prix' => 100],
    ['nom' => 'A', 'prix' => 200],
    ['nom' => 'C', 'prix' => 50]
];

usort($produits, function($a, $b) {
    return $a['prix'] - $b['prix'];
});
// Trié par prix croissant
?>

✅ Partie 3

Fonctions de vérification

Valider les données

isset() / empty() / is_null() 🔍

Vérifier l'existence et le contenu des variables
<?php
// isset() - Variable existe et != NULL
$nom = "Marie";
isset($nom);        // true
isset($inconnu);    // false

$test = NULL;
isset($test);       // false

// empty() - Variable "vide"
empty("");          // true
empty(0);           // true
empty("0");         // true
empty(false);       // true
empty(null);        // true
empty([]);          // true
empty("texte");     // false

// is_null() - Variable = NULL
$x = NULL;
is_null($x);        // true
is_null($nom);      // false

// Cas pratiques
// Vérifier $_GET
$id = $_GET['id'] ?? null;
if (isset($_GET['id'])) {
    // existe
}

// Vérifier formulaire
if (isset($_POST['submit'])) {
    $email = $_POST['email'] ?? '';
    
    if (empty($email)) {
        $erreur = "Email obligatoire";
    }
}
?>

is_numeric() / is_int() / is_string() 🔢

Vérifier le type des variables
<?php
// is_numeric() - Est un nombre (ou string numérique)
is_numeric(42);         // true
is_numeric("42");       // true
is_numeric("42.5");     // true
is_numeric("abc");      // false

// is_int() - Est un entier (type strict)
is_int(42);             // true
is_int("42");           // false (string)
is_int(42.5);           // false (float)

// is_float() / is_double()
is_float(42.5);         // true
is_float(42);           // false

// is_string()
is_string("test");      // true
is_string(123);         // false

// is_bool()
is_bool(true);          // true
is_bool(1);             // false

// is_array()
is_array([1, 2, 3]);    // true
is_array("test");       // false

// is_object()
$user = new stdClass();
is_object($user);       // true

// Validation pratique
$age = $_POST['age'] ?? '';

if (!is_numeric($age)) {
    $erreur = "L'âge doit être un nombre";
} elseif ($age < 0 || $age > 120) {
    $erreur = "Âge invalide";
}
?>

filter_var() - Filtrer et valider 🛡️

filter_var($var, $filter) = Valider/filtrer une variable
<?php
// Valider un email
$email = "marie@example.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "Email valide";
}

// Valider une URL
$url = "https://www.example.com";
if (filter_var($url, FILTER_VALIDATE_URL)) {
    echo "URL valide";
}

// Valider un entier
$age = "25";
if (filter_var($age, FILTER_VALIDATE_INT)) {
    echo "Entier valide";
}

// Valider avec options
$age = "25";
$options = [
    'options' => [
        'min_range' => 18,
        'max_range' => 100
    ]
];
if (filter_var($age, FILTER_VALIDATE_INT, $options)) {
    echo "Âge valide (18-100)";
}

// Valider une IP
$ip = "192.168.1.1";
if (filter_var($ip, FILTER_VALIDATE_IP)) {
    echo "IP valide";
}

// Nettoyer (filtrer)
$email = " Marie@Example.COM ";
$clean = filter_var($email, FILTER_SANITIZE_EMAIL);
// "Marie@Example.COM"

// Valider un booléen
filter_var("yes", FILTER_VALIDATE_BOOLEAN);    // true
filter_var("no", FILTER_VALIDATE_BOOLEAN);     // false
filter_var("1", FILTER_VALIDATE_BOOLEAN);      // true
?>

📅 Partie 4

Fonctions de date et temps

Gérer le temps

date() - Formater une date 📆

date($format, $timestamp)
<?php
// Date actuelle
echo date('Y-m-d');          // 2024-12-30
echo date('d/m/Y');          // 30/12/2024
echo date('d/m/Y H:i:s');    // 30/12/2024 15:30:45

// Formats courants
echo date('Y');              // 2024 (année sur 4 chiffres)
echo date('y');              // 24 (année sur 2 chiffres)
echo date('m');              // 12 (mois avec 0)
echo date('n');              // 12 (mois sans 0)
echo date('d');              // 30 (jour avec 0)
echo date('j');              // 30 (jour sans 0)

echo date('H');              // 15 (heure 24h)
echo date('h');              // 03 (heure 12h)
echo date('i');              // 30 (minutes)
echo date('s');              // 45 (secondes)

// Jour de la semaine
echo date('l');              // Monday
echo date('D');              // Mon
echo date('w');              // 1 (0=dimanche, 6=samedi)
echo date('N');              // 1 (1=lundi, 7=dimanche)

// Mois
echo date('F');              // December
echo date('M');              // Dec

// Footer copyright
echo "© " . date('Y') . " Mon Site";

// Nom de fichier avec date
$filename = "backup_" . date('Y-m-d_H-i-s') . ".sql";
// backup_2024-12-30_15-30-45.sql
?>

time() / strtotime() ⏰

time() = Timestamp actuel (secondes depuis 1970)
strtotime($date) = Convertit date en timestamp
<?php
// Timestamp actuel
$maintenant = time();  // 1735567845

// Cookie qui expire dans 30 jours
setcookie('nom', 'valeur', time() + (86400 * 30));

// Calculer des durées
$hier = time() - 86400;           // -1 jour
$demain = time() + 86400;         // +1 jour
$dansSemaineuneSemaine = time() + (86400 * 7);  // +7 jours

// strtotime() - Parser une date
echo strtotime("2024-12-30");                 // Timestamp
echo strtotime("next Monday");                // Timestamp
echo strtotime("+1 week");                    // Dans 1 semaine
echo strtotime("+2 months");                  // Dans 2 mois
echo strtotime("last day of next month");     // Dernier jour du mois prochain

// Calculer un âge
$dateNaissance = "1998-05-15";
$age = floor((time() - strtotime($dateNaissance)) / 31536000);

// Vérifier si une date est dans le futur
$dateEvent = strtotime("2025-06-15");
if ($dateEvent > time()) {
    echo "L'événement est dans le futur";
}

// Différence entre deux dates
$date1 = strtotime("2024-01-01");
$date2 = strtotime("2024-12-30");
$jours = ($date2 - $date1) / 86400;  // Nombre de jours
?>

DateTime (orienté objet) 🎯

Manipulation avancée des dates
<?php
// Créer une date
$date = new DateTime();                    // Maintenant
$date = new DateTime('2024-12-30');        // Date spécifique
$date = new DateTime('2024-12-30 15:30:00');

// Formater
echo $date->format('d/m/Y');               // 30/12/2024
echo $date->format('Y-m-d H:i:s');         // 2024-12-30 15:30:00

// Modifier
$date->modify('+1 day');                   // Ajouter 1 jour
$date->modify('-2 weeks');                 // Retirer 2 semaines
$date->modify('+3 months');                // Ajouter 3 mois

// DateInterval
$date = new DateTime('2024-12-30');
$date->add(new DateInterval('P1D'));       // +1 jour
$date->sub(new DateInterval('P2M'));       // -2 mois

// Différence entre deux dates
$date1 = new DateTime('2024-01-01');
$date2 = new DateTime('2024-12-30');
$diff = $date1->diff($date2);

echo $diff->days;                          // 364 jours
echo $diff->m;                             // 11 mois
echo $diff->format('%d jours');            // 364 jours

// Comparer des dates
$date1 = new DateTime('2024-01-01');
$date2 = new DateTime('2024-12-30');

if ($date1 < $date2) {
    echo "date1 est avant date2";
}

// Timestamp
echo $date->getTimestamp();
?>

🔢 Partie 5

Fonctions mathématiques

Calculs et nombres

round() / ceil() / floor() 📐

Arrondir les nombres
<?php
// round() - Arrondi classique
echo round(4.4);      // 4
echo round(4.5);      // 5
echo round(4.6);      // 5

// Précision
echo round(3.14159, 2);    // 3.14
echo round(1234.56, -2);   // 1200

// ceil() - Arrondi supérieur
echo ceil(4.1);       // 5
echo ceil(4.9);       // 5
echo ceil(-4.1);      // -4

// floor() - Arrondi inférieur
echo floor(4.1);      // 4
echo floor(4.9);      // 4
echo floor(-4.1);     // -5

// Cas pratiques
// Pagination
$totalArticles = 47;
$parPage = 10;
$nbPages = ceil($totalArticles / $parPage);  // 5 pages

// Prix arrondi
$prix = 19.99;
$prixArrondi = round($prix);  // 20

// Pourcentage
$note = 15.7;
$pourcentage = round(($note / 20) * 100);  // 79%

// TVA
$ht = 100;
$ttc = round($ht * 1.20, 2);  // 120.00
?>

rand() / mt_rand() 🎲

Générer des nombres aléatoires
<?php
// rand() - Nombre aléatoire
echo rand();              // Nombre quelconque
echo rand(1, 10);         // Entre 1 et 10
echo rand(0, 100);        // Entre 0 et 100

// mt_rand() - Plus rapide et meilleur
echo mt_rand(1, 100);     // Recommandé

// random_int() - Cryptographiquement sûr (PHP 7+)
echo random_int(1, 100);

// Cas pratiques
// Dé à 6 faces
$de = rand(1, 6);

// Pile ou face
$pieceouface = rand(0, 1) ? "Pile" : "Face";

// Couleur aléatoire
$r = rand(0, 255);
$g = rand(0, 255);
$b = rand(0, 255);
$color = "rgb($r, $g, $b)";

// Choisir un élément aléatoire
$fruits = ["Pomme", "Banane", "Orange", "Fraise"];
$index = rand(0, count($fruits) - 1);
$fruitAleatoire = $fruits[$index];

// Mieux : array_rand()
$index = array_rand($fruits);
$fruitAleatoire = $fruits[$index];

// Token aléatoire
$token = bin2hex(random_bytes(32));

// Code promo
$code = "PROMO" . rand(1000, 9999);  // PROMO5847
?>

min() / max() / abs() 📊

Minimum, maximum, valeur absolue
<?php
// min() - Minimum
echo min(5, 3, 8, 1);        // 1
echo min([5, 3, 8, 1]);      // 1

$a = 10;
$b = 5;
echo min($a, $b);            // 5

// max() - Maximum
echo max(5, 3, 8, 1);        // 8
echo max([5, 3, 8, 1]);      // 8

// abs() - Valeur absolue
echo abs(-5);                // 5
echo abs(5);                 // 5
echo abs(-3.14);             // 3.14

// Cas pratiques
// Limiter une valeur
$age = $_GET['age'] ?? 0;
$age = max(0, min(120, $age));  // Entre 0 et 120

// Différence (toujours positive)
$diff = abs($nombre1 - $nombre2);

// Trouver le prix le plus bas
$prix = [99, 149, 79, 199];
$moinsCher = min($prix);     // 79

// Note la plus haute
$notes = [12, 15, 8, 18, 14];
$meilleure = max($notes);    // 18

// Température (écart)
$temp1 = 20;
$temp2 = -5;
$ecart = abs($temp1 - $temp2);  // 25
?>

pow() / sqrt() / exp() / log() 🧮

Fonctions mathématiques avancées
<?php
// pow() - Puissance
echo pow(2, 3);              // 8 (2³)
echo pow(10, 2);             // 100 (10²)

// Opérateur ** (PHP 5.6+)
echo 2 ** 3;                 // 8

// sqrt() - Racine carrée
echo sqrt(16);               // 4
echo sqrt(9);                // 3

// Pythagore (hypoténuse)
$a = 3;
$b = 4;
$c = sqrt(pow($a, 2) + pow($b, 2));  // 5

// exp() - Exponentielle (e^x)
echo exp(1);                 // 2.718... (e)
echo exp(2);                 // 7.389...

// log() - Logarithme
echo log(10);                // 2.302... (ln)
echo log10(100);             // 2 (log base 10)

// Intérêts composés
$capital = 1000;
$taux = 0.05;  // 5%
$annees = 10;
$valeurFuture = $capital * pow(1 + $taux, $annees);
echo round($valeurFuture, 2);  // 1628.89
?>

🛡️ Partie 6

Fonctions de sécurité

Protéger les données

htmlspecialchars() - Anti-XSS 🛡️

htmlspecialchars($string, ENT_QUOTES, 'UTF-8')
<?php
// Échapper pour affichage HTML
$nom = "<script>alert('XSS')</script>";
echo htmlspecialchars($nom);
// Affiche : &lt;script&gt;alert('XSS')&lt;/script&gt;

// Syntaxe recommandée
$nom = $_POST['nom'] ?? '';
echo htmlspecialchars($nom, ENT_QUOTES, 'UTF-8');

// Fonction raccourcie
function e($text) {
    return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}

echo e($nom);  // Plus court !

// Dans les attributs HTML
$classe = $_GET['class'] ?? '';
?>
<div class="<?= e($classe) ?>">Contenu</div>

<?php
// Dans les valeurs de formulaire
$email = $_POST['email'] ?? '';
?>
<input type="text" value="<?= e($email) ?>">

<?php
// Tableau
$user = [
    'nom' => '<script>alert("XSS")</script>',
    'email' => 'test@mail.com'
];
?>
<p>Nom : <?= e($user['nom']) ?></p>

password_hash() / password_verify() 🔐

Hasher les mots de passe
<?php
// INSCRIPTION : Hasher le mot de passe
$password = $_POST['password'];
$hash = password_hash($password, PASSWORD_DEFAULT);
// $2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy

// Sauvegarder $hash en BDD (pas le password !)

// CONNEXION : Vérifier le mot de passe
$passwordSaisi = $_POST['password'];
$hashEnBDD = "...";  // Récupéré de la BDD

if (password_verify($passwordSaisi, $hashEnBDD)) {
    echo "Mot de passe correct";
} else {
    echo "Mot de passe incorrect";
}

// Exemple complet inscription
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $email = $_POST['email'];
    $password = $_POST['password'];
    
    // Validation
    if (strlen($password) < 8) {
        $erreur = "8 caractères minimum";
    } else {
        // Hasher
        $hash = password_hash($password, PASSWORD_DEFAULT);
        
        // Sauvegarder en BDD
        $stmt = $pdo->prepare("INSERT INTO users (email, password) VALUES (?, ?)");
        $stmt->execute([$email, $hash]);
    }
}

// ❌ NE JAMAIS FAIRE
// - Stocker les mots de passe en clair
// - Utiliser MD5 ou SHA1
// - Créer son propre algorithme
?>

hash() / hash_equals() 🔒

Hasher des données (non réversible)
<?php
// hash() - Créer un hash
$texte = "Mon texte secret";

echo hash('sha256', $texte);
echo hash('md5', $texte);      // ❌ Pas sécurisé
echo hash('sha512', $texte);

// Cas pratiques
// Token de vérification email
$token = bin2hex(random_bytes(32));
$tokenHash = hash('sha256', $token);
// Sauvegarder $tokenHash en BDD

// Vérifier le token
$tokenSaisi = $_GET['token'];
$tokenHashBDD = "...";

if (hash('sha256', $tokenSaisi) === $tokenHashBDD) {
    echo "Token valide";
}

// hash_equals() - Comparaison sécurisée (timing attack safe)
if (hash_equals($hash1, $hash2)) {
    echo "Identiques";
}

// Générer un identifiant unique
$uniqueId = hash('sha256', uniqid() . time() . rand());

// Checksum de fichier
$checksum = hash_file('sha256', 'fichier.zip');

// HMAC (avec clé secrète)
$cle = "ma_cle_secrete";
$message = "données importantes";
$hmac = hash_hmac('sha256', $message, $cle);
?>

📁 Partie 7

Fonctions de fichiers

Lire et écrire des fichiers

file_exists() / is_dir() / is_file() 📂

Vérifier l'existence de fichiers/dossiers
<?php
// file_exists() - Fichier ou dossier existe
if (file_exists('config.php')) {
    echo "Le fichier existe";
}

// is_file() - C'est un fichier
if (is_file('config.php')) {
    echo "C'est un fichier";
}

// is_dir() - C'est un dossier
if (is_dir('images')) {
    echo "C'est un dossier";
}

// Vérifier avant inclusion
$fichier = 'includes/header.php';
if (file_exists($fichier)) {
    require $fichier;
} else {
    die("Fichier introuvable");
}

// Vérifier une image uploadée
$upload = $_FILES['photo']['tmp_name'];
if (file_exists($upload) && is_file($upload)) {
    // Traiter l'upload
}

// Créer un dossier s'il n'existe pas
if (!is_dir('uploads')) {
    mkdir('uploads', 0755, true);
}

// Taille du fichier
if (file_exists('image.jpg')) {
    $taille = filesize('image.jpg');  // En octets
    $tailleKo = round($taille / 1024, 2);
    echo "$tailleKo Ko";
}
?>

file_get_contents() / file_put_contents() 📄

Lire et écrire des fichiers en une ligne
<?php
// LIRE un fichier complet
$contenu = file_get_contents('fichier.txt');
echo $contenu;

// Lire une URL
$html = file_get_contents('https://example.com');

// Lire un JSON
$json = file_get_contents('data.json');
$data = json_decode($json, true);

// ÉCRIRE dans un fichier (écrase)
file_put_contents('log.txt', 'Nouvelle entrée');

// AJOUTER à la fin (mode append)
file_put_contents('log.txt', 'Entrée 2', FILE_APPEND);

// Écrire un tableau en JSON
$users = [
    ['nom' => 'Dupont', 'age' => 25],
    ['nom' => 'Martin', 'age' => 30]
];
file_put_contents('users.json', json_encode($users));

// Log simple
$message = date('Y-m-d H:i:s') . " - Connexion utilisateur\n";
file_put_contents('logs.txt', $message, FILE_APPEND);

// Compteur de visites
$compteur = (int)file_get_contents('compteur.txt');
$compteur++;
file_put_contents('compteur.txt', $compteur);

// Cache
$cache = 'cache/page.html';
if (file_exists($cache)) {
    echo file_get_contents($cache);
} else {
    $html = genererPage();
    file_put_contents($cache, $html);
    echo $html;
}
?>

fopen() / fread() / fwrite() / fclose() 📖

Manipulation avancée de fichiers
<?php
// LIRE un fichier
$handle = fopen('fichier.txt', 'r');
if ($handle) {
    while (($ligne = fgets($handle)) !== false) {
        echo $ligne;
    }
    fclose($handle);
}

// ÉCRIRE dans un fichier
$handle = fopen('log.txt', 'w');  // 'w' = écrase
fwrite($handle, "Ligne 1\n");
fwrite($handle, "Ligne 2\n");
fclose($handle);

// AJOUTER à la fin
$handle = fopen('log.txt', 'a');  // 'a' = append
fwrite($handle, "Ligne 3\n");
fclose($handle);

// Modes d'ouverture
// 'r'  = Lecture seule
// 'w'  = Écriture (écrase)
// 'a'  = Écriture (ajoute à la fin)
// 'r+' = Lecture + Écriture
// 'w+' = Lecture + Écriture (écrase)
// 'a+' = Lecture + Écriture (ajoute)

// Lire ligne par ligne
$handle = fopen('data.csv', 'r');
while (($ligne = fgets($handle)) !== false) {
    $colonnes = explode(',', trim($ligne));
    // Traiter chaque ligne
}
fclose($handle);

// Vérifier si le fichier s'est ouvert
$handle = fopen('fichier.txt', 'r');
if (!$handle) {
    die("Impossible d'ouvrir le fichier");
}
?>

unlink() / rename() / copy() 🗑️

Supprimer, renommer, copier des fichiers
<?php
// unlink() - Supprimer un fichier
if (file_exists('temp.txt')) {
    unlink('temp.txt');
    echo "Fichier supprimé";
}

// rename() - Renommer ou déplacer
rename('ancien.txt', 'nouveau.txt');
rename('dossier1/fichier.txt', 'dossier2/fichier.txt');

// copy() - Copier un fichier
copy('original.txt', 'copie.txt');

// Cas pratiques
// Supprimer une image uploadée
$image = 'uploads/photo123.jpg';
if (file_exists($image)) {
    unlink($image);
}

// Créer une sauvegarde
$fichier = 'data.json';
$backup = 'backup_' . date('Y-m-d') . '.json';
copy($fichier, $backup);

// Renommer avec timestamp
$old = 'log.txt';
$new = 'log_' . time() . '.txt';
rename($old, $new);

// Nettoyer les fichiers temporaires
$dossier = 'temp/';
$fichiers = scandir($dossier);
foreach ($fichiers as $fichier) {
    if ($fichier != '.' && $fichier != '..') {
        unlink($dossier . $fichier);
    }
}

// mkdir() - Créer un dossier
mkdir('nouveau_dossier');
mkdir('dossier/sous/dossier', 0755, true);  // Récursif

// rmdir() - Supprimer un dossier vide
rmdir('ancien_dossier');
?>

🔍 Partie 8

Fonctions de debug

Déboguer son code

var_dump() / print_r() 🔬

Afficher le contenu des variables
<?php
$nom = "Marie";
$age = 25;
$actif = true;
$fruits = ["Pomme", "Banane", "Orange"];
$user = ['nom' => 'Dupont', 'age' => 25];

// var_dump() - Détails complets (type + valeur)
var_dump($nom);
// string(5) "Marie"

var_dump($age);
// int(25)

var_dump($actif);
// bool(true)

var_dump($fruits);
// array(3) {
//   [0]=> string(5) "Pomme"
//   [1]=> string(6) "Banane"
//   [2]=> string(6) "Orange"
// }

// print_r() - Plus lisible (pas de types)
print_r($fruits);
// Array
// (
//     [0] => Pomme
//     [1] => Banane
//     [2] => Orange
// )

// Capturer dans une variable
$debug = print_r($fruits, true);

// Afficher proprement en HTML
echo '<pre>';
print_r($user);
echo '</pre>';

// Debug en production (logs)
error_log(print_r($_POST, true));
?>

die() / exit() - Arrêter l'exécution 🛑

Stopper le script
<?php
// die() - Arrête et affiche un message
if (!file_exists('config.php')) {
    die("Erreur : Fichier de configuration manquant");
}

// exit() - Identique à die()
if (!$connexionBDD) {
    exit("Erreur de connexion à la base de données");
}

// Sans message
if ($erreur) {
    die();  // Arrête sans rien afficher
}

// Avec code de sortie (pour CLI)
exit(0);   // Succès
exit(1);   // Erreur

// Debug rapide
var_dump($_POST);
die();  // Arrête ici

// Vérifier l'authentification
session_start();
if (!isset($_SESSION['user_id'])) {
    die("Accès refusé. <a href='login.php'>Connexion</a>");
}

// Redirection + stop
header('Location: index.php');
exit;  // Important après header()

// Debug avec informations
die("DEBUG - Valeur de \$id : $id");

// En production, logger au lieu de die()
if ($erreur) {
    error_log("Erreur critique : " . $erreur);
    die("Une erreur est survenue");
}
?>

error_reporting() / ini_set() ⚙️

Configurer l'affichage des erreurs
<?php
// Afficher TOUTES les erreurs (développement)
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Masquer les erreurs (production)
error_reporting(0);
ini_set('display_errors', 0);

// Recommandé en production
error_reporting(E_ALL);
ini_set('display_errors', 0);  // Masquer
ini_set('log_errors', 1);      // Logger
ini_set('error_log', '/path/to/error.log');

// Configuration selon l'environnement
$dev = true;  // false en production

if ($dev) {
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
} else {
    error_reporting(0);
    ini_set('display_errors', 0);
}

// Logger des erreurs custom
error_log("Message d'erreur personnalisé");

// Logger avec contexte
$erreur = "Connexion BDD échouée";
error_log($erreur . " - User: " . $_SESSION['user_id']);

// Fonctions utiles
ini_get('display_errors');     // Lire une config
ini_set('memory_limit', '256M'); // Modifier la mémoire
set_time_limit(300);           // Temps d'exécution max (5 min)
?>

🔧 Partie 9

Fonctions diverses utiles

Le reste de l'essentiel

header() - Headers HTTP 📡

Envoyer des en-têtes HTTP
<?php
// ⚠️ Doit être appelé AVANT tout HTML

// REDIRECTION
header('Location: index.php');
exit;  // Toujours exit après !

header('Location: https://www.google.com');
exit;

// CONTENT-TYPE
header('Content-Type: application/json');
echo json_encode(['status' => 'success']);

header('Content-Type: text/plain');
echo "Texte brut";

header('Content-Type: image/png');
readfile('image.png');

// TÉLÉCHARGEMENT
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="document.pdf"');
readfile('document.pdf');

// CACHE
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');

// CODE HTTP
http_response_code(404);
header("HTTP/1.0 404 Not Found");

http_response_code(500);

// Empêcher le cache
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Pragma: no-cache');
?>

json_encode() / json_decode() 📦

Travailler avec JSON
<?php
// Array → JSON
$data = [
    'nom' => 'Dupont',
    'age' => 25,
    'actif' => true
];

$json = json_encode($data);
// {"nom":"Dupont","age":25,"actif":true}

// Options de formatage
$json = json_encode($data, JSON_PRETTY_PRINT);
// {
//     "nom": "Dupont",
//     "age": 25,
//     "actif": true
// }

// JSON → Array
$json = '{"nom":"Dupont","age":25}';
$data = json_decode($json, true);  // true = array
// ['nom' => 'Dupont', 'age' => 25]

// JSON → Objet
$data = json_decode($json);  // false = objet
// stdClass {nom: "Dupont", age: 25}
echo $data->nom;  // "Dupont"

// API Response
header('Content-Type: application/json');
echo json_encode([
    'status' => 'success',
    'data' => $users,
    'count' => count($users)
]);

// Sauvegarder en JSON
$users = [/* ... */];
file_put_contents('users.json', json_encode($users, JSON_PRETTY_PRINT));

// Charger depuis JSON
$json = file_get_contents('users.json');
$users = json_decode($json, true);

// Vérifier les erreurs
json_decode($json);
if (json_last_error() !== JSON_ERROR_NONE) {
    die("JSON invalide : " . json_last_error_msg());
}
?>

session_start() / session_destroy() 🔐

Gérer les sessions (vu en détail dans le cours Sessions)
<?php
// Démarrer une session
session_start();

// Stocker des données
$_SESSION['user_id'] = 42;
$_SESSION['username'] = "marie";

// Lire des données
$userId = $_SESSION['user_id'] ?? null;

// Vérifier si connecté
if (isset($_SESSION['user_id'])) {
    echo "Connecté";
}

// Supprimer une variable
unset($_SESSION['temp']);

// Détruire la session complète
session_destroy();

// Déconnexion complète
$_SESSION = [];
session_destroy();
setcookie('PHPSESSID', '', time()-3600, '/');

// Régénérer l'ID de session (sécurité)
session_regenerate_id(true);

// Vérifier si session active
if (session_status() === PHP_SESSION_ACTIVE) {
    echo "Session active";
}
?>

uniqid() / md5() / sha1() 🔑

Générer des identifiants uniques
<?php
// uniqid() - ID unique basé sur le temps
$id = uniqid();  // 6761e4f3a5c89

// Plus unique (avec préfixe)
$id = uniqid('user_');  // user_6761e4f3a5c89

// Encore plus unique
$id = uniqid('', true);  // 6761e4f3a5c89.12345678

// Cas pratiques
// Nom de fichier unique
$extension = 'jpg';
$filename = uniqid('img_') . '.' . $extension;
// img_6761e4f3a5c89.jpg

// Token de vérification
$token = uniqid() . bin2hex(random_bytes(16));

// Session ID personnalisé
$sessionId = md5(uniqid() . time() . rand());

// md5() - Hash MD5 (128 bits)
echo md5('password');  // 5f4dcc3b5aa765d61d8327deb882cf99

// ⚠️ MD5 n'est PAS sécurisé pour les mots de passe !
// Utilisez password_hash() à la place

// sha1() - Hash SHA1 (160 bits)
echo sha1('password');  // 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

// ⚠️ SHA1 non plus n'est pas sécurisé

// Utilisation acceptable de md5 : checksums, ETags
$checksum = md5_file('fichier.zip');
$etag = md5($content);
?>

sleep() / usleep() / time_sleep_until() ⏱️

Mettre en pause l'exécution
<?php
// sleep() - Pause en secondes
sleep(5);  // Pause de 5 secondes

// usleep() - Pause en microsecondes
usleep(500000);  // Pause de 0.5 secondes

// Cas pratiques
// Anti-bruteforce (ralentir les tentatives)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $email = $_POST['email'];
    $password = $_POST['password'];
    
    // Vérifier...
    
    // Ralentir les tentatives (2 secondes)
    sleep(2);
    
    if (!$valide) {
        $erreur = "Identifiants incorrects";
    }
}

// Simuler un traitement long
echo "Traitement en cours";
sleep(3);
echo "Terminé";

// Polling (vérifier régulièrement)
while (true) {
    $status = checkStatus();
    if ($status === 'complete') {
        break;
    }
    sleep(5);  // Vérifier toutes les 5 secondes
}

// time_sleep_until() - Dormir jusqu'à un timestamp
$wakeup = time() + 60;  // Dans 1 minute
time_sleep_until($wakeup);
?>

Récapitulatif 🎯

Fonctions par catégorie :

  • 📝 Chaînes : strlen, trim, strtolower, substr, explode, str_replace
  • 📋 Tableaux : count, in_array, array_push, array_merge, sort
  • ✅ Vérification : isset, empty, is_numeric, filter_var
  • 📅 Dates : date, time, strtotime, DateTime
  • 🔢 Math : round, rand, min, max, pow, sqrt
  • 🛡️ Sécurité : htmlspecialchars, password_hash, hash
  • 📁 Fichiers : file_exists, file_get_contents, fopen
  • 🔍 Debug : var_dump, print_r, die, error_log
  • 🔧 Divers : header, json_encode, session_start

TOP 20 des fonctions les plus utilisées 🏆

  1. echo / print
  2. isset()
  3. empty()
  4. count()
  5. strlen()
  6. trim()
  7. htmlspecialchars()
  8. date()
  9. time()
  10. explode()
  11. implode()
  12. in_array()
  13. array_push()
  14. str_replace()
  15. var_dump()
  16. die() / exit()
  17. header()
  18. json_encode()
  19. file_exists()
  20. session_start()

Ressources utiles 📚

  • 📖 php.net/manual/fr/ : Documentation officielle
  • 🔍 php.net/quickref.php : Référence rapide
  • 💡 PHP The Right Way : Bonnes pratiques
  • 🎓 W3Schools PHP : Tutoriels simples
  • 🔧 PHP Cheat Sheet : Antisèche PDF

Merci ! 👏

Des questions ?

🔧 Ces fonctions = 90% de votre code PHP !