PHP & Serveur Web 🌐

Génération HTML & Templating

Formation DWWM - Architecture client-serveur et pages dynamiques

2025 - 2026

Au programme aujourd'hui

  • 🌐 ModĂšle client-serveur
  • 🔄 Comment fonctionne une requĂȘte HTTP
  • 📝 GĂ©nĂ©rer du HTML avec PHP
  • 🎹 Templating : include et require
  • đŸ—ïž Architecture multipage
  • ⚙ Bonnes pratiques
  • đŸ’Ș Exercices pratiques

🌐 Partie 1

Le modĂšle client-serveur

Comment fonctionne le Web

Qu'est-ce qu'un serveur web ? đŸ–„ïž

Serveur Web = Ordinateur qui héberge des sites web et répond aux demandes des visiteurs

Analogie du restaurant :

  • đŸȘ Restaurant = Serveur Web
  • đŸ‘€ Client = Navigateur (Chrome, Firefox)
  • 📋 Menu = Pages web disponibles
  • 🍕 Plat servi = Page HTML reçue
  • 👹‍🍳 Cuisinier = PHP (prĂ©pare la page)

Architecture client-serveur 📊

đŸ‘€ CLIENT
(Navigateur)
Chrome / Firefox / Safari
→
RequĂȘte HTTP
GET /index.php
đŸ–„ïž SERVEUR
Apache / Nginx
+ PHP
đŸ‘€ CLIENT
Affiche la page
←
Réponse HTTP
HTML + CSS + JS
đŸ–„ïž SERVEUR
GénÚre le HTML
avec PHP

Le cycle requĂȘte/rĂ©ponse 🔄

Étape 1 : Le client fait une demande
đŸ‘€ Utilisateur tape : http://monsite.com/page.php
↓


Étape 2 : Le serveur reçoit la requĂȘte
đŸ–„ïž Apache reçoit : GET /page.php HTTP/1.1
↓


Étape 3 : PHP traite le fichier
⚙ PHP exĂ©cute le code, gĂ©nĂšre du HTML
↓


Étape 4 : Le serveur renvoie la rĂ©ponse
đŸ“€ Envoi du HTML au navigateur
↓


Étape 5 : Le navigateur affiche
đŸ–Œïž Rendu visuel de la page HTML

Schéma détaillé du traitement

FICHIER : page.php
<?php
$nom = "Marie";
?>
<h1>Bonjour <?= $nom ?></h1>
↓ PHP EXÉCUTE
RÉSULTAT ENVOYÉ AU CLIENT :
<h1>Bonjour Marie</h1>
⚠ Important : Le client ne voit JAMAIS le code PHP !
Il reçoit uniquement le HTML généré.

HTML statique vs PHP dynamique

HTML statique PHP dynamique
Extension .html .php
Traitement Envoyé tel quel Exécuté par PHP
Contenu Toujours identique Peut changer
Exemple Page "À propos" Liste de produits
Avantage Rapide, simple Flexible, intelligent

OĂč s'exĂ©cute le code ? đŸ€”

✅ CĂŽtĂ© SERVEUR (PHP) :
  • Connexion base de donnĂ©es
  • Calculs complexes
  • GĂ©nĂ©ration de contenu
  • Gestion des sessions
  • Envoi d'emails
✅ CĂŽtĂ© CLIENT (JavaScript) :
  • Interactions utilisateur (clics, hover)
  • Animations
  • Validation de formulaires
  • Modifications DOM

📝 Partie 2

Générer du HTML avec PHP

Mélanger PHP et HTML

PHP et HTML ensemble đŸ€

Principe : On peut mĂ©langer PHP et HTML dans le mĂȘme fichier
<!-- Fichier : index.php -->
<?php
// PHP : Partie calculée/traitée
$prenom = "Marie";
$age = 25;
?>

<!-- HTML : Partie affichée -->
<!DOCTYPE html>
<html>
<head>
    <title>Ma page</title>
</head>
<body>
    <h1>Bonjour <?php echo $prenom; ?></h1>
    <p>Tu as <?php echo $age; ?> ans.</p>
</body>
</html>

Syntaxe courte : <?= ?>

💡 <?= $variable ?> est un raccourci pour <?php echo $variable; ?>
<?php
$titre = "Mon site web";
$description = "Un site génial";
?>

<!DOCTYPE html>
<html>
<head>
    <!-- Syntaxe longue -->
    <title><?php echo $titre; ?></title>
    
    <!-- Syntaxe courte (recommandée) -->
    <meta name="description" content="<?= $description ?>">
</head>
<body>
    <h1><?= $titre ?></h1>
    <p><?= $description ?></p>
</body>
</html>

Injecter des variables dans le HTML

<?php
// Données calculées en PHP
$utilisateur = "Jean Dupont";
$solde = 1250.50;
$devise = "€";
?>

<div class="compte">
    <h2>Bienvenue <?= $utilisateur ?></h2>
    <p>Votre solde : <strong><?= $solde ?> <?= $devise ?></strong></p>
</div>

<!-- RÉSULTAT AFFICHÉ (vu par le client) :
<div class="compte">
    <h2>Bienvenue Jean Dupont</h2>
    <p>Votre solde : <strong>1250.5 €</strong></p>
</div>
-->
💡 Le client ne voit QUE le HTML final, jamais le code PHP

GĂ©nĂ©rer des listes dynamiques 📋

<?php
// Liste de fruits calculée en PHP
$fruits = ["Pomme", "Banane", "Orange", "Fraise"];
?>

<h2>Liste de courses</h2>
<ul>
    <?php foreach ($fruits as $fruit): ?>
        <li><?= $fruit ?></li>
    <?php endforeach; ?>
</ul>

<!-- RÉSULTAT :
<ul>
    <li>Pomme</li>
    <li>Banane</li>
    <li>Orange</li>
    <li>Fraise</li>
</ul>
-->

Syntaxe alternative pour les structures

Dans le HTML, on utilise souvent :
‱ if: ... endif;
‱ foreach: ... endforeach;
‱ for: ... endfor;
‱ while: ... endwhile;
<?php $estConnecte = true; ?>

<!-- Syntaxe classique avec accolades -->
<?php if ($estConnecte) { ?>
    <p>Bienvenue !</p>
<?php } else { ?>
    <p>Connectez-vous</p>
<?php } ?>

<!-- Syntaxe alternative (plus lisible dans le HTML) -->
<?php if ($estConnecte): ?>
    <p>Bienvenue !</p>
<?php else: ?>
    <p>Connectez-vous</p>
<?php endif; ?>

Conditions dans le HTML 🔀

<?php
$note = 15;
$estAdmis = $note >= 10;
?>

<div class="resultat">
    <h2>Résultat de l'examen</h2>
    <p>Note obtenue : <?= $note ?>/20</p>
    
    <?php if ($estAdmis): ?>
        <div class="success">
            <p>✅ FĂ©licitations, vous ĂȘtes admis !</p>
        </div>
    <?php else: ?>
        <div class="error">
            <p>❌ DĂ©solĂ©, vous n'ĂȘtes pas admis.</p>
        </div>
    <?php endif; ?>
</div>

GĂ©nĂ©rer un tableau HTML 📊

<?php
$etudiants = [
    ["nom" => "Dupont", "prenom" => "Marie", "note" => 15],
    ["nom" => "Martin", "prenom" => "Jean", "note" => 12],
    ["nom" => "Durand", "prenom" => "Sophie", "note" => 18]
];
?>

<table>
    <thead>
        <tr>
            <th>Nom</th>
            <th>Prénom</th>
            <th>Note</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($etudiants as $etudiant): ?>
            <tr>
                <td><?= $etudiant["nom"] ?></td>
                <td><?= $etudiant["prenom"] ?></td>
                <td><?= $etudiant["note"] ?>/20</td>
            </tr>
        <?php endforeach; ?>
    </tbody>
</table>

Classes CSS dynamiques 🎹

<?php
$produits = [
    ["nom" => "Ordinateur", "stock" => 5],
    ["nom" => "Souris", "stock" => 0],
    ["nom" => "Clavier", "stock" => 15]
];
?>

<div class="produits">
    <?php foreach ($produits as $produit): ?>
        <!-- Classe CSS dynamique selon le stock -->
        <div class="produit <?= $produit['stock'] == 0 ? 'rupture' : '' ?>">
            <h3><?= $produit['nom'] ?></h3>
            <p>
                <?php if ($produit['stock'] > 0): ?>
                    En stock : <?= $produit['stock'] ?>
                <?php else: ?>
                    ⚠ Rupture de stock
                <?php endif; ?>
            </p>
        </div>
    <?php endforeach; ?>
</div>

🎹 Partie 3

Templating avec include

Réutiliser des morceaux de code

Qu'est-ce que le templating ? đŸ§©

Templating = Découper une page en morceaux réutilisables

Analogie des LEGO :

  • đŸ§± Chaque bloc LEGO = Un fichier PHP (header, footer, etc.)
  • đŸ—ïž Assembler les blocs = include / require
  • 🎹 RĂ©sultat = Une page complĂšte
💡 Avantage : Modifier le header UNE fois, ça change sur TOUTES les pages !

Include vs Require đŸ“„

Fonction Comportement En cas d'erreur Utilisation
include Inclut un fichier ⚠ Warning, continue Optionnel
include_once Inclut 1 seule fois ⚠ Warning, continue Éviter doublons
require Inclut un fichier ❌ Erreur fatale, stop Obligatoire
require_once Inclut 1 seule fois ❌ Erreur fatale, stop Fichiers critiques

Quand utiliser quoi ? đŸ€”

✅ require / require_once :
  • Fichiers essentiels (header, config, fonctions)
  • Si absent = page cassĂ©e
  • 👉 Le plus utilisĂ©
✅ include / include_once :
  • Fichiers optionnels (widget, publicitĂ©)
  • Si absent = page fonctionne quand mĂȘme
  • 👉 Moins courant

Structure de fichiers classique 📁

monsite/
├── index.php           (Page d'accueil)
├── contact.php         (Page contact)
├── produits.php        (Page produits)
│
├── includes/           (Dossier des morceaux)
│   ├── header.php      (En-tĂȘte commun)
│   ├── footer.php      (Pied de page commun)
│   ├── nav.php         (Menu de navigation)
│   └── config.php      (Configuration)
│
├── css/
│   └── style.css
│
└── images/
    └── logo.png

Exemple : header.php 📄

<!-- Fichier : includes/header.php -->
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title><?= $pageTitle ?? "Mon Site" ?></title>
    <link rel="stylesheet" href="css/style.css">
</head>
<body>
    <header>
        <img src="images/logo.png" alt="Logo">
        <h1>Mon Site Web</h1>
    </header>
    
    <!-- Le menu de navigation -->
    <nav>
        <a href="index.php">Accueil</a>
        <a href="produits.php">Produits</a>
        <a href="contact.php">Contact</a>
    </nav>
💡 $pageTitle ?? "Mon Site" = Si $pageTitle existe, l'utiliser, sinon "Mon Site"

Exemple : footer.php 📄

<!-- Fichier : includes/footer.php -->
    <footer>
        <p>&copy; <?= date('Y') ?> Mon Site Web. Tous droits réservés.</p>
        <p>
            <a href="mentions.php">Mentions légales</a> | 
            <a href="contact.php">Contact</a>
        </p>
    </footer>
</body>
</html>
💡 date('Y') affiche l'annĂ©e actuelle (2025)

Utiliser les includes 🔗

<!-- Fichier : index.php -->
<?php
// Définir le titre de la page
$pageTitle = "Accueil";

// Inclure l'en-tĂȘte
require 'includes/header.php';
?>

<!-- Contenu spécifique de la page d'accueil -->
<main>
    <h2>Bienvenue sur mon site !</h2>
    <p>Ceci est la page d'accueil.</p>
</main>

<?php
// Inclure le pied de page
require 'includes/footer.php';
?>

Page complùte avec includes 📑

<!-- Fichier : produits.php -->
<?php
$pageTitle = "Nos Produits";

// Liste des produits (pourrait venir d'une BDD)
$produits = [
    ["nom" => "Ordinateur", "prix" => 899],
    ["nom" => "Souris", "prix" => 25],
    ["nom" => "Clavier", "prix" => 45]
];

require 'includes/header.php';
?>

<main>
    <h2>Nos Produits</h2>
    <div class="produits">
        <?php foreach ($produits as $produit): ?>
            <div class="produit">
                <h3><?= $produit['nom'] ?></h3>
                <p>Prix : <?= $produit['prix'] ?>€</p>
            </div>
        <?php endforeach; ?>
    </div>
</main>

<?php require 'includes/footer.php'; ?>

Partage de variables 🔄

Important : Les variables définies AVANT l'include sont accessibles DANS le fichier inclus
<!-- index.php -->
<?php
$utilisateur = "Marie";
$estConnecte = true;

require 'includes/header.php';
?>

<!-- includes/header.php -->
<header>
    <h1>Mon Site</h1>
    <?php if ($estConnecte): ?>
        <p>Bonjour <?= $utilisateur ?> !</p>
    <?php else: ?>
        <a href="login.php">Connexion</a>
    <?php endif; ?>
</header>

Navigation active 🎯

<!-- includes/nav.php -->
<?php
// Récupérer le nom du fichier actuel
$pageCourante = basename($_SERVER['PHP_SELF']);
?>

<nav>
    <a href="index.php" 
       class="<?= $pageCourante == 'index.php' ? 'active' : '' ?>">
        Accueil
    </a>
    
    <a href="produits.php" 
       class="<?= $pageCourante == 'produits.php' ? 'active' : '' ?>">
        Produits
    </a>
    
    <a href="contact.php" 
       class="<?= $pageCourante == 'contact.php' ? 'active' : '' ?>">
        Contact
    </a>
</nav>
💡 La classe "active" permet de styliser le lien de la page courante

đŸ—ïž Partie 4

Architecture multipage

Organiser un site complet

Structure d'un site multipage 🌳

monsite/
├── index.php              Page d'accueil
├── produits.php           Page liste produits
├── produit-detail.php     Page dĂ©tail produit
├── contact.php            Page contact
├── panier.php             Page panier
│
├── includes/
│   ├── config.php         Configuration globale
│   ├── functions.php      Fonctions rĂ©utilisables
│   ├── header.php         En-tĂȘte
│   ├── footer.php         Pied de page
│   └── nav.php            Navigation
│
├── css/
│   └── style.css
│
├── js/
│   └── script.js
│
└── images/
    ├── logo.png
    └── produits/

Fichier de configuration ⚙

<!-- includes/config.php -->
<?php
// Configuration du site
define('SITE_NAME', 'Mon Super Site');
define('SITE_URL', 'http://localhost/monsite');

// ParamĂštres
$config = [
    'email_contact' => 'contact@monsite.fr',
    'items_par_page' => 10,
    'devise' => '€',
    'tva' => 20
];

// Fuseau horaire
date_default_timezone_set('Europe/Paris');

// Encodage
header('Content-Type: text/html; charset=UTF-8');
?>
💡 Ce fichier est inclus en premier sur toutes les pages

Fichier de fonctions 🔧

<!-- includes/functions.php -->
<?php
/**
 * Formate un prix avec la devise
 */
function formatPrice($price) {
    global $config;
    return number_format($price, 2, ',', ' ') . ' ' . $config['devise'];
}

/**
 * GénÚre un slug depuis un titre
 */
function slugify($text) {
    $text = strtolower($text);
    $text = str_replace(' ', '-', $text);
    return $text;
}

/**
 * Sécurise une chaßne pour affichage HTML
 */
function e($text) {
    return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}
?>

Template de base 📋

<!-- Template de page standard -->
<?php
// 1. Configuration et fonctions
require_once 'includes/config.php';
require_once 'includes/functions.php';

// 2. Traitement PHP spécifique à la page
$pageTitle = "Titre de la page";
// ... logique métier ...

// 3. Header HTML
require 'includes/header.php';
?>

<!-- 4. Contenu de la page -->
<main>
    <h2><?= $pageTitle ?></h2>
    <!-- Contenu ici -->
</main>

<?php
// 5. Footer HTML
require 'includes/footer.php';
?>

Passer des paramùtres entre pages 🔗

URL avec paramĂštres GET :
produit-detail.php?id=5
<!-- produits.php : Liste avec liens -->
<?php
$produits = [
    ["id" => 1, "nom" => "Ordinateur"],
    ["id" => 2, "nom" => "Souris"],
    ["id" => 3, "nom" => "Clavier"]
];
?>

<div class="produits">
    <?php foreach ($produits as $produit): ?>
        <div class="produit">
            <h3><?= $produit['nom'] ?></h3>
            <!-- Lien vers la page de détail avec l'ID -->
            <a href="produit-detail.php?id=<?= $produit['id'] ?>">
                Voir détails
            </a>
        </div>
    <?php endforeach; ?>
</div>

RĂ©cupĂ©rer les paramĂštres GET 📬

<!-- produit-detail.php : Page de détail -->
<?php
require_once 'includes/config.php';
require_once 'includes/functions.php';

// Récupérer l'ID depuis l'URL
$id = $_GET['id'] ?? null;

// Validation
if ($id === null || !is_numeric($id)) {
    die("Erreur : ID produit invalide");
}

// Simuler une récupération en BDD
$produit = [
    "id" => $id,
    "nom" => "Ordinateur Portable",
    "prix" => 899,
    "description" => "Un super ordinateur"
];

$pageTitle = $produit['nom'];
require 'includes/header.php';
?>

<main>
    <h2><?= e($produit['nom']) ?></h2>
    <p><?= e($produit['description']) ?></p>
    <p>Prix : <?= formatPrice($produit['prix']) ?></p>
</main>

<?php require 'includes/footer.php'; ?>

Redirection entre pages 🔀

<?php
// Redirection simple
header('Location: index.php');
exit; // Important : arrĂȘter l'exĂ©cution

// Redirection avec message
$_SESSION['message'] = "Action réussie !";
header('Location: index.php');
exit;

// Redirection vers une URL externe
header('Location: https://www.google.com');
exit;
?>
⚠ Important : Aucun HTML ne doit ĂȘtre envoyĂ© AVANT header()

Gestion des erreurs 404 ❌

<!-- produit-detail.php -->
<?php
require_once 'includes/config.php';
require_once 'includes/functions.php';

$id = $_GET['id'] ?? null;

// Simuler une recherche en BDD
$produit = rechercherProduit($id); // Fonction fictive

// Si le produit n'existe pas
if (!$produit) {
    // Définir le code HTTP 404
    http_response_code(404);
    
    $pageTitle = "Produit introuvable";
    require 'includes/header.php';
    ?>
    
    <main>
        <h2>Erreur 404</h2>
        <p>Le produit demandé n'existe pas.</p>
        <a href="produits.php">Retour aux produits</a>
    </main>
    
    <?php
    require 'includes/footer.php';
    exit; // ArrĂȘter l'exĂ©cution
}

// Sinon, afficher le produit normalement
?>

Bonnes pratiques d'organisation 📐

  • ✅ Un fichier = Une page
  • ✅ includes/ pour les morceaux rĂ©utilisables
  • ✅ config.php inclus en premier partout
  • ✅ functions.php pour les fonctions communes
  • ✅ Nommer les fichiers en minuscules
  • ✅ Utiliser des tirets : mon-fichier.php
  • ✅ Commenter le code complexe
  • ✅ Valider toutes les donnĂ©es GET/POST
  • ✅ SĂ©curiser avec htmlspecialchars()

đŸ’Ș Partie 5

Exercices pratiques

À vous de jouer !

Exercice 1 : Page dynamique simple

📝 ÉnoncĂ© :

Créez une page info.php qui affiche :

  • Votre prĂ©nom dans un <h1>
  • Votre Ăąge calculĂ© depuis votre annĂ©e de naissance
  • La date et l'heure actuelles
  • Un message "Majeur" ou "Mineur" selon l'Ăąge

Variables PHP Ă  utiliser :

  • $prenom
  • $anneeNaissance
  • Fonction date()

Exercice 1 : CorrigĂ© ✅

<?php
// Données
$prenom = "Marie";
$anneeNaissance = 2000;

// Calcul de l'Ăąge
$anneeActuelle = date('Y');
$age = $anneeActuelle - $anneeNaissance;

// Statut
$estMajeur = $age >= 18;
?>

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Mes informations</title>
</head>
<body>
    <h1>Bonjour <?= $prenom ?></h1>
    <p>J'ai <?= $age ?> ans.</p>
    <p>Nous sommes le <?= date('d/m/Y H:i') ?></p>
    
    <?php if ($estMajeur): ?>
        <p>Je suis majeur.</p>
    <?php else: ?>
        <p>Je suis mineur.</p>
    <?php endif; ?>
</body>
</html>

Exercice 2 : Liste de courses

📝 ÉnoncĂ© :

Créez une page courses.php qui :

  • Affiche un titre "Ma liste de courses"
  • Affiche une liste HTML des courses depuis un tableau
  • Affiche le nombre total d'articles

Tableau PHP :

$courses = [
    "Pain",
    "Lait",
    "ƒufs",
    "Fromage",
    "Tomates"
];

Exercice 2 : CorrigĂ© ✅

<?php
$courses = [
    "Pain",
    "Lait",
    "ƒufs",
    "Fromage",
    "Tomates"
];

// Compter les articles
$total = count($courses);
?>

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Liste de courses</title>
</head>
<body>
    <h1>Ma liste de courses</h1>
    
    <ul>
        <?php foreach ($courses as $article): ?>
            <li><?= $article ?></li>
        <?php endforeach; ?>
    </ul>
    
    <p>Total : <strong><?= $total ?></strong> articles</p>
</body>
</html>

Exercice 3 : Tableau de notes

📝 ÉnoncĂ© :

Créez notes.php avec :

  • Un tableau HTML des Ă©tudiants et leurs notes
  • Affichage en vert si note ≄ 10
  • Affichage en rouge si note < 10
  • La moyenne gĂ©nĂ©rale
$etudiants = [
    ["nom" => "Dupont", "note" => 15],
    ["nom" => "Martin", "note" => 8],
    ["nom" => "Durand", "note" => 12]
];

Exercice 3 : CorrigĂ© ✅

<?php
$etudiants = [
    ["nom" => "Dupont", "note" => 15],
    ["nom" => "Martin", "note" => 8],
    ["nom" => "Durand", "note" => 12]
];

// Calculer la moyenne
$somme = 0;
foreach ($etudiants as $etudiant) {
    $somme += $etudiant['note'];
}
$moyenne = $somme / count($etudiants);
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Notes</title>
    <style>
        .reussi { color: green; font-weight: bold; }
        .echec { color: red; font-weight: bold; }
    </style>
</head>
<body>
    <h1>Notes des étudiants</h1>
    <table border="1">
        <thead>
            <tr><th>Nom</th><th>Note</th></tr>
        </thead>
        <tbody>
            <?php foreach ($etudiants as $etudiant): ?>
                <tr>
                    <td><?= $etudiant['nom'] ?></td>
                    <td class="<?= $etudiant['note'] >= 10 ? 'reussi' : 'echec' ?>">
                        <?= $etudiant['note'] ?>/20
                    </td>
                </tr>
            <?php endforeach; ?>
        </tbody>
    </table>
    <p>Moyenne : <?= round($moyenne, 2) ?>/20</p>
</body>
</html>

Exercice 4 : Site avec includes

📝 ÉnoncĂ© :

Créez un mini-site avec :

  • includes/header.php : Logo + titre + menu (Accueil, À propos, Contact)
  • includes/footer.php : Copyright avec annĂ©e dynamique
  • index.php : Page d'accueil
  • about.php : Page "À propos"
  • contact.php : Page "Contact"

Chaque page doit avoir un titre différent et utiliser les includes.

Exercice 4 : CorrigĂ© (1/4) ✅

includes/header.php :
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title><?= $pageTitle ?? "Mon Site" ?></title>
    <style>
        nav a { margin: 0 10px; }
        main { min-height: 400px; }
    </style>
</head>
<body>
    <header>
        <h1>🌐 Mon Site Web</h1>
        <nav>
            <a href="index.php">Accueil</a>
            <a href="about.php">À propos</a>
            <a href="contact.php">Contact</a>
        </nav>
        <hr>
    </header>

Exercice 4 : CorrigĂ© (2/4) ✅

includes/footer.php :
    <hr>
    <footer>
        <p>&copy; <?= date('Y') ?> Mon Site. Tous droits réservés.</p>
    </footer>
</body>
</html>

Exercice 4 : CorrigĂ© (3/4) ✅

index.php :
<?php
$pageTitle = "Accueil";
require 'includes/header.php';
?>

<main>
    <h2>Bienvenue sur mon site !</h2>
    <p>Ceci est la page d'accueil.</p>
</main>

<?php require 'includes/footer.php'; ?>
about.php :
<?php
$pageTitle = "À propos";
require 'includes/header.php';
?>

<main>
    <h2>À propos</h2>
    <p>Informations sur le site.</p>
</main>

<?php require 'includes/footer.php'; ?>

Exercice 4 : CorrigĂ© (4/4) ✅

contact.php :
<?php
$pageTitle = "Contact";
require 'includes/header.php';
?>

<main>
    <h2>Contactez-nous</h2>
    <p>Email : contact@monsite.fr</p>
    <p>Téléphone : 01 23 45 67 89</p>
</main>

<?php require 'includes/footer.php'; ?>

Exercice 5 : Catalogue produits (BONUS)

📝 ÉnoncĂ© :

Créez un catalogue avec 2 pages :

  • produits.php : Liste des produits avec liens "Voir dĂ©tails"
  • produit.php : DĂ©tail d'un produit selon ?id=X
$produits = [
    1 => ["nom" => "Ordinateur", "prix" => 899, "desc" => "PC Portable"],
    2 => ["nom" => "Souris", "prix" => 25, "desc" => "Sans fil"],
    3 => ["nom" => "Clavier", "prix" => 45, "desc" => "Mécanique"]
];

Exercice 5 : CorrigĂ© (1/2) ✅

produits.php :
<?php
$produits = [
    1 => ["nom" => "Ordinateur", "prix" => 899, "desc" => "PC Portable"],
    2 => ["nom" => "Souris", "prix" => 25, "desc" => "Sans fil"],
    3 => ["nom" => "Clavier", "prix" => 45, "desc" => "Mécanique"]
];
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Nos produits</title>
</head>
<body>
    <h1>Nos produits</h1>
    <div>
        <?php foreach ($produits as $id => $produit): ?>
            <div style="border: 1px solid #ccc; padding: 10px; margin: 10px;">
                <h3><?= $produit['nom'] ?></h3>
                <p>Prix : <?= $produit['prix'] ?>€</p>
                <a href="produit.php?id=<?= $id ?>">Voir détails</a>
            </div>
        <?php endforeach; ?>
    </div>
</body>
</html>

Exercice 5 : CorrigĂ© (2/2) ✅

produit.php :
<?php
$produits = [
    1 => ["nom" => "Ordinateur", "prix" => 899, "desc" => "PC Portable"],
    2 => ["nom" => "Souris", "prix" => 25, "desc" => "Sans fil"],
    3 => ["nom" => "Clavier", "prix" => 45, "desc" => "Mécanique"]
];

$id = $_GET['id'] ?? null;

if (!isset($produits[$id])) {
    die("Produit introuvable");
}

$produit = $produits[$id];
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title><?= $produit['nom'] ?></title>
</head>
<body>
    <h1><?= $produit['nom'] ?></h1>
    <p><strong>Description :</strong> <?= $produit['desc'] ?></p>
    <p><strong>Prix :</strong> <?= $produit['prix'] ?>€</p>
    <a href="produits.php">← Retour aux produits</a>
</body>
</html>

RĂ©capitulatif 🎯

Ce que vous avez appris :

  • ✅ ModĂšle client-serveur
  • ✅ Cycle requĂȘte/rĂ©ponse HTTP
  • ✅ GĂ©nĂ©rer du HTML avec PHP
  • ✅ Syntaxe courte <?= ?>
  • ✅ Structures alternatives (if: endif;)
  • ✅ Include et require
  • ✅ Architecture multipage
  • ✅ Passage de paramĂštres GET

Points clĂ©s Ă  retenir 📝

  • đŸ”” PHP s'exĂ©cute cĂŽtĂ© serveur, le client reçoit du HTML
  • đŸ”” <?= $var ?> pour afficher rapidement
  • đŸ”” require pour les fichiers essentiels
  • đŸ”” include pour les fichiers optionnels
  • đŸ”” Les variables sont partagĂ©es entre fichiers inclus
  • đŸ”” Toujours valider les donnĂ©es GET/POST
  • đŸ”” Toujours sĂ©curiser avec htmlspecialchars()
  • đŸ”” Un fichier de configuration pour centraliser

Bonnes pratiques 💡

  • ✅ SĂ©parer la logique PHP du HTML
  • ✅ Utiliser des includes pour header/footer
  • ✅ CrĂ©er un fichier config.php
  • ✅ CrĂ©er un fichier functions.php
  • ✅ Valider toutes les entrĂ©es utilisateur
  • ✅ Échapper toutes les sorties HTML
  • ✅ Utiliser des noms de fichiers explicites
  • ✅ Commenter le code complexe
  • ✅ Organiser les fichiers dans des dossiers

Prochaines Ă©tapes 🚀

  1. 📋 Formulaires : $_GET, $_POST, validation
  2. đŸȘ Sessions et Cookies : garder des donnĂ©es
  3. đŸ—„ïž Bases de donnĂ©es : MySQL avec PDO
  4. 🔐 Authentification : login/logout
  5. 📁 Upload de fichiers : images, documents
  6. 🎹 Framework : Symfony, Laravel

Ressources utiles 📚

  • 📖 php.net : Documentation officielle
  • 💡 PHP The Right Way : Bonnes pratiques
  • 🎓 W3Schools PHP : Tutoriels simples
  • 🔍 Stack Overflow : Questions/rĂ©ponses
  • đŸ“ș Grafikart : VidĂ©os en français

Merci ! 👏

Des questions ?

🌐 PHP = Le langage du Web dynamique !