problème de boucle/session : envoi de doublons en nombre variable ?!

problème de boucle/session : envoi de doublons en nombre variable ?! - PHP - Programmation

Marsh Posté le 20-07-2006 à 13:44:49    

Salut à tous!
 
voilà, j'ai un problème depuis plusieurs jours, et je m'arrache les cheveux!!
j'ai créé un formulaire, accessible via un système de session, et les infos sont stockées dans une bdd. une fois l'enregistrement effectué, il ya un système d'envoi automatique de mail au demandeur et à une autre personne.
 
mon problème est le suivant :
une fois mon formulaire rempli, il arrive que les données et les mails soient envoyés en 1 exemplaire (c'est ce que je souhaite à la base), mais il arrive aussi que ces événement surviennent 2 voire 3 fois d'affilée! o_O ce qui généère des doublons dans la base et les boites mails.
ça doit venir d'un problème de boucle, mais j'arrive pas à trouver...
 
ce qui m'interpelle d'autant plus, c'est le nombre variable d'envoi et d'insertion dans la base.
que ça se fasse 1, 2 ou 3 fois, je comprendrais si le nombre était constant, mais ça varie!!!
 
il ya une page de connexion donc, et derrière la page de formulaire que voici (désolé il est long!!)  :
 

Code :
  1. <?
  2. session_start();
  3. mysql_connect("localhost", "***", "****" ) or die(mysql_error());
  4. mysql_select_db("feb" )or die(mysql_error());
  5. // récupération des données date du jour
  6. $datejour=date('d');
  7. $datemois=date('m');
  8. $dateannee=date('Y');
  9. $datedemande= $dateannee.'-'.$datemois.'-'.$datejour;
  10. //selection des données liées  à la personne pour récupérer sa signature
  11. $requetesign=mysql_query('SELECT * FROM acces WHERE identifiant="'.$_SESSION['identifiant'].'"') or die(mysql_error());
  12. while ($reponseacces=mysql_fetch_array($requetesign)) {
  13. $signaturedemandeur=$reponseacces['signature'];
  14. }
  15. //création du numéro de la demande
  16. $requetenombreexact= mysql_query('SELECT numero FROM demande WHERE (mois='.$datemois.' AND an='.$dateannee.') ORDER BY id DESC')or die(mysql_error());
  17. $reponseexact= mysql_fetch_array($requetenombreexact);
  18. $nombre=explode('-', $reponseexact['numero']);
  19. if (isset($nombre[3]))
  20. {
  21. //echo $donneesnombre['nb_mois'];
  22. $n=$nombre[3]+1;
  23. }
  24. else {$n=1;}
  25. $numero='FEB-'.$dateannee.'-'.$datemois.'-'.$n;
  26. //protection pour éviter les quotes dans les données de la table
  27. if(isset($_POST['nota'])) {
  28. $nota1=addslashes($_POST['nota']);}
  29. if(isset($_POST['definition'])) {
  30. $definition1=addslashes($_POST['definition']);}
  31. if(isset($_POST['montant'])) {
  32. $montant1=addslashes($_POST['montant']);}
  33. if(isset($_POST['destinataire'])) {
  34. $destinataire1=addslashes($_POST['destinataire']);}
  35. if (isset ($_POST['jourdispo'])AND isset($_POST['moisdispo']) AND isset( $_POST['andispo']))
  36. {
  37. $datemiseadispo=$_POST['andispo'] . '-' . $_POST['moisdispo'] . '-' . $_POST['jourdispo'];
  38. }
  39. //si le responsable est non défini pour l envoi par mail
  40. if (isset($_POST['resp']) AND $_POST['resp']=="rien" )
  41. {
  42. ?><script language="javascript" type="text/javascript">alert("Vous n'avez pas choisi la personne à qui envoyer votre FEB !" );</script><?
  43. }
  44. //si oui :
  45. if(isset($_POST['resp'])AND $_POST['resp']!="rien" )
  46. {
  47. //insertion des données dans la table demande
  48. $insertion=mysql_query("INSERT INTO demande (id, numero, demandeur, signaturedemandeur, tel, mel, definition, destinataire, datemiseadispo, nota, montant, datedemande, respbudget, mois, an) VALUES ('', '".$_POST['numero']."', '".$_SESSION['nomprenom']."', '".$reponseacces['signature']."','".$_SESSION['tel']."', '".$_SESSION['mel']."', '".$definition1."', '".$_POST['destinataire']."', '".$datemiseadispo."', '".$nota1."', '".$montant1."', '".$datedemande."', '".$_POST['resp']."', '".$datemois."', '".$dateannee."' )" ) or die(mysql_error());
  49. //envoi de mail au demandeur
  50. $entete = "From: intranet-fiche expression de besoin\r\n";
  51. $entete .= "MIME-Version: 1.0\r\n";
  52. $entete .= 'Content-type: text/html; charset=iso-8859-1'."\r\n";
  53. $email=$_SESSION['mel'];
  54. $sujet='FEB numero : '.$_POST['numero'] ;
  55. $message="Bonjour,\n\n ";
  56. $message .= '<p>Votre demande numero '.$_POST['numero'].' a bien été prise en compte. <br> Vous pouvez &agrave; tout moment consulter votre demande à <a href="http://**************/consultation.php?numero='.$_POST['numero'].'" target="_blank">cette adresse</a>. <br>
  57. Veuillez conserver ce num&eacute;ro pour acc&eacute;der &agrave; votre demande via le site intranet.
  58. <br>
  59. Cordialement,<br>
  60. Le site Intranet.</p>';
  61. mail($email,$sujet,$message,$entete);
  62. //envoi de mail au responsable
  63. $requeteresp=mysql_query('SELECT * FROM acces WHERE nomprenom="'.$_POST['resp'].'"') or die (mysql_error());
  64. while ($reponseresp=mysql_fetch_array($requeteresp))
  65. {
  66. $entete = "From: intranet-fiche expression de besoin\r\n";
  67. $entete .= "MIME-Version: 1.0\r\n";
  68. $entete .= 'Content-type: text/html; charset=iso-8859-1'."\r\n";
  69. $email= reponseresp['mel'];
  70. $sujet='FEB numero : '.$_POST['numero'].' en attente' ;
  71. $message="Bonjour,\n\n ";
  72. $message .= '<p>La FEB numero '.$_POST['numero'].' a été formulée sur l intranet et est en attente de validation de votre part. <br> Vous pouvez y accéder à <a href="http://***********/consultationrespbudget.php?numero='.$_POST['numero'].'" target="_blank">cette adresse</a>. <br>
  73. <i>Nota</i> : Votre mot de passe et login seront nécessaires pour authentifier votre identité.<br> Merci de votre compréhension.
  74. <br>
  75. Cordialement,<br>
  76. Le site Intranet.</p>';
  77. mail($email,$sujet,$message,$entete);
  78. //destruction de la session
  79. session_destroy();
  80. ?>
  81. <script language="javascript" type="text/javascript">alert("Votre FEB a bien été prise en compte. Un mail de confirmation vous est envoyé, et le responsable budget est informé. " );
  82. window.location.href="../../index.html";
  83. </script><?
  84. //}
  85. }
  86. }
  87. ?>


 
Si qq'un peut me filer un coup de main, je vois vraiment pas mon erreur...
merci!!
 
[EDIT] : bon j'ai raccourci mon code, pour pas vous décourager de lire mon post, je vous fais grâce de ma partie html, elle n'est pas la cause de mon problème de toutes façons...


Message édité par flock86 le 20-07-2006 à 15:46:24
Reply

Marsh Posté le 20-07-2006 à 13:44:49   

Reply

Marsh Posté le 20-07-2006 à 15:24:55    

au pif (pas regardé le code), tu es sûr que tes utilisateurs ne cliquent pas plusieurs fois sur le lien de validation qui lance ton script? :D


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-07-2006 à 15:44:21    

skeye a écrit :

au pif (pas regardé le code), tu es sûr que tes utilisateurs ne cliquent pas plusieurs fois sur le lien de validation qui lance ton script? :D


 
ben non...
je sus en phase de test et c'est moi qui remplis les formulaires et reçoit les mails...
 
en fait, je viens de faire plein de petits tests :  
c'est pas un problème de boucle : j'ai mis divers echo après chaque accolade, pour voir si il y avait répétition.
ben y'a pas de répétition, tous les echos s'affichent une seule fois sur ma page...
 
en fait, je crois que c'est un problème de session :
 
j'envoie un premier formulaire après avoir viré le cache et l'historique : envoi normal...pas de problème...
je retape l'url de connexion, 2ème envoi avec le même pseudo et du coup j'ai les nouvelles données en double...
 
si entre temps, je me suis connecté avec un autre pseudo pour répondre à la première demande, la seconde demande n'aura pas de problème...
 
 
arf je sais pas si je suis clair!  
en gros : pseudo1 ->envoi1 ->pas de doublons
pseudo1 ->envoi2 -> doublons  
 
pseudo1 ->envoi1->pas de doublons
pseudo2->reponse1->ok
pseudo1->envoi2->pas de doublons
 
Pourtant, je fais un session_destroy() après l'envoi des mails...
dans le cadre d'une utilisation normale ça devrait ptet passer, mais c'est pas stable...
si la même personne fait 2 demandes différentes à la suite c'est la merde...
 
enfin merci skeye d'avoir répondu, me sentait un peu seul lol
 
 
 

Reply

Marsh Posté le 20-07-2006 à 15:48:08    

Toujours pas lu le code, mais en effet après insertion des données censées être uniques il serait p-e bien de virer les données de la session, ou de mettre à jour un marqueur qui dit que l'insertion est faite...ne serait-ce que pour éviter de réinsérer dans la base sur un refresh du navigateur!:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-07-2006 à 15:52:04    

ok merci...
je pensais qu'un session_destroy(); suffisait à supprimer les données de session...ce qui doit être le cas, mais bon...
justement, le destroy marche bien, quand je refresh toutes les variables de session sont indéfinies...
vais essayer de bidouiller mon code avec l'histoire du marqueur..

Reply

Marsh Posté le 20-07-2006 à 15:54:13    

ah ben oui si tu fais un destroy de toute la session ya plus rien! :D


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-07-2006 à 15:56:23    

skeye a écrit :

ah ben oui si tu fais un destroy de toute la session ya plus rien! :D


 
donc : y'a pas de raison d'avoir des doublons  :pt1cable:  
on est d'accord skeye... :D  
 
mais le destroy est là depuis le départ, ça n'empeche pas mon code de m****** en beauté

Reply

Marsh Posté le 20-07-2006 à 15:59:30    

flock86 > T'es sur que tes utilisateurs ne sont pas du type "double clic et + si lenteur"?
 
De plus, t'es sur qu'une partie des données en question n'es pas rechargé quand le client passe dans une autre page?

Reply

Marsh Posté le 20-07-2006 à 16:11:19    

omega2 a écrit :

flock86 > T'es sur que tes utilisateurs ne sont pas du type "double clic et + si lenteur"?
 
De plus, t'es sur qu'une partie des données en question n'es pas rechargé quand le client passe dans une autre page?


 
 
merci de ta réponse omega 2 :jap:  :
alors, le "double clic et + si lenteur" c'est pas mon genre...suis seul sur ce coup là, je teste  pour l'instant  :D  
donc ça vient pas de là.  
par "sécurité" j'ai déplacé ma requete sql et mes envois de mail sur une autre page et je fais une redirection automatique vers la page d'accueil du site, sans envoi de données ni par get, session, ou post (pas de conexion de session à la page d'accueil) . les données ne sont donc pas (logiquement) rechargées.  
l'insertion des données et les mails sont envoyés direct en doublons.
 
comme dirait M. Cyclopède :"étonnant non?"


Message édité par flock86 le 20-07-2006 à 16:12:02
Reply

Marsh Posté le 20-07-2006 à 16:13:36    

C'est quoi le navigateur que t'utilise? T'apelle la méthode avec xmlhttprequest ou directement à l'aide d'un formulaire classique?
Il me semble avoir entendu parlé d'un cas où un navigateur envoyé deux fois la demande d'une page mais je ne me rapelle plus lequel ni dans quel cas.
 
C'est une piste à vérifier dans les logs du serveur web.


Message édité par omega2 le 20-07-2006 à 16:13:59
Reply

Marsh Posté le 20-07-2006 à 16:13:36   

Reply

Marsh Posté le 20-07-2006 à 16:20:07    

arf!
ben tu vois je l'aurais jamais trouvé ce truc là...
navigateur : IE 6 (j'ai honte mais pas le choix, imposé sur tous les postes)
 
et la méthode via le formulaire..
 
merci pour l'info en tous les cas!
vais essayer avec firefox et opéra, on verra bien déjà.
 
AAAAAAAAAAAARG!!
ça marche nickel avec firefox!
 
Saloperie d'IE!! :fou:  
déjà que je l'aime pas dès le départ s'uilà!  
mais bon, c'est pas une excuse! ça doit fonctionner sur tous les navigateurs...
 
ben merci omega2, j'ai pas ma solution, mais au moins, je sais d'où ça vient! :sweat:  :D  
et...j'imagine que c'est pas paramétrable ct' histoire d'envoi en double!
 
et merci skeye aussi! :D
 
m'enfin, un système de formulaire/session sur IE, on va pas me faire croire que c'est pas monnaie courante.
c'est pas la mort mon truc non plus.
1 formulaire, 2 mails 1bdd...
mais pas de boucle foireuse apparemment...
je vais essayer de m'affranchir des sessions, au moins pour l'envoi des mails et l'insertion dans la base.
 (vais pas envoyer des formulaires cachés à tout bout de champ non plus!)
 


Message édité par flock86 le 20-07-2006 à 17:27:35
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed