Formation DWWM - Architecture client-serveur et pages dynamiques
2025 - 2026
Comment fonctionne le Web
Analogie du restaurant :
http://monsite.com/page.phpGET /page.php HTTP/1.1<?php
$nom = "Marie";
?>
<h1>Bonjour <?= $nom ?></h1>
<h1>Bonjour Marie</h1>
| 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 |
Mélanger PHP et HTML
<!-- 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>
<?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>
<?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>
-->
<?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>
-->
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; ?>
<?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>
<?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>
<?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>
Réutiliser des morceaux de code
Analogie des LEGO :
| 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 |
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
<!-- 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"
<!-- Fichier : includes/footer.php -->
<footer>
<p>© <?= 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)
<!-- 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';
?>
<!-- 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'; ?>
<!-- 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>
<!-- 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>
Organiser un site complet
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/
<!-- 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');
?>
<!-- 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 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';
?>
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>
<!-- 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'; ?>
<?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;
?>
<!-- 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
?>
mon-fichier.phpĂ vous de jouer !
Créez une page info.php qui affiche :
Variables PHP Ă utiliser :
$prenom$anneeNaissancedate()<?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>
Créez une page courses.php qui :
Tableau PHP :
$courses = [
"Pain",
"Lait",
"Ćufs",
"Fromage",
"Tomates"
];
<?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>
Créez notes.php avec :
$etudiants = [
["nom" => "Dupont", "note" => 15],
["nom" => "Martin", "note" => 8],
["nom" => "Durand", "note" => 12]
];
<?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>
Créez un mini-site avec :
Chaque page doit avoir un titre différent et utiliser les includes.
<!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>
<hr>
<footer>
<p>© <?= date('Y') ?> Mon Site. Tous droits rĂ©servĂ©s.</p>
</footer>
</body>
</html>
<?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'; ?>
<?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'; ?>
Créez un catalogue avec 2 pages :
?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"]
];
<?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>
<?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>
<?= ?>if: endif;)<?= $var ?> pour afficher rapidementrequire pour les fichiers essentielsinclude pour les fichiers optionnelsđ PHP = Le langage du Web dynamique !