PHP : Développement Web Avancé

Configuration et Environnement

La configuration principale de PHP est gérée dans le fichier php.ini.

DirectiveUsage recommandéDescription
php.ini Configuration serveur Fichier contenant les directives (clé=valeur). Peut parfois être surchargé via ini_set() dans le script.
display_errors On (Dev) / Off (Prod) Affiche les erreurs directement dans la sortie HTML. À désactiver absolument en production pour la sécurité.
error_reporting E_ALL Définit le niveau de rapport d'erreurs. Il est conseillé de tout reporter.
memory_limit ex: 128M Taille maximale de mémoire qu'un script peut consommer.
max_execution_time ex: 30 Durée maximale (en secondes) d'exécution d'un script.

Variables, Constantes et Portée

ConceptExemple de codeDescription et Usage
Règles de nommage $ma_variable_valide = 1;
  • Doit commencer par un $.
  • Ne peut pas commencer par un chiffre.
  • Peut contenir des lettres (non accentuées), chiffres et underscores (_).
  • Est sensible à la casse ($age et $Age sont deux variables différentes).
  • Par convention, on utilise le snake_case (minuscules avec underscores).
Portée des Variables (Scope)
$a = 'a'; // Portée globale

function foo() {
    $b = 'b'; // Portée locale
    // $a n'est pas accessible ici par défaut !
}
Par défaut, les espaces ne se confondent pas :
  • Locale : Depuis l'intérieur d'une fonction, on n'a pas accès aux variables définies à l'extérieur.
  • Globale : Depuis l'extérieur, on n'a pas accès aux variables d'une fonction.
Constantes
define('DB_NAME', 'ma_base');
echo DB_NAME;
Valeur immuable (ne peut être modifiée ni détruite). La portée d'une constante est globale : on la définit hors de toute fonction, mais on peut l'utiliser partout. Par convention, toujours en MAJUSCULES.

Typage Avancé et Arrondis

PHP est un langage à typage dynamique mais permet le typage explicite (type hinting) et le mode strict.

NotionExempleDescription
Mode Strict
declare(strict_types=1);
Doit être la toute première ligne du fichier. Interdit la conversion implicite des types (jonglage) pour les appels de fonctions.
Déclaration de type
function sum(int $a, int $b): int {
    return $a + $b;
}
Permet de typer explicitement les paramètres et le retour des fonctions.
Valeurs "Falsy" false, 0, 0.0, "0", "", null, [] Toutes ces valeurs sont évaluées à false dans un contexte booléen. Attention à la chaîne "0" !

Valeurs approchées et Conversion numérique

Fonction / CastExemple de codeDescription
(int) ou intval()
$nb = (int) 1.9; // 1
$nb2 = intval(-1.9); // -1
Troncature / Casting : Convertit en entier en supprimant simplement la partie décimale (arrondi vers zéro).
round()
$nb = round(1.5); // 2
$nb2 = round(1.4); // 1
Arrondi classique : Arrondit à l'entier le plus proche.
floor()
$nb = floor(1.9); // 1
$nb2 = floor(-1.2); // -2
Arrondi inférieur : Arrondit à l'entier inférieur (vers l'infini négatif).
ceil()
$nb = ceil(1.1); // 2
$nb2 = ceil(-1.9); // -1
Arrondi supérieur : Arrondit à l'entier supérieur (vers l'infini positif).

Superglobales

Les superglobales sont des variables prédéfinies par PHP (généralement des tableaux associatifs) utiles pour l'accès aux données HTTP et système. Leur portée est globale : elles sont accessibles partout.

SuperglobaleDescription et Contenu
$_SERVER Contient le contexte d'exécution du script courant : URI, méthode de la requête HTTP, domaine, adresses IP du client et du serveur, DocumentRoot, etc.
$_GET Contient les valeurs passées dans les paramètres de l'URL (la query string). Ex: ?id=5&lang=fr.
$_POST Contient les valeurs passées dans le corps (body) d'une requête HTTP POST (typiquement lors de la soumission d'un formulaire).
$_SESSION Contient les données de la session utilisateur courante (nécessite l'appel préalable à session_start()).

⚠️ Sécurité : Il y a une nécessité absolue de valider et d'assainir systématiquement les données reçues depuis le client (GET et POST).

Manipulation Avancée (Strings & Arrays)

Chaînes de caractères (Strings)

FonctionDescription
mb_strlen()
mb_substr()
Versions "Multi-Byte" des fonctions standards. Indispensables pour gérer correctement les accents (UTF-8).
explode()
implode()
explode : Coupe une chaîne en tableau selon un séparateur.
implode : Rassemble un tableau en chaîne.
trim() Supprime les espaces (ou autres caractères invisibles) au début et à la fin d'une chaîne.

Tableaux (Arrays)

FonctionDescription
in_array()
array_key_exists()
Vérifie si une valeur existe.
Vérifie si une clé existe.
array_merge() Fusionne plusieurs tableaux. Les clés numériques sont renumérotées, les clés textuelles écrasent les précédentes si doublons.
array_unique() Supprime les doublons d'un tableau.
sort() Trie un tableau par valeur (et réindexe les clés numériques).

Erreurs et Exceptions

Une erreur est une anomalie déclenchée par PHP. Une exception est un objet lancé volontairement pour signaler un cas exceptionnel à gérer (mécanisme de POO).

Bloc Try / Catch

try {
    // Code susceptible de lancer une exception
    if ($diviseur == 0) {
        throw new Exception("Division par zéro interdite");
    }
    echo 10 / $diviseur;

} catch (Exception $e) {
    // Gestion de l'erreur (interception)
    echo "Erreur capturée : " . $e->getMessage();
    // error_log($e->getMessage()); // Bonnes pratique : loguer l'erreur

} finally {
    // Code exécuté dans tous les cas (optionnel)
}

Types d'erreurs courants

TypeDescription
E_PARSE / E_ERROR Erreurs fatales (syntaxe ou exécution). Le script s'arrête immédiatement.
E_WARNING Avertissement. Le script continue mais il y a un dysfonctionnement certain.
E_NOTICE Notification (ex: variable non définie). Le script continue.

Gestion des Dates : Datetime vs Timestamp

Concepts Fondamentaux

ConceptDescription et Caractéristiques
Timestamp
(Unix)
Représentation numérique absolue d'un instant précis (le nombre de secondes écoulées depuis le 1er janvier 1970 à 00:00:00 UTC).
Caractéristiques : Indépendant du fuseau horaire, idéal pour le calcul et le stockage interne. Illisible pour l'humain (ex: 1702737000).
Datetime Représentation lisible d'un instant. Dépend d'un format et surtout d'un fuseau horaire (timezone).
Caractéristiques : Orienté présentation. Le fuseau horaire de référence mondiale est l'UTC (Coordinated Universal Time).

Approches de manipulation (POO vs Procédural)

ActionApproche DateTime (POO - Recommandée)Approche Procédurale (Timestamp)
Créer (Instant actuel) $dt = new DateTime(); $ts = time();
Parser une date (String) $dt = new DateTime('2025-12-16 14:30:00'); $ts = strtotime('2025-12-16 14:30:00');
Formater pour affichage $valeur = $dt->format('d/m/Y H:i'); $valeur = date('d/m/Y H:i', $ts);

Caractères de formatage courants

CaractèreSignificationExemple
d / jJour du mois (sur 2 chiffres / sans zéro initial)05 / 5
m / nMois numérique (sur 2 chiffres / sans zéro initial)09 / 9
Y / yAnnée (sur 4 chiffres / sur 2 chiffres)2025 / 25
H / GHeures format 24h (sur 2 chiffres / sans zéro initial)14 / 14
i / sMinutes / Secondes (sur 2 chiffres)30 / 05

Sessions et Cookies

HTTP est sans état (stateless). Pour conserver des données entre les pages, on utilise Cookies (Client) ou Sessions (Serveur).

CaractéristiqueCookieSession
Stockage Sur le navigateur du client. Sur le serveur (fichiers par défaut).
Sécurité Faible (modifiable par l'utilisateur).
Jamais de données sensibles !
Plus élevée. Le client n'a que l'ID de session (SID).
Données / Taille Petites chaînes de texte. (Taille max faible) Toute variable PHP (tableaux, objets...). (Taille moyenne)

Manipulation des Sessions

// 1. Démarrer (OBLIGATOIRE au tout début, avant tout affichage)
session_start();

// 2. Écrire
$_SESSION['user_id'] = 42;

// 3. Lire
if (isset($_SESSION['user_id'])) {
    echo "ID : " . $_SESSION['user_id'];
}

// 4. Détruire totalement (Logout)
session_start(); // Toujours démarrer avant de détruire
$_SESSION = []; // Vide les variables
// Détruire le cookie de session SID
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"]);
}
session_destroy(); // Détruit la session sur le serveur

Bonnes pratiques de sécurité

Base de Données (PDO)

L'interface PDO (PHP Data Objects) permet d'accéder aux bases de données de manière sécurisée et uniforme, peu importe le SGBD sous-jacent.

Connexion (DSN)

try {
    // DSN (Data Source Name)
    $dsn = 'mysql:host=localhost;dbname=mon_site;charset=utf8mb4';
    $options = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // Mode d'erreur Strict
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC // Tableaux associatifs
    ];
    $pdo = new PDO($dsn, 'utilisateur', 'mot_de_passe', $options);
} catch (PDOException $e) {
    die("Erreur connexion : " . $e->getMessage());
}

Requêtes Préparées (Protection Injection SQL)

Utilisez toujours des requêtes préparées (prepare() + execute()) quand vous injectez des variables externes.

// 1. Préparation avec marqueurs nommés (:email)
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");

// 2. Exécution avec les données
$email = $_POST['email'];
$stmt->execute(['email' => $email]);

// 3. Récupération (Fetch)
$user = $stmt->fetch(); // Récupère 1 enregistrement à la fois
// ou
$users = $stmt->fetchAll(); // Récupère tous les enregistrements d'un coup

if ($user) {
    echo $user['nom'];
}

Sécurité et Entrées/Sorties (I/O)

Validation et Assainissement

Règle d'or : Toute entrée dans un programme doit faire l'objet d'une validation et d'un assainissement.

FonctionExempleDescription
filter_var()
$email = " test@example.com ";
// Assainissement (nettoyer)
$clean = filter_var($email, FILTER_SANITIZE_EMAIL);

// Validation (vérifier format)
if (filter_var($clean, FILTER_VALIDATE_EMAIL)) {
    echo "Email valide";
}
Fonction native très puissante pour vérifier ou nettoyer des données (email, int, url...).
htmlspecialchars() echo htmlspecialchars($str); Convertit les caractères spéciaux (comme < et >) en entités HTML. Indispensable à l'affichage de données utilisateur pour éviter les failles XSS.

Gestion JSON

Format d'échange de données léger, massivement utilisé par les API web.

FonctionDescription
json_encode($data) Prend une variable PHP (ex: un tableau associatif) et retourne une chaîne de texte au format JSON.
json_decode($json, true) Prend une chaîne JSON et la convertit en variable PHP. Le 2ème paramètre à true force le retour en tableau associatif (sinon c'est un objet stdClass).