2009-11-12 6 views
0

Lorsque j'essaie d'envoyer un e-mail à partir de la boucle while avec PHPMailer, il envoie parfois 2, parfois 3 copies du même e-mail (de manière aléatoire) à chaque destinataire.Envoyer un e-mail dans while loop

Voici mon code. Pensez-vous qu'il a des problèmes?

$list = $_POST['list']; 
    $items = rtrim($_POST['items'],","); 
    $query = "SELECT * FROM `mail` WHERE `ID` IN ($items)"; 
    $result = mysql_query($query); 
    $from = "[email protected]"; 
    $fromname = "mysite"; 

    $mail = new PHPMailer(true); 

    $mail->IsSendmail(); 

    $mail->From  = $from; 
    $mail->FromName = $fromname; 

    $mail->Subject = "Your subscription was confirmed"; 

while ($row = mysql_fetch_array ($result)) 
{ 
    // HTML body 
    $body .= "<p>Hi ". $row['name'] ." <br /><br />"; 
    $body .= "Your subscription request to " . $l_name ."'s list was confirmed.<br /><br />"; 
    $body .= "Thank You !<br /><br />"; 

    // Plain text body (for mail clients that cannot read HTML) 
    $text_body = "To view the message, please use an HTML compatible email viewer!"; 

    $mail->Body = $body; 
    $mail->AltBody = $text_body; 
    $mail->AddAddress($row['email']); 


    $mail->Send(); 
    $mail->ClearAddresses(); 

} 

Pensez-vous que je devrais mettre cette mail->send(); hors de la boucle while et obtenir tous les e-mails à partir d'un tableau?

Ou pensez-vous que c'est le problème avec la requête MySQL?

Editer: J'ai vérifié la base de données, pas de problème avec la base de données mais j'ai compris que (2 disons qu'il y en a 2 dans le tableau) variable du corps dubliquée.

CORRECTIF: hé, je l'ai fait, je viens d'ajouter $body = ""; et ça marche parfaitement maintenant!

+4

Je pense qu'il est plus probable que les doublons dans la avez base de données. – David

+0

Je suis d'accord avec David. Vérifiez votre base de données. – mauris

+0

Oui, je vais avec David. Vérifiez votre base de données – sathish

Répondre

1

Il suffit de mettre un "SELECT DISTINCT" sur votre requête et vous ne verrez plus de problèmes avec votre base de données.

+0

merci, mais je l'ai vérifié, il ne s'agit pas de la base de données dublicate, il s'agit de la boucle, j'ai besoin de réinitialiser variable $ corps, je suppose –

1

Je pense qu'il est plus que probable que les données soient en double dans la base de données.

Je suis également préoccupé par le manque de validation (ou pas du tout) sur le tableau POST.

vaut peut-être vous regarder ceci:

cleaning $_POST variables

Mise à jour: Alors que vous pouvez simplement utiliser DISTINCT sur la requête que je me demande comment les doublons sont arrivés là en premier lieu et de regarder ce que comme question séparée.

0

Vous avez mentionné le correctif à la fin de votre question, mais voici pourquoi cela fait une différence:

L'opérateur .= à la valeur ajoute existante, alors que = remplace. A la fin de la première itération et au début de la seconde, $body contient le corps de l'e-mail, pendant la deuxième itération, vous ajoutez ensuite à la valeur existante. Chaque fois que la boucle s'exécute, vous ajoutez une autre copie à la fin de l'e-mail. Comme vous l'avez dit, le réglage $body = "" le corrige car il vide le corps de l'e-mail.

Une autre façon de le fixer serait de faire la première affectation = au lieu de .=:

while ($row = mysql_fetch_array ($result)) 
{ 
    // HTML body 
    $body = "<p>Hi ". $row['name'] ." <br /><br />"; // This line only has '=' 
    $body .= "Your subscription request to " . $l_name ."'s list was confirmed.<br /><br />"; 
    $body .= "Thank You !<br /><br />"; 

    // etc... 
}