Module 4Réaliser un site web avec l'architecture MVC
Chapitre 11 sur 11
Examen blanc et fiche mémo
Te tester sur l'ensemble du module et garder une fiche mémo de PHP, PDO, la sécurité, MVC et REST.
- ≈ 90 min
- 2 leçons
- 3 exercices
- TP
Module 4Réaliser un site web avec l'architecture MVC
Chapitre 11 sur 11
Te tester sur l'ensemble du module et garder une fiche mémo de PHP, PDO, la sécurité, MVC et REST.
Objectifs
Avec ce chapitre, tu sauras…
Fais cet examen en 3 heures, sans le cours. La partie A se fait sur papier, les parties B à D sur ordinateur, avec XAMPP.
Leçon 1
| Partie | Contenu | Points | Chapitres |
|---|---|---|---|
| A | questions à choix multiples | 10 | 1 à 10 |
| B | PHP : prédire et corriger | 8 | 4 à 6 |
| C | application avec base de données et sécurité | 14 | 7 et 8 |
| D | MVC et API REST | 8 | 9 et 10 |
| Total | 40 |
Leçon 2
| Notion | À retenir |
|---|---|
| architectures | 1-tiers (local), 2-tiers (client lourd + SGBD), 3-tiers (navigateur + PHP + MySQL), n-tiers (services) |
| HTTP | sans état ; codes 2xx, 3xx, 4xx, 5xx ; Content-Type (MIME) |
| XAMPP | Apache + MariaDB + PHP + phpMyAdmin ; fichiers dans htdocs ; http://localhost/… |
| Apache | httpd.conf : Listen, DocumentRoot, LoadModule ; mod_rewrite ; redémarrer après modification |
| php.ini | display_errors (Off en production), log_errors, date.timezone, extension=pdo_mysql |
1Un site PHP + MySQL consulté avec un navigateur est une architecture…
2Le code PHP d'une page est exécuté…
3La directive Apache qui définit le dossier des pages publiées est…
4En PHP, '10' . '5' vaut…
5Pour un formulaire d'envoi de fichier :
6Une propriété private est accessible…
7Pour exécuter une requête contenant une saisie :
8Pour vérifier un mot de passe haché :
9Dans MVC, le routeur index.php transmet la requête…
10Une API REST répond à une création réussie par…
L'essentiel du chapitre
htmlspecialchars à l'affichage.| Besoin | Syntaxe |
|---|---|
| balises | <?php … ?>, <?= $x ?> |
| variables, concaténation | $nom = 'Sara'; 'Bonjour ' . $nom "Bonjour {$nom}" |
| conditions | if / elseif / else, switch, match ($x) { 1 => …, default => … } |
| boucles | for, while, foreach ($t as $k => $v) ; syntaxe alternative foreach (…): … endforeach; |
| fonctions | function f(int $a, string $b = 'x'): string { … } ; fn($x) => $x * 2 |
| tableaux | […], ['cle' => v], count, in_array, array_column, usort, array_filter, array_map |
| formulaires | $_GET, $_POST, $_SERVER['REQUEST_METHOD'], ?? '', filter_var, htmlspecialchars |
| redirection | header('Location: page.php'); exit; avant tout affichage |
| fichiers | file_get_contents, file_put_contents, fopen/fgets/fclose, fputcsv, json_encode/json_decode |
| upload | enctype="multipart/form-data", $_FILES, move_uploaded_file, vrai type, nom aléatoire |
| objet | class A extends B implements I { public function __construct(private int $x) {} } ; $o->m() ; parent:: ; static:: |
| magiques | __construct, __destruct, __toString, __get, __set, __call, __invoke, __clone |
| Besoin | Syntaxe |
|---|---|
| connexion | new PDO('mysql:host=…;dbname=…;charset=utf8mb4', $u, $p, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]) |
| requête préparée | $st = $pdo->prepare('… WHERE id = ?'); $st->execute([$id]); |
| résultats | fetch(), fetchAll(), fetchColumn(), rowCount(), lastInsertId() |
| transaction | beginTransaction(), commit(), rollBack() |
| session | session_start(); $_SESSION['u'] = …; ; session_regenerate_id(true) ; session_destroy() |
| cookie | setcookie('n', 'v', ['expires' => …, 'httponly' => true, 'secure' => true, 'samesite' => 'Lax']) |
| mot de passe | password_hash($mdp, PASSWORD_DEFAULT), password_verify($mdp, $hash) |
| parades | requêtes préparées (SQL), htmlspecialchars (XSS), jeton CSRF, basename (traversée), HTTPS |
| Notion | À retenir |
|---|---|
| MVC | Modèle (données), Vue (affichage), Contrôleur (coordination) ; routeur index.php?action=… |
| REST | ressources /api/stagiaires/12 ; GET 200, POST 201, PUT/PATCH 200, DELETE 204 ; erreurs 400, 404, 405, 409 |
| API PHP | header('Content-Type: application/json'), http_response_code(), json_decode(file_get_contents('php://input'), true), json_encode |
| SOAP | XML + WSDL ; new SoapClient('…?wsdl') |
Une table notes (id, id_stagiaire, module, note, date_saisie) complète la table stagiaires du chapitre 7.
notes, avec la clé étrangère et une contrainte sur la note (0 à 20). (2 pts)ajouter_note.php : un formulaire (liste déroulante des stagiaires chargée depuis la base, module, note) et son traitement avec validation et requête préparée, réservé aux formateurs connectés, protégé par un jeton CSRF. (6 pts)bulletin.php?id=… : la fiche d'un stagiaire avec la liste de ses notes et sa moyenne générale calculée en SQL. (4 pts)Tableau: Client/serveur et environnement
GET /api/stagiaires/{id}/notes en JSON : 200 avec la liste des notes et la moyenne, 404 si le stagiaire n'existe pas. (4 pts)(a) Donne l'affichage de ce script (4 points).
<?php
$stock = ['clavier' => 12, 'souris' => 0, 'ecran' => 5];
$dispo = array_filter($stock, fn($q) => $q > 0);
echo count($dispo), ' ', implode('/', array_keys($dispo)), "\n";
ksort($stock);
echo array_key_first($stock), ' ', array_sum($stock), "\n";
$prix = 249.5;
echo "Prix : {$prix} DH", ' ', number_format($prix * 1.2, 2, ',', ' '), "\n";
class Article {
public function __construct(private string $nom, protected float $prix) {}
public function __toString(): string { return ucfirst($this->nom) . ' à ' . $this->prix; }
}
echo new Article('souris', 99), "\n";(b) Ce script contient quatre erreurs. Trouve-les et corrige-les (4 points).
<?php
echo "<p>Bienvenue</p>";
session_start();
$nom = $_POST[nom];
if ($nom = '') {
header('Location: formulaire.php');
}
echo "Bonjour " + $nom;Tableau: Le langage PHP
Tableau: Les données et la sécurité
Tableau: MVC et REST