<?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>