Ajouter session de vérification à un formulaire

Petit nouveau ! | 2 Messages

03 janv. 2012, 14:40

Bonjour,

Je voudrais mettre en place une session qui me permette de vérifier si un formulaire a déjà été envoyé ou pas.

Mais malheureusement je n'y connais pas grand chose, je viens vers vous car j'ai un script de vente, marchant avec paypal et lors du retour sur mon site si on actualise la page on est crédité à chaque fois du montant des points attribués à l'utilisateur...(il ne devrait biensur être attribué une seule fois)
Mais là si on arrive sur la page et qu'on actualise 100 fois et bien on est crédité 100 fois le top quoi :-(

L'idéal je pense ce serait modifier une variable de session lors de l'exécution de la requête: par exemple je mets une variable à 0 lors de l'exécution, en rajoutant une ligne qui la passe à 1, biensur avant l'exécution de la raquête, et ensuite ajouter une autre ligne qui vérifie la valeur de cette variable: si elle vaut 0, j' exécute, si elle vaut 1, je n'exécutes pas.

Voilà pour la théorie je pense que j'ai bon, mais pour la mise en pratique je suis perdu comment faire ??

Quelles sont les lignes de codes à rajouter, ça ne doit pas être bien long...?
Mais je n'y connais vraiment pas grand chose, à l'origine le script que j'ai "aurai du" bien fonctionné...

Enfin merci d'avance de bien vouloir m'aider.

Mammouth du PHP | 1339 Messages

03 janv. 2012, 14:55

Bah c'est pourtant simple :)
if(!empty($_POST['submit'])) { // Le formulaire est valide
if(empty($_SESSION['deja'])) { // On verifie que la session existe pas deja
 
$_SESSION['deja'] = 1; // On declare la session
// La tu traites ton formulaire
} else {
echo 'Vous avez deja valide le formulaire';
}
} else {
// Le formulaire
}
Il faut biensur déclaré session_start() en haut de la page avant tout !
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Mammouth du PHP | 568 Messages

03 janv. 2012, 15:02

Regarde du côté des tokens, qui ont l'avantage de pouvoir sécuriser tes formulaires.

Tu créé un token que tu met en session et dans un input hidden de ton form.

Une fois le formulaire envoyé, tu vérifie que le token en session est égal au token fournit par le formulaire.

Si tout est ok, tu enregistre tes données et tu détruis le token.

Un peu de doc: http://phpsec.org/projects/guide/2.html#2.4

Petit nouveau ! | 2 Messages

03 janv. 2012, 15:43

Bon alors déjà merci de vos réponses et j'adore le : "Bah c'est pourtant simple " lol

C'est clair çà à l'air d'être simple mais je n'y comprends pas grand chose... :oops:


En regardant mon code il me semble je vais vous le mettre ci-dessous que c'est là que çà se passe mon histoire :D je pense.

Donc en fait ma page reçois les infos de paypal et les traite attribution des points, message succès paiement ou paiement échoué.

Il faudrait donc rajouter une condition qui fasse que si les points ont déjà été attribué et bien qu'il ne soient plus, enfin que toutes les données paypal envoyées ne soient plus traitées...

Bref je vous mets le code:

Code : Tout sélectionner

else if($option=='P') { $pay_title=$lang['paypal'].' '.$lang['conf']; if($payment_status =="Completed") { $dbh->query("update account set paystatus='TRUE', approved='Y' where md5(order_id)='$oid'"); $qry="select * from account where md5(order_id)='$oid'"; $qryResult=$dbh->query($qry); $Data=mysql_fetch_object($qryResult); $qry11="select credit from credit_cost where id='$Data->bid_cost'"; $qryResult11=$dbh->query($qry11); $Data11=mysql_fetch_object($qryResult11); $qry1="select * from users where user_id='$Data->user_id'"; $qryResult1=$dbh->query($qry1); $Data1=mysql_fetch_object($qryResult1); $qry2="select amount from amount_transfer where user_id='$Data->user_id' and credit_type='C' and reason like '%Welcome Coupon%'"; $qryResult2=$dbh->query($qry2); $Data2=mysql_fetch_object($qryResult2); if($Data1->balance==$Data2->amount) { $tbalance=$Data1->balance + $Data11->credit + $First_purchase_bid; $dbh->query("insert into amount_transfer (user_id, entrydate, amount, amount_type, pay_type, reason) values('$Data1->user_id', '$CURRENT_Time', '$First_purchase_bid','P', 'Credit', 'Free bid on First Bid Purchasing')"); } else { $tbalance=$Data1->balance + $Data11->credit; $dbh->query("insert into amount_transfer (user_id, entrydate, amount, pay_type, reason) values('$Data1->user_id', '$CURRENT_Time', '$Data11->credit', 'Credit', 'Bid Purchasing')"); } $sql2="update users set balance='$tbalance' where user_id='$Data1->user_id'"; $result=$dbh->query($sql2); $sql3="update account set transfer_status='TRUE' where order_id='$Data->order_id'"; $result=$dbh->query($sql3); $credit=$Data11->credit; $Email_info=$functions->Email_info(12); $subject=$Email_info['subject']; $msgBody1=$Email_info["message"]; $msgBody=str_replace("\\", "", $msgBody1); eval("\$msgBody = \"$msgBody\";"); $functions->Send_mail($SITE_EMAIL,$SITE_TITLE,$Data1->email,$subject,$msgBody); $heading=$lang['msg_bid_rec_success'].' '.$lang['paypal']; } else { $heading=$lang['msg_bid_rec_fail']; $retry='<td align="center"><input type="submit" value="'.$lang['retry'].'" name="retry"></td>'; $retry_page='index.php?show=bid_tickets'; } }

Voilà si vous pouvez me dire comment faire ce serait super.

Pour le session start il me semble avoir lu qu'il fallait qu'il soit avant tout code html et je ne sais pas si je peux le faire...