Interdire l'actualisation d'une page

Eléphanteau du PHP | 21 Messages

22 juin 2007, 11:17

Bonjour,

Je ne sais pas vraiment si cela relève du php mais j'aimerai interdire l'actualisation d'une page internet.

J'ai déjà cherché pas mal sur google mais c'est sans résultat.
Je recherche un petit script tout fait que je pourrais décortiquer facilement.

Si cette requete n'est en aucun cas du domaine du php, veuillez supprimer ce message et je serais sincèrement désolé :oops:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 juin 2007, 11:23

Ce n'est pas tant que ce soit du domaine du php ou non, mais l'actualisation d'une page est une fonctionnalité du navigateur que tu ne peux interdire... que ce soit la touche F5, le bouton actualiser, l'action précédent/suivante, l'ouverture de l'url dans une nouvelle fenêtre, etc. : Tu ne peux pas empêcher une page d'être actualisée par l'utilisateur....
En revanche selon ton besoin, il existe des solutions en php pour éviter/empêcher que des données ne soient renvoyées (pattern post-redirect-get), que des traitements ne soient effectuées plusieurs fois (enregistrement en session, utilisation de cookie) ...

Donc dis nous en plus sur le pourquoi et on pourra mieux t'aider sur le comment :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 21 Messages

22 juin 2007, 11:31

Dans mon dernier topic, je cherchais comment ajouter +10 points à un membre lorsqu'il venait sur une page. En fin de compte, je voudrais qu'il lui soit impossible de regagner 10 points lorsqu'il rafraichi sa page. Je vous remet le code (qui ne vous sera sans doute pas utile) :
<?php
session_start();

// on se connecte à MySQL 
$db = mysql_connect('localhost', 'Morph', '000000'); 
 // on sélectionne la base 
mysql_select_db('antrix',$db);

if( isset($_SESSION['login']) ) 
{ 
$sql = "Update accounts Set points = points +10 where login='". $_SESSION['login'] ."'"; 

mysql_query($sql); 
// la variable de session nom est enregistrée 
echo 'FELICITATION votre compte ' .$_SESSION['login']; 
echo ' a ete solde de 10 points'; 

}
else
{
// la variable n'est pas enregistrée, on renvoi sur le formulaire

echo 'Un probleme est survenu, veuillez contacter le webmaster'; 

} 

?>
(ps je fais cela à titre d'entrainement pout débutant, soyez indulgeant :oops: )

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 juin 2007, 11:44

A quel rythme pourra-t-il récupérer ces 10 points ? une seule fois seulement ? une fois par jour ? une fois par mois ?

Dans le premier cas (1 fois seulement), il te suffit d'ajouter un champ dans ta base pour dire si oui ou non le bonu a été pris (un simple nombre 1/0 te permettra de le savoir. Ainsi, tu n'accorde le bonus que si ce champ est à 0 (par exemple) et lorsque tu donnes le bonus, tu mets également ce champ à jour en le passant à 1 :
if( isset($_SESSION['login']) && $flag_du_bonus == 0) {
  $sql = "Update accounts Set 
    points = points + 10,
    flag_bonus = 1
    where login='". $_SESSION['login'] ."'";  
...
}
Si jamais c'est une fois par jour/mois/... au lieu d'un champ nombre, il te suffit de stocker la date de prise du bonus... de la même manière tu pourras comparer cette date à la date du jour (voir le topic sur les dates de la FAQ) pour savoir s'il droit à son prochain bonus ou non :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 21 Messages

22 juin 2007, 11:49

Bonne solution dans les cas que tu indiques merci :)
Et comment faire si l'utilisateur peut avoir son bonus autant de fois qu'il a accès à cette page tout en ne rajoutant pas ce bonus lors d'un rafraichissement? (je pense au cas de l'allopass par exemple :roll: )

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 juin 2007, 12:05

Alors pour ça, y a un truc qui se fait très bien et dont je parlais plus haut, c'est le modèle PRG : Post Redirect Get.

L'idée c'est de poster un formulaire en post (mais ca marche aussi en get), de récupérer les données dans un script php qui fera le traitement (donc l'ajout de ton bonus) et qui va automatiquement rediriger l'utilisateur vers une autre page de confirmation (ou d'erreur) avec la fonction header()

La redirection via header() étant totalement transparante pour l'utilisateur (comme pour le navigateur), même si l'utilisateur actualise comme un malade, il ne fera que recharger la page de confirmation et le traitement ne sera pas relancé (donc pas de nouveau bonus)

De plus, s'il fait précédent, cela le ramène au formulaire qu'il devra à nouveau remplir et renvoyer pour que le traitement s'exécute à nouveau. Et à ce moment là, le contrôle allopass (vérif du numéro), ou le contrôle décrit ci dessus (flag ou date) te permettront de savoir si l'update doit réellement être répété ou s'il n'y a plus droit :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 21 Messages

22 juin 2007, 12:42

Merci c'est incroyable comme c'est bien expliqué :wink:

Aurais tu un exemple concret? :oops: un petit bout de code afin que je puisse voir comment adapter ceci à ma page ?

Je ne suis que débutant et pour moi, la meilleur façon de comprendre et d'apprendre est de voire des exemple :) .
Si quelqu'un a un site internet sur cela (je n'en ai pas trouvé...) ce serait super aussi.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 juin 2007, 13:40

Bah en exemple concret, tu as ce forum... lorsque tu postes un message, les données sont envoyées à la page posting.php qui fait les test qui vont bien (savoir si tu es un invité, si tu as les droits de poster dans le forum, etc.) et qui enregistre les données, puis qui te redirige vers la page de confirmation avec les liens de retour au topic ou au forum. Tu verras que si tu actualises cette dernière page, ton message n'est pas reposté pour autant...

Point de vue code, y a pas grand chose à voir... une page avec un formulaire dans lequel tu met ce que tu veux, une autre page (voire la même) avec le traitement php pour tester/enregistrer les données, et redirige une fois terminé l'utilisateur avec l'instruction :
<?php
... 
header("Location:page_confirmation.php?succes=" . $succes);
?>
Et une page "page_confirmation.php" qui éventuellement récupère $_GET['succes'] et qui en fonction de sa valeur (et donc du résultat du traitement) affichera "Bravo vous avez gagné 10 points" ou "Non mais dis donc malotru ?! Tu te crois où ?! T'as déjà pris ton bonus, alors maintenant tu fiches le camp ou j'balance ton ip au webmaster pour qu'il te bannisse !!" ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 21 Messages

22 juin 2007, 13:48

Ok merci beaucoup
[SUJET CLOS]