Une solution : scinder actions et états
- Pour éviter les problèmes précédents, il convient de gérer séparément les actions et les états mis en oeuvre dans le traitement des formulaires.
- Usuellement on suit le schéma suivant dans les scripts PHP :
switch($_POST['action']) {
case 'action1' :
// TODO réalisation des éditions nécessaires à l'action 1...
$_SESSION['état'] = 'etat1';
break;
case 'action2' :
// TODO réalisation des éditions nécessaires à l'action 2...
break;
default :
// ...
}
switch($_SESSION['état']) {
case 'état1':
// TODO affichage de la page correspondante...
break;
case 'état2':
// TODO affichage de la page correspondante...
break;
default:
// ...
}
- et lors du rechargement du script, les actions sont dupliquées...
- Il faut donc scinder les deux switchs dans deux scripts différents de façon à éviter la duplication des actions si on recharge la page de présentation d'un état.
- Le script de traitement des actions devra être associé aux attributs action du formulaire
- Pour que le navigateur soit renvoyé dans la page d'état, il faudra mettre en oeuvre une redirection vers celle-ci grâce à :
![Code 303 : See Other](https://http.cat/303)
- Tous les informations de session devront être entretenues
- Le script sous-traitant les actions n'affichent rien et se termine par les instructions de redirection suivantes :
header('HTTP/1.1 303 See Other');
header('Location: fichierTraitantLesEtats.php');
exit;
- Résultat : script d'insertion avec POST et traitement par script tiers
Code PHP de la page proposant le formulaire
try {
echo file_get_contents('util/debutSkelHtml5.html');
if (!isset($_GET['message'])) {
$dbs1 = $dbh->query('DROP TABLE IF EXISTS nom ');
$dbs1 = $dbh->query('CREATE TABLE nom (id integer auto_increment PRIMARY KEY, nom varchar(25))');
$dbs1 = $dbh->query("INSERT INTO nom(nom) VALUES ('nom 1'),('nom 2'),('nom 3')");
}
$dbs1 = $dbh->query('SELECT * from nom');
$tab = $dbs1->fetchAll($fetch_style = PDO::FETCH_ASSOC);
echo '<h1>Contenu de la table nom</h1>';
echo '<table border='1'>';
$colnames = array_keys($tab[0]);
echo '<tr>';
foreach ($colnames as $col) {
echo '<th>' . $col . '</th>';
}
echo '</tr>';
foreach ($tab as $ligne) {
echo '<tr>';
foreach ($ligne as $col) {
echo "<td> $col </td>";
}
echo '</tr>';
}
echo '</table>\n';
} catch (PDOException $e) {
print '<br />Erreur !: ' . $e->getMessage() . '<br/>';
die();
}
echo '<h2>Formulaire utilisant la méthode POST et traitement par script tiers</h2>';
echo "<form action='actionInserer.php' method='post'>
<input type='text' name='nom' />
<input type='submit' name='action' value='inserer'/>
</form>";
echo file_get_contents('util/finSkelHtml5.html');
Code PHP de la page traitant le formulaire
try {
if (isset($_POST['action'])) {
$dbs1 = $dbh->prepare('INSERT INTO nom(nom) VALUES(:nom)');
$dbs1->bindValue(':nom', $_POST['nom']);
$dbs1->execute();
}
header('HTTP/1.1 303 See Other');
header('Location: insererForm_v3.php?message=Coucou de la part de actionInserer.php');
exit;
} catch (PDOException $e) {
print '<br />Erreur !: ' . $e->getMessage() . '<br/>';
die();
}