Tout est dans le titre...
Un petit code simplifié à enrichir de nouvelles fonctionnalités.
(Testé en PHP 5).
Source / Exemple :
<?php
// Le fichier "class.session.php"
/**
- Sessions
-
- @author Serge Dominici
- @version $Id$
- @copyright 2005
- @package GENERIC
/**
- Classe générique de gestion des sessions des utilisateurs
-
- Crée une session (ou restaure celle trouvée sur le serveur, via l'identifiant de session passé
- dans une requête GET, POST ou par un cookie).
- Permet notemment d'éviter les doubles POST ou les doubles GET.
-
- @author Serge Dominici
- @version $Id$
- @copyright 2005
- @package GENERIC
class Session {
/**
- Valeur de la session Client.
- @var string $session_client_valide
- @access private
private $session_client_valide;
/**
- Constructeur de la classe
- @access protected
- @return void
function __construct(){
session_start();
}
/**
- Génération d'un ID Client
-
- Génération d'une chaine aléatoire de 32 caractères
-
- @access private
- @return string
private function generateID(){
// Génération d'un nombre aléatoire auquel on applique un hachage MD5
$this->session_client_valide = md5(mt_rand());
}
/**
- Récupération d'un nouvel ID Client
-
- ID à utiliser dans les URL pour le GET ou dans une variable POST
-
- @access public
- @return string
public function getNewID(){
$this->generateID();
$_SESSION['session_client_valide']=$this->session_client_valide;
return($this->session_client_valide);
}
/**
- Récupération de l'ID Client courant
-
- @access public
- @return string ou FALSE
public function getCurrentID(){
if (isset($_SESSION['session_client_valide'])) {
return($_SESSION['session_client_valide']);
} else {
return(FALSE);
}
}
/**
- Destruction de la session
-
- Détruit toutes les données associées à la session courante.
- Cette fonction ne détruit pas les variables globales associées à la session,
- de même, elle ne détruit pas le cookie de session.
-
- @access public
- @return string ou FALSE
public function destroySession(){
session_destroy();
}
}
?>
<?
// Le fichier "class.displayHTML.php"
/**
- Affichage HTML
-
- @author Serge Dominici
- @version $Id$
- @copyright 2005
- @package GENERIC
/**
- Classe générique d'affichage HTML
-
- @author Serge Dominici
- @version $Id$
- @copyright 2005
- @package GENERIC
class DisplayHTML {
/**
- Charset de l'affichage HTML.
- @var string $session_client_valide
- @access private
private $charset;
/**
- Constructeur de la classe
- @access protected
- @param string $charset Jeux de caractères de la page
- @return void
function __construct($charset = "UTF-8") {
$this->charset = $charset;
}
/**
- Affichage de l'en-tête
- @access public
- @param string $title Titre de la page
- @return void
public function displayHeader($title = ""){
printf("<html>\n");
printf("<head>\n");
printf("<meta http-equiv=\"content-type\" content=\"text/html; charset=%s\">\n", $this->charset);
printf("<title>%s</title>\n", addslashes($title));
printf("</head>\n");
printf("<body>\n");
}
/**
- Affichage du pied de page
- @access public
- @return void
public function displayFooter() {
printf("</body>\n");
printf("</html>\n");
}
}
?>
<?php
// Le fichier "test.php"
/**
- Eviter les doubles POST/GET
-
- @author Serge Dominici
- @version $Id$
- @copyright 2005
- @package GENERIC
require_once('class.session.php');
require_once('class.displayHTML.php');
// Ouverture de session
$sess = new Session();
// Affichage de l'en-tête HTML
$display = new DisplayHTML("ISO-8259-1");
$display->displayHeader("Anti double GET/POST");
// Existe-t-il une session
if (isset($_GET['session'])) {
$session_client=$_GET['session'];
} else {
$session_client_valide=$sess->getNewID();
$session_client=$session_client_valide;
}
// La session est-elle valide ?
if ($session_client != $sess->getCurrentID()) {
// NON =>
if (isset($_POST['texte'])) {
printf("<p>Votre POST : \"<b>%s</b>\".<br />\n", addslashes($_POST['texte']));
printf("Je n'enregistrerai pas votre POST une deuxième fois !\n");
}
$session_client_valide=$sess->getNewID();
} else {
// OUI =>
$session_client_valide=$sess->getNewID();
if (isset($_POST['texte'])) {
printf("<p>Votre POST : \"<b>%s</b>\".<br />\n", addslashes($_POST['texte']));
printf("Je fais quelque chose avec (exemple : enregistrement dans une base...).</p>\n");
printf("<font color=\"#FF0000\"><p>Actualisez la page avec F5 (si IE), Ctrl+R (si Firefox).</p></font>\n");
}
}
// Affichage d'un formulaire à poster
printf("<form action=\"%s?session=%s\" method=\"POST\">\n", $_SERVER['PHP_SELF'], $session_client_valide);
printf("<label>Du texte ici pour l'exemple : </label>\n");
printf("<input type=\"text\" name=\"texte\" />\n");
printf("<input type=\"submit\" name=\"go\" value=\"Valider\"/>\n");
printf("</form>\n");
printf("<a href=\"%s?session=%s\">Nouvelle session pour test.</a><br />\n", $_SERVER['PHP_SELF'], $session_client_valide);
printf("<a href=\"%s\">Retour au début.</a><br />\n", $_SERVER['PHP_SELF']);
$display->displayFooter();
?>
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.