ob_start()
: fonction d’initialisation de l’output bufferingob_get_contents()
: récupération du contenu du bufferob_end_clean()
: arrêt de l’opération d’output buffering et nettoyage du buffer
<?php
ob_start();
echo 'Etape 2<br/>';
echo 'Etape 3<br/>';
$sortie=ob_get_contents();
ob_end_clean();
echo 'Etape 1<br/>';
echo $sortie;
?>
Tout ce qui vient du client est dangereux, il faut systématiquement s'en méfier.
<
par <
, &
par &
, etc.htmlspecialchars
s'occupe de ça, mais il faut
préciser certaines options :
<?php
$texte = "Du texte & de l'<abbr>HTML</abbr>.";
$utf8inv = 'Un caractère "'.hex2bin("C0").'" invalide.';
echo "1. ".htmlspecialchars($texte)."<br/>";
echo "2. ".htmlspecialchars($utf8inv)."<br/>";
echo "3. ".htmlspecialchars($texte, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8')."<br/>";
echo "4. ".htmlspecialchars($utf8inv, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5, 'UTF-8')."<br/>";
?>
ENT_QUOTES
encode les apostrophes, ENT_SUBSTITUTE
remplace les séquences UTF-8 invalides par le caractère � (U+FFFD)
plutôt que de retourner une chaîne vide,
et ENT_HTML5
utilise la table d'encodage d'HTML5.$erreurs
contenant les messages d'erreur correspondants à chaque champ du formulaire. Ce tableau est utilisé pour informer l'utilisateur des problèmes rencontrés.$coches
qui mémorise l'état des boutons et/ou des cases à cocher. Par exemple, $coches["Nom_Bouton"] = "CHECKED"; $coches["Nom_Liste"] = "SELECTED";
$erreurs
, où les clés correspondent aux champs du formulaire.La démarche générale consiste à accéder directement au formulaire via le script PHP (Formulaire.php), où les étapes suivantes sont effectuées :
Si c'est la première fois que le formulaire est accédé, on inclut le formulaire HTML en vérifiant l'existence des variables correspondant aux noms des champs du formulaire dans $_GET ou $_POST :
if (!isset($_POST["nom"]) && !isset($_POST["prenom"])) { // ou if (!key_exists('nom', $_POST))
include("form.html");
Sinon, on récupère les données saisies via le tableau $_GET ou $_POST et on gère les éventuelles erreurs. Chaque message d'erreur est stocké dans un tableau $erreur, où les clés correspondent aux champs du formulaire. Les messages d'erreur sont ensuite affichés dans la page HTML du formulaire.
On actualise le tableau $coche avec les cases déjà cochées et les options déjà sélectionnées :
Si aucun choix n'a été fait, on ajoute un message d'erreur dans $erreur["choix"]. Sinon, on parcourt les choix faits et on met à jour $coche pour chaque case cochée.
if (count($choix) == 0) {
$erreur["choix"] = "vous n'avez pas fait de choix";
}
else {
foreach ($choix as $case) { $coche[$case]="CHECKED"; }
}
On compte le nombre d'erreurs (nombre d'éléments dans le tableau $erreur). S'il y a des erreurs, on recharge le formulaire. Sinon, toutes les données sont correctes et le script peut appeler d'autres fonctions d'affichage ou de traitement des données :
if (count($erreur) == 0) { include("Traitement.php"); }
else { include("Formulaire.html"); }
form.php
<?php
require("libF.php");
if (!isset($_POST["nom"]) && !isset($_POST["prenom"])) {
include("form.html");
echo $formulaire;
} else {
$nom = trim($_POST['nom']) ?? null;
$prenom = trim($_POST['prenom']) ?? null;
$dateN = trim($_POST['dateN']) ?? null;
$lieuN = trim($_POST['lieuN']) ?? null;
$codeP = trim($_POST['codeP']) ?? null;
$telephone = trim($_POST['telephone']) ?? null;
$email = trim($_POST['email']) ?? null;
$ville = trim($_POST['ville']) ?? null;
$civilite = $_POST['civilite'] ?? null;
$comment = trim($_POST['comment']) ?? null;
/*
$nom = key_exists('nom', $_POST)? trim($_POST['nom']): null;
$prenom = key_exists('prenom', $_POST)? trim($_POST['prenom']): null;
$dateN = key_exists('dateN', $_POST)? trim($_POST['dateN']): null;
$lieuN = key_exists('lieuN', $_POST)? trim($_POST['lieuN']): null;
$codeP = key_exists('codeP', $_POST)? trim($_POST['codeP']): null;
$telephone = key_exists('telephone', $_POST)? trim($_POST['telephone']): null;
$email = key_exists('email', $_POST)? trim($_POST['email']): null;
$ville = key_exists('ville', $_POST)? $_POST['ville']: null;
$civilite = key_exists('civilite', $_POST)? $_POST['civilite']: null;
$comment = key_exists('comment', $_POST)? trim($_POST['comment']): null;
*/
$erreur = [];
$coche = [];
if (empty($nom)) {
$erreur["nom"] = "il manque un nom";
} elseif (is_numeric($nom)) {
$erreur["nom"] = "nom ne doit pas être un nombre";
} elseif (is_numeric($nom[0])) {
$erreur["nom"] = "nom ne doit pas commencer par un chiffre";
}
if (empty($prenom)) $erreur["prenom"] = "il manque un prenom";
if (empty($lieuN)) $erreur["lieuN"] = "il manque un lieuN";
if (empty($codeP)) {
$erreur["codeP"] = "il manque un codeP";
} elseif (!controlerCP($codeP)) {
$erreur["codeP"] = "codeP incorrect";
}
if (empty($dateN)) {
$erreur["dateN"] = "il manque une dateN";
} elseif (!controlerDate($dateN)) {
$erreur["dateN"] = "dateN incorrect";
}
if (empty($email)) {
$erreur["email"] = "il manque un email";
} elseif (!controlerEmail($email)) {
$erreur["email"] = "email incorrect";
}
if (empty($telephone)) {
$erreur["telephone"] = "il manque un telephone";
} elseif (!controlerTel($telephone)) {
$erreur["telephone"] = "telephone incorrect";
}
if ($ville == "Choisir") $erreur["ville"] = "il manque une ville";
if (empty($comment)) $erreur["comment"] = "il manque un commentaire";
if (empty($civilite)) $erreur["civilite"] = "Préciser H ou F";
$coche[$civilite] = "CHECKED";
$coche[$ville] = "SELECTED";
$compteur_erreur = count(array_filter($erreur));
if ($compteur_erreur == 0) {
$_POST["comment"] = nl2br($comment);
$corps = "<h1>Données du formulaire </h1>";
foreach ($_POST as $cle => $val) {
if ($cle != "user_valider") {
$corps .= "<b>" . $cle . "</b>: \t\t\t" . $val . "<br>";
}
}
$corps .= "<br>";
echo $corps;
} else {
include("form.html");
echo $formulaire;
}
}
?>
form.html
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Formulaire</title>
<style>
.rTable { display: table; }
.rTableRow { display: table-row; }
.rTableHeading { display: table-header-group; }
.rTableBody { display: table-row-group; }
.rTableFoot { display: table-footer-group; }
.rTableCell, .rTableHead { display: table-cell; }
.blink { color: red; animation: blink-animation 1s steps(5, start) infinite; }
@keyframes blink-animation { to { visibility: hidden; } }
</style>
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
</head>
<body>
<?php
$formulaire=<<<EOT
<form method="post" action="form.php" name="form_user" >
<table>
<tr>
<td><label> Nom</label></td>
<td><input type="text" name="nom" size="" value="{$nom}"></td>
<td class="w3-text-red">{$erreur["nom"]}</td>
</tr>
<tr>
<td><label> Prénom</label></td>
<td><input type="text" name="prenom" size="" value="{$prenom}"></td>
<td class="w3-text-red">{$erreur["prenom"]}</td>
</tr>
<tr>
<td><label> Date de Naissance</label></td>
<td><input type="text" name="dateN" size="" placeholder="jj-mm-aaaa" value="{$dateN}"></td>
<td class="w3-text-red">{$erreur["dateN"]}</td>
</tr>
<tr>
<td><label> Lieu de Naissance</label></td>
<td><input type="text" name="lieuN" size="" value="{$lieuN}"></td>
<td class="w3-text-red">{$erreur["lieuN"]}</td>
</tr>
<tr>
<td><label> Code Postal</label></td>
<td><input type="text" name="codeP" size="" value="{$codeP}"></td>
<td class="w3-text-red">{$erreur["codeP"]}</td>
</tr>
<tr>
<td><label> Téléphone</label></td>
<td><input type="text" name="telephone" size="" value="{$telephone}"></td>
<td class="w3-text-red">{$erreur["telephone"]}</td>
</tr>
<tr>
<td><label> Email</label></td>
<td><input type="text" name="email" size="" value="{$email}"></td>
<td class="w3-text-red">{$erreur["email"]}</td>
</tr>
<tr>
<td><label> Ville</label></td>
<td><select name="ville" size="1" >
<option value="Choisir" {$coche["Choisir"]} >Choisir une ville</option>
<option value="Amiens" {$coche["Amiens"]} >Amiens</option>
<option value="Paris" {$coche["Paris"]} >Paris</option>
<option value="Lyon" {$coche["Lyon"]} >Lyon</option>
</select>
</td>
<td class="w3-text-red">{$erreur["ville"]}</td>
</tr>
<tr>
<td><label> Civilité</label></td>
<td>
<input type="radio" name="civilite" value="homme" {$coche["homme"]}/>Homme
<input type="radio" name="civilite" value="femme" {$coche["femme"]}/>Femme
</td>
<td class="blink">{$erreur["civilite"]}</td>
</tr>
<tr>
<td><label> Commentaire</label></td>
<td><textarea name="comment" cols='40' rows='3' >{$comment} </textarea></td>
<td class="w3-text-red">{$erreur["comment"]}</td>
</tr>
<tr>
<td><input type="submit" name="user_valider" value="Valider" size="" ></td>
<td></td>
<td></td>
</tr>
</table>
</form>
EOT;
?>
</body>
</html>
index.php
<?php
// 1) Inclure donnees.php - pour les fonctions et les données
/*
Ce fichier contiendra toutes les fonctions de validation, de gestion du calendrier, ainsi que les variables utilisées pour la logique du programme.
*/
include('donnees.php');
// 2) index.php - Fichier principal avec la logique d'affichage
/*
Ce fichier contiendra la logique principale pour gérer les actions (affichage du calendrier, soumission du formulaire, etc.).
*/
$nom = null;
$prenom = null;
$dateN = null;
$lieuN = null;
$telephone = null;
$adresse = null;
$erreur = ["nom" => null, "prenom" => null, "dateN" => null, "lieuN" => null, "telephone" => null, "adresse" => null];
// Récupérer l'action via GET
$action = key_exists('action', $_GET) ? trim($_GET['action']) : null;
switch ($action) {
case "calendrier": // Afficher le calendrier vide
$zonePrincipale = Calendrier(date('Y'), date('m'));
break;
case "saisir": // Saisie via le formulaire
if (!isset($_POST["nom"]) && !isset($_POST["prenom"])) {
include("formulairePersonne.html");
$zonePrincipale = $corps;
} else {
$nom = key_exists('nom', $_POST) ? trim($_POST['nom']) : null;
$prenom = key_exists('prenom', $_POST) ? trim($_POST['prenom']) : null;
if ($nom == "") $erreur["nom"] = "Il manque un nom";
if ($prenom == "") $erreur["prenom"] = "Il manque un prénom";
$compteur_erreur = count($erreur);
foreach ($erreur as $cle => $valeur) {
if ($valeur == null) $compteur_erreur = $compteur_erreur - 1;
}
if ($compteur_erreur == 0) {
$nom_encode = htmlspecialchars($nom);
$prenom_encode = htmlspecialchars($prenom);
$corps = $nom_encode . " " . $prenom_encode . "<br>";
$zonePrincipale = $corps;
} else {
include("formulairePersonne.html");
$zonePrincipale = $corps;
}
}
break;
default:
$zonePrincipale = "";
break;
}
//3) squelette.php - Fichier du squelette HTML
/* Ce fichier contiendra la structure HTML de base, les liens vers les styles CSS, ainsi que l'emplacement où le contenu sera affiché. */
include('squelette.php');
?>
squelette.php
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Agenda</title>
<link rel="stylesheet" href="style.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
<h1>Agenda</h1>
<hr>
<div class="Ycontainer">
<div class="Ymain">
<?php echo $zonePrincipale; ?>
</div>
<div class="Ysidebar">
<p>
<a href="index.php?action=saisir">Saisie d'une personne</a><br>
<a href="index.php?action=calendrier">Calendrier vide</a><br>
</p>
</div>
</div>
<hr>
</body>
</html>