IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres composants PHP Discussion :

[Zend Mail] Souci de suppression d'emails [ZF 1.10]


Sujet :

Autres composants PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Par défaut [Zend Mail] Souci de suppression d'emails
    Bonjour à tous,


    j'ai un souci de suppression de mails dans une mailbox, en passant par une fonction. Je m'explique :

    J'ai une boite mail qui sert à temporiser des inscriptions dans une base de données. Son intérêt est de stocker les inscriptions pour que leur entrée en BDD soit soumise à une validation. Les mails de validation sont envoyés depuis cette mailbox, vers cette mailbox.

    J'ai une page web qui :
    récupère le contenu des mails
    affiche le contenu
    permet de supprimer une inscription (donc le mail) si elle n'est pas conforme
    permet de valider toutes les inscriptions affichées sur la page en cliquant sur un lien "Valider toutes les actions"

    Le fonctionnement normal de cette affaire est le suivant :
    Quelqu'un s'inscrit via un formulaire web
    Alors un mail est envoyé depuis et vers ma mailbox, contenant les données entrées dans le formulaire

    Quand j'affiche ma page web de validation
    Elle m'affiche une partie des infos contenues dans le mail
    Si je clique sur le lien intitulé "Supprimer" en face du mail
    Alors il est supprimé de la mailbox et n’apparaît plus sur la page
    Si je clique sur le lien intitulé "Valider toutes les actions"
    Alors l'inscription est entrée en BDD (avec détection et gestion automatique des doublons)
    Puis le mail est supprimé de ma mailbox et n’apparaît plus sur la page web


    Ça c'est la théorie. En pratique tout fonctionne bien, sauf la suppression en chaîne quand plusieurs mails sont présents dans la mailbox... en effet seul le premier mail de la liste est supprimé. Les autres mails sont bien insérés mais pas supprimés.
    La suppression des mails un par un fonctionne bien (via le lien "supprimer")

    Voici la fonction lancée au clic sur le lien "Valider toutes les actions" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    public function validerallAction()
    	{
     
    		$this->view->title = "Valider toutes les actions en attentes (Inscription/Participation)";
     
    		$mail = new Zend_Mail_Storage_Pop3(array('host' => '10.*.*.*',
    		                                         'user'     => '***',
    		                                         'port'		=> 110,
    		                                         'password' => '***'));
    			if ($this->_request->isPost()) 
    			{
    				$id_message = (int)$this->_request->getPost('id_message');
    				$del = $this->_request->getPost('del');
    				$url = $this->_request->getPost('url');
     
    				if ($del == 'Oui') 
    				{	
    					$myFile = "application/views/scripts/mailbox/LastValidation.txt";
    					$fh = @fopen($myFile, 'w') ;
    					$currentDate = time();
    					fwrite($fh, $currentDate);
    					fclose($fh);
                                            $counter=0;
    					foreach ($mail as $numeroDeMessage => $message) 
    					{
     
    						try
    						{
    							if(!preg_match("#playtest@webprod.ubisoft.net#",$message->from))
    							{
    								$mail->getMessage($numeroDeMessage);
    								$mail->removeMessage($numeroDeMessage); //------> This comment will be removed after tests was made
                                                            }
    						// valide les participation
    							if(preg_match("#participation#",$message->subject))
    							{
    								$getContent = utf8_encode($message->getContent());
    								$candidat_session = simplexml_load_string(trim($getContent));
    								$id_candidat = (int)$candidat_session->id_candidat;
    								$id_session = (int)$candidat_session->id_session;
    								$cs = new CandidatSession();
    								$where = 'tb_candidat_id_candidat = '.$id_candidat.' AND tb_session_id_session = '.$id_session;
    								$select = $cs->fetchRow($where);
    								if(count($select)>0)
    								{	
    									$data = array(
    										'mail_ok' => '1',
    										'statut'  => '2',
    										);
     
    									$cs->update($data,$where);
    									$mail->getMessage($numeroDeMessage);
    									$mail->removeMessage($numeroDeMessage); //------> This comment will be removed after tests was made
     
     
                                                                    }
    								else
    								{
    									$mail->getMessage($numeroDeMessage);
    									$mail->removeMessage($numeroDeMessage); //------> This comment will be removed after tests was made
                                                                    }
    							}
     
    							// valide les inscription/modification de session
    							if(preg_match("#inscription#",$message->subject))
    							{
    								$getContent = $message->getContent();
    								$candidat = simplexml_load_string(trim($getContent));
    								$id_candidat = "";
    								$nom = utf8_decode(ucfirst(strtolower($candidat->nom)));
    								$prenom = utf8_decode(ucfirst(strtolower($candidat->prenom)));
    								$email = utf8_decode(strtolower($candidat->email));
    								$telephone = trim($candidat->telephone);
    								$code_postal = trim($candidat->code_postal);
    								$adresse = utf8_decode(ucfirst(strtolower($candidat->adresse)));
    								$ville = utf8_decode(ucfirst(strtolower($candidat->ville)));
    								$sexe = $candidat->sexe;
    								$date_naissance = $candidat->date_naissance;
    								$date_creation = time();
    								$date_mise_a_jour = time();
    								$date_appel = 0;
     
     
    								$console = utf8_decode(trim($candidat->console));
    								$jeuxenligne = utf8_decode(trim($candidat->jeuxenligne));
    								$visitesitejeux = utf8_decode(trim($candidat->visitesitejeux));
    								$horaire = utf8_decode(trim($candidat->horaire));
    								$typejeu = utf8_decode(trim($candidat->typejeu));
    								$console = preg_replace("#,$#",'',utf8_decode($console));
    								$jeuxenligne = preg_replace("#,$#",'',utf8_decode($jeuxenligne));
    								$visitesitejeux = preg_replace("#,$#",'',utf8_decode($visitesitejeux));
    								$horaire = preg_replace("#,$#",'',utf8_decode($horaire));
    								$typejeu = preg_replace("#,$#",'',utf8_decode($typejeu));
    								$niveauAnglais = array('2' => utf8_decode($candidat->niveauAnglais));
     
    								if($console != '') 
    								{
    									$console = explode(",",$console);
    								}
    								else
    								{
    									$console[0] = '';
    								}
    								if($jeuxenligne != '') 
    								{
    									$jeuxenligne = explode(",",$jeuxenligne);
    								}
    								else
    								{
    									$jeuxenligne[0] = '';
    								}
    								if($visitesitejeux != '')
    								{
    									$visitesitejeux = explode(",",$visitesitejeux);
    								}
    								else
    								{
    									$visitesitejeux[0] = '';
    								}
    								if($horaire != '') 
    								{
    									$horaire = explode(",",$horaire);
    								}
    								else
    								{
    									$horaire[0] = '';
    								}
    								if($typejeu != '') 
    								{
    									$typejeu = explode(",",$typejeu);
    								}
    								else
    								{
    									$typejeu[0] = '';
    								}
     
    								$TheRegex = '/^(9[1-5]|7[4578]|34)\d{3}$/'; 
     
     
    								if (preg_match($TheRegex,$code_postal ))
    								{
    									//Fix the old inscription date problem
     
    									$date_naissance_old_format = $date_naissance - 14400;
     
    									//End Fix
    									$c = new Candidat();
    									//$where = "nom='".$nom."' AND prenom = '".$prenom."'";
    									$where = "nom='".$nom."' AND prenom = '".$prenom."' AND (date_naissance = '".$date_naissance."' OR date_naissance = '" . $date_naissance_old_format . "')" ;
    									$select = $c->fetchRow($where);
     
    									if(count($select)>0)
    									{
    										$id_candidat = $select->id_candidat;
    										$date_creation = $select->date_creation;
    										$date_appel = $select->date_appel;
     
    										$data = array(
    										'id_candidat' => $id_candidat,
    										'nom' => stripslashes($nom),
    										'prenom'  => stripslashes($prenom),
    										'date_naissance'  => $date_naissance,
    										'sexe'  => $candidat->sexe,
    										'email'  => stripslashes($email),
    										'telephone'  => $telephone,
    										'code_postal'  => $code_postal,
    										'adresse'  => stripslashes($adresse),
    										'sexe'  => $sexe,
    										'ville'  => stripslashes($ville),
    										'date_creation'  => $date_creation,
    										'date_mise_a_jour'  => $date_mise_a_jour,
    										'date_appel'  => $date_appel,
                                                                                        //ajout L. SIMONS 09/09/2010 en correction des doublons insérés
                                                                                    'disponibilites' => null,
    										);
     
    										$c->update($data, $where);
     
    										$candidat_console = new CandidatConsole();
    										$candidat_console->insert_tab($console,$id_candidat,'update');
    										$candidat_horaire = new CandidatHoraire();
    										$candidat_horaire->insert_tab($horaire,$id_candidat,'update');
    										$candidat_typejeu = new CandidatTypeJeu();
    										$candidat_typejeu->insert_tab($typejeu,$id_candidat,'update');
     
    										$candidat_visitesitejeux = new CandidatVisitesitejeux();
    										$candidat_visitesitejeux->insert_tab($visitesitejeux,$id_candidat,'update');
     
    										$candidat_jeuxenligne = new CandidatJeuxenligne();
    										$candidat_jeuxenligne->insert_tab($jeuxenligne,$id_candidat,'update');
     
    										$candidat_langue = new CandidatLangue();
    										$candidat_langue->insert_tab($niveauAnglais,$id_candidat,'update');
     
    										$localisation = substr($code_postal,0,2);
    										switch ($localisation)
    										{
    											case '74':  
    												$localisations[] = 2;
    												break;
    											case '34': 
    												$localisations[] = 3;
    												break;
    											default:
    												$localisations[] = 1;
    										}
     
    										$candidat_localisation = new CandidatLocalisation();
    										$candidat_localisation->insert_tab($localisations,$id_candidat,'update');
     
    										$mail->getMessage($numeroDeMessage);
    										$mail->removeMessage($numeroDeMessage);
     
    									}
    									else
    									{
    										$data = array(
    										//'id_candidat' => $id_candidat,
    										'nom' => stripslashes($nom),
    										'prenom'  => stripslashes($prenom),
    										'date_naissance'  => $date_naissance,
    										'sexe'  => $candidat->sexe,
    										'email'  => stripslashes($email),
    										'telephone'  => $telephone,
    										'code_postal'  => $code_postal,
    										'adresse'  => stripslashes($adresse),
    										'sexe'  => $sexe,
    										'ville'  => stripslashes($ville),
    										'date_creation'  => $date_creation,
    										'date_mise_a_jour'  => $date_mise_a_jour,
    										'date_appel'  => $date_appel,
    										);
     
    										$id_candidat = $c->insert($data);
    										$c = new Candidat();
    										//$where = "nom='".$nom."' AND prenom = '".$prenom."'";
    										$where = "nom='".$nom."' AND prenom = '".$prenom."' AND date_naissance = '".$date_naissance."'";
     
    										$select = $c->fetchRow($where);
     
    										if($select != NULL)
    										{
    											$id_candidat = $select->id_candidat;
    										}
     
    										// langues....
    										$candidat_langue = new CandidatLangue();
    										$candidat_langue->insert_tab($niveauAnglais,$id_candidat,'insert');
     
    										//rajouter ici si de nouvelles langues sont int?gr?
    										//$candidat_langue->insert_tab(1,$niveauAnglais,$id_candidat,'insert');
     
     
    										if( count($console)>0 && $console[0] != '')
    										{
    											$candidat_console = new CandidatConsole();
    											$candidat_console->insert_tab($console,$id_candidat,'insert');
    										}
    										if(count($horaire)>0 && $horaire[0] != '')
    										{
    											$candidat_horaire = new CandidatHoraire();
    											$candidat_horaire->insert_tab($horaire,$id_candidat,'insert');
    										}
    										if(count($typejeu)>0 && $typejeu[0] != '')
    										{
    											$candidat_typejeu = new CandidatTypeJeu();
    											$candidat_typejeu->insert_tab($typejeu,$id_candidat,'insert');
    										}
    										if(count($visitesitejeux)>0 && $visitesitejeux[0] != '')
    										{
    											$candidat_visitesitejeux = new CandidatVisitesitejeux();
    											$candidat_visitesitejeux->insert_tab($visitesitejeux,$id_candidat,'insert');
    										}
    										if(count($jeuxenligne)>0 && $jeuxenligne[0] != '')
    										{
    											$candidat_jeuxenligne = new CandidatJeuxenligne();
    											$candidat_jeuxenligne->insert_tab($jeuxenligne,$id_candidat,'insert');
    										}
    										//Fix Y.Robin 16/07/2010
    										$localisation = substr($code_postal,0,2);
    										switch ($localisation)
    										{
    											case '74':  
    												$localisations[] = 2;
    												break;
    											case '34': 
    												$localisations[] = 3;
    												break;
    											default:
    												$localisations[] = 1;
    										}
     
    										$candidat_localisation = new CandidatLocalisation();
    										$candidat_localisation->insert_tab($localisations,$id_candidat,'insert');
    										//End Fix Y.Robin 16/07/2010
                                                                                 	$mail->getMessage($numeroDeMessage);
    										$mail->removeMessage($numeroDeMessage);
                                                                                    $counter +=1;
     
    									}
    									 //------> This comment will be removed after tests was made 
    								}
    								else
    								{
    									$mail->getMessage($numeroDeMessage);
    									$mail->removeMessage($numeroDeMessage);
     
    								}
    							}
    							else
    							{
    								$mail->getMessage($numeroDeMessage);
    								$mail->removeMessage($numeroDeMessage);
     
    							}
     
    						}
    					catch (Zend_Db_Exception $e){/*echo $e->getMessage();*/}
    					//$mail->getMessage($numeroDeMessage);
    					//$mail->removeMessage($numeroDeMessage);
     
    					}
    					echo "Importation OK ";
                                            echo "Supressions des inscrits: $counter. Dernier numéro : $numeroDeMessage";
     
    					//$this->_redirect($url);
    				}
    				else
    				{
    					$this->_redirect($url);
    				}
    			} 
    			else 
    			{
    				$id_message = (int)$this->_request->getParam('id_message');
    				if ($id_message > 0) 
    				{
    					// only render if we have an id and can find the album.
    					$this->view->mail = $mail->getMessage($id_message);
    					$this->view->mail->id_message = $id_message;
     
    					$this->view->candidat = simplexml_load_string(trim($mail->getRawContent($id_message)));
     
    					if ($mail->getMessage($id_message)) 
    					{
    						// render template automatically
    						return;
    					}
    				}
    			}
     
    	}
    Les ID des mails sont en fait gérés un peu bizarrement je trouve, car ils représentent en réalité leur position dans la liste (donc si je supprime le 1, alors le 2 devient 1 à son tour).

    J'ai essayé de faire des retours sur le nombre de mails traités, et le dernier ID traité : Le dernier ID traité est toujours 1 (ce qui me semble normal), et le nombre de mails traités correspond toujours au nombre de mails dans la mailbox avant le lancement de l'action.


    En parcourant le code, je n'ai pas l'impression qu'il y ai d'erreur, donc pour moi tout vas bien ... sauf qu'en fait non ... Comme je débute en Zend et en PHP, je vous sollicite pour éclairer ma lanterne sur ce que j'ai loupé


    P.S : Le bug que je décris a été rencontré plusieurs fois, et a été mystérieusement résolu pour revenir ensuite ... D'autre part je n'ai pas créé le code, je le prends en cours de route.


    Merci d'avance !








    EDIT : j'ai affiché l'erreur attrapée qui est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Zend SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '13310-1' for key 1

    et la stack trace qui ne me parle pas du tout :/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #0 /var/www/html/playtest/library/Zend/Db/Statement.php(283): Zend_Db_Statement_Pdo->_execute(Array) 
    #1 /var/www/html/playtest/library/Zend/Db/Adapter/Abstract.php(406): Zend_Db_Statement->execute(Array) 
    #2 /var/www/html/playtest/library/Zend/Db/Adapter/Pdo/Abstract.php(206): Zend_Db_Adapter_Abstract->query('INSERT INTO `tb...', Array) 
    #3 /var/www/html/playtest/library/Zend/Db/Adapter/Abstract.php(484): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `tb...', Array) 
    #4 /var/www/html/playtest/library/Zend/Db/Table/Abstract.php(816): Zend_Db_Adapter_Abstract->insert('tb_candidat_has...', Array) 
    #5 /var/www/html/playtest/application/models/CandidatLocalisation.php(41): Zend_Db_Table_Abstract->insert(Array) 
    #6 /var/www/html/playtest/application/controllers/MailboxController.php(393): CandidatLocalisation->insert_tab(Array, '13318', 'insert') 
    #7 /var/www/html/playtest/library/Zend/Controller/Action.php(502): MailboxController->validerallAction() 
    #8 /var/www/html/playtest/library/Zend/Controller/Dispatcher/Standard.php(293): Zend_Controller_Action->dispatch('validerallActio...') 
    #9 /var/www/html/playtest/library/Zend/Controller/Front.php(914): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) 
    #10 /var/www/html/playtest/index.php(44): Zend_Controller_Front->dispatch() 
    #11 {main}

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    L'erreur remontée indique que tu essaies de créer plusieurs enregistrements avec la même valeur dans un champ index unique (probablement la clé primaire de ta table). Pour le cas donné, il essaie d'y mettre la valeur '13310-1' alors qu'elle existe déjà.

    La pile permet de savoir que ça se passe à la ligne 41 de CandidatLocalisation.php, suite à l'exécution de la méthode insert_tab ligne 393 de MailboxController.php...

    Difficile d'en dire plus sans plus de code, mais ça doit déjà te donner une piste ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Par défaut
    merki beaucoup pour cette explication de la pile !! Je crois comprendre maintenant comment l'utiliser c'est très chouette.

    Avec ça je vais certainement réussir à débugguer le truc.


    Merci beaucoup !


    EDIT :
    Bon ben "j'aime" ce genre d'erreurs : le dev qui avait mis ça en place avait mal utilisé ses variables, une variable $messages type tableau et une variable $message (sans 's') qui n'en était pas un. Il faisait un truc étrange avec une boucle dans CandidatLocalisation et se plantait dans le nom des variables, du coup c'est ça qui faisait planter la fonction ValiderAllActions.

    J'ai retiré la boucle, homogénéisé les variables et leur type dans cette page et reporté les modifs dans la fonction ValiderAllActions et ça fonctionne !

    Merci beaucoup pour la piste qui m'a totalement sortie de mon cul de sac Je saurai me re servir de ça une prochaine fois !



    Pour info si ça peut servir à d'autres, le code de la partie CandidatLocalisation erronée après correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
        public function insert_tab($localisation,$id_candidat=0,$type='update'){
     
         	if((int)$id_candidat>0){
     
    	     	if($type=='update') $this->delete('tb_candidat_id_candidat='.$id_candidat);
     
         		if(count($localisation)>0){
     
                        //Fix L. SIMONS 03/22/10 :
                        //comment des lignes 38 et 44 + suppression du s de $localisation ligne29
                        //Raison : plus de suppression des mails de la mailbox après validation
     
    		    // foreach($localisations as $localisation){
    		            	$this->insert(
    		            		array(
    			            		'tb_localisation_id_localisation' => $localisation,
    			            		'tb_candidat_id_candidat' => $id_candidat
    		            		));
    		     //}
         		}
         	}
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Mail] envoie automatique d'un email
    Par totie dans le forum Langage
    Réponses: 2
    Dernier message: 27/04/2007, 22h18
  2. [Mail] pour l'envoi d'email
    Par boo64 dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2007, 18h07
  3. [Mail] PHP et envoi d'email avec PHPmailer
    Par dolf13 dans le forum Langage
    Réponses: 6
    Dernier message: 14/07/2006, 00h51
  4. [Mail] Comment envoyer un beau email en php
    Par Alain15 dans le forum Langage
    Réponses: 11
    Dernier message: 30/06/2006, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo