<?php
/**
 * @file jeton_formulaire.php
 * @brief Page qui empêche le repost de formulaire par F5
 *
 * @author hughes monget
 * @see http://monget.com
 */
session_start();
//unset($_SESSION['formulaire']);
// Récupération ou création de la liste des jetons.
// Attention: sur un site, il faut changer de nom de variable de
// session pour chaque formulaire.
if (isset($_SESSION['formulaire']))
    { $arr_int_jeton = unserialize($_SESSION['formulaire']); }
else
    { $arr_int_jeton = array(); }
// Création du jeton courant.
$int_jeton = count($arr_int_jeton);
// On l'ajoute à la liste en le marquant inutilisé.
$arr_int_jeton[] = FALSE;
// Pour la gestion des messages à l'utilisateur.
$arr_str_message = array();
// Test si le formulaire est posté.
if (isset($_REQUEST['bouton']))
{
    $arr_str_message[] = 'POST';
    // Test si le jeton est correct et qu'il n'a pas déja été utilisé.
    if (!isset($_REQUEST['jeton']) || !ctype_digit($_REQUEST['jeton'])
        || !isset($arr_int_jeton[$_REQUEST['jeton']])
        || $arr_int_jeton[$_REQUEST['jeton']])
    {
        // Problème avec le jeton.
        $arr_str_message[] = 'FORMULAIRE DEJA POSTE OU ERREUR';
    }
    else
    {
        // Traitement du formulaire
        $arr_str_message[] = 'FORMULAIRE TRAITE';
        // On marque le jeton comme utilisé.
        $arr_int_jeton[$_REQUEST['jeton']] = TRUE;
    }
}
// On stocke la liste (à jour) des jetons.
$_SESSION['formulaire'] = serialize($arr_int_jeton);
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
        <title>Anti-repost de formulaire via un mécanisme de jeton</title>
        <style type="text/css">
        <!--
        -->
        </style>
        <script type="text/javascript">
        <!--;
        //-->
        </script>
    </head>
    <body>
        <form method="post" action="<?php echo $_SERVER['SCRIPT_NAME'] ?>">
            <!-- A mettre en hidden -->
            <input type="text" name="jeton" value="<?php echo $int_jeton ?>" />
            <input type="submit" name="bouton" value="Go Go Go" />
        </form>
<?php
if ($arr_str_message)
{
    echo '<pre>'.implode("\n", $arr_str_message).'</pre>';
}
echo '<hr />';
highlight_file(__FILE__);
?>
    </body>
</html>