L3 Info : PHP et Applications Web
 
◃  Ch. 4 Le protocole HTTP  ▹
 

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
  • 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();
}