Bonjour,
J'essaye de créer un script de notifications par email (dans le cadre d'un forum, il avertit un nouveau sujet posté), cependant le résultat final est qu'un seul email est envoyé (au lieu de deux attendu pour le test). Le code est assez long la procédure globale est que :
Je récupère les membres qui ont souscrit, puis pour chaque membre qui a souscrit :
-Je sélectionne tous ce à quoi il a souscrit puis pour tout ce à quoi il a souscrit
--Je récupère les sujets qui le concernent
-Je groupe les sujets dans un email que j'envoie
Etant donné qu'à part mon problème tout mon fonctionne, je suppose que l'erreur se situe sur la première boucle, qui pour chaque membre est censé envoyer un email : Cette boucle :
foreach ($memberid_liste as $memberid_unique)
qui parcoure un array qui ressort ainsi au print_r :
Array ( [0] => 69571 [1] => 67159 )
Donc seul le premier membre recoit l'email. A la fin de cette boucle j'ai un message de validation pour chaque email envoyé, je devrais donc en avoir deux mais là encore je n'en ai qu'un.
Je ne comprend vraiment pas pourquoi cette boucle ne s’exécute qu'une fois.
Je vous met également le code complet, qui malheureusement est un peu long et sans doute pas opti.
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=tests', 'root', 'XXX', $pdo_options);
//On récupère les id des membres qui ont souscrit à quelque chose, et on les array_unique car un membre ne doit recevoir qu'un email même s'il a soucrit à plus d'une chose
$reponse = $bdd->query('SELECT memberid FROM vb_notif_adoptions');
while ($donnees = $reponse->fetch()){
$categories[] = $donnees['memberid'];
}
$memberid_liste = array_unique($categories);
//Pour chaque membre ayant souscrit....
foreach ($memberid_liste as $memberid_unique){
$contenu_mail_html = '';
$contenu_mail_txt = '';
//On sélectionne ce à quoi il a souscrit
$req = $bdd->prepare('SELECT * FROM vb_notif_adoptions WHERE memberid = :memberid');
$req->execute(array('memberid' => $memberid_unique));
//Puis pour chaque souscription on construit la requête en fonction des options de sa soucription, qui ira chercher les sujets qui l'intéresse
while ($reponse_a = $req->fetch()){
$req_thread = '';
if($reponse_a['a2'] != 0){
$req_thread .= 'AND (';
$traitement_a2 = explode(",", $reponse_a['a2']);
foreach( $traitement_a2 as $key => $value ){
if($value != ''){
$req_thread .= ' a2 = '.$value.' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
if($reponse_a['a3'] != 0 AND $reponse_a['a3'] != '1,2,3,'){
$req_thread .= 'AND (';
$traitement_a3 = explode(",", $reponse_a['a3']);
foreach( $traitement_a3 as $key => $value ){
if($value != ''){
$req_thread .= ' a3 = '.$value.' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
if($reponse_a['a4'] != 0 AND $reponse_a['a4'] != '1,2,'){
$req_thread .= 'AND (';
$traitement_a4 = explode(",", $reponse_a['a4']);
foreach( $traitement_a4 as $key => $value ){
if($value != ''){
$req_thread .= ' a4 = '.$value.' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
if($reponse_a['a9'] == 1){
$req_thread .= ' AND a9 = 1';
}
if($reponse_a['a10'] == 1){
$req_thread .= ' AND a10 = 1';
}
if($reponse_a['a11'] == 1){
$req_thread .= ' AND a11 = 1';
}
if($reponse_a['a12'] == 1){
$req_thread .= ' AND a12 = 1';
}
if($reponse_a['a13'] != 0){
$req_thread .= ' AND (';
$traitement_a13 = explode(",", $reponse_a['a13']);
foreach( $traitement_a13 as $key => $value ){
if($value != ''){
$req_thread .= ' a13 = '.$value.' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
if($reponse_a['a14'] != 0 AND $reponse_a['a14'] != '1,2,3,4,5,6,7,'){
$req_thread .= 'AND (';
$traitement_a14 = explode(",", $reponse_a['a14']);
foreach( $traitement_a14 as $key => $value ){
if($value != ''){
$req_thread .= ' a14 = '.$value.' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
if($reponse_a['a17'] != 0 AND $reponse_a['a17'] != '1,2,3,'){
$req_thread .= 'AND (';
$traitement_a17 = explode(",", $reponse_a['a17']);
foreach( $traitement_a17 as $key => $value ){
if($value != ''){
$req_thread .= ' a17 = '.$value.' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
if($reponse_a['a21'] == 1){
$req_thread .= ' AND a21 = 1';
}
if($reponse_a['a22'] == 1){
$req_thread .= ' AND a22 = 1';
}
if($reponse_a['a23'] == 1){
$req_thread .= ' AND a23 = 1';
}
if($reponse_a['a24'] == 1){
$req_thread .= ' AND a24 = 1';
}
if($reponse_a['a25'] == 1){
$req_thread .= ' AND a25 = 1';
}
if($reponse_a['a30'] != 0 AND $reponse_a['a30'] !='0_11,12_35,36_83,84_119,120_1200'){
$req_thread .= ' AND (';
$traitement_a30 = explode(",", $reponse_a['a30']);
foreach( $traitement_a30 as $key => $value ){
if($value != ''){
$a30_clean = explode("_", $value);
$date_a30_debut = date("Y-m-d", mktime(0,0,0,date("m")-$a30_clean[1],01,date("Y")));
$date_a30_fin = date("Y-m-d", mktime(0,0,0,date("m")-$a30_fin[0],01,date("Y")));
$req_thread .= ' a30 BETWEEN \''.$date_a30_debut.'\' AND \''.$date_a30_fin.'\' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
if($reponse_a['a31'] == 1){
$date_a31 = date("Y-m-d", mktime(0,0,0,date("m"),date("d"),date("Y")-5));
$req_thread .= ' AND a31 <= \''.$date_a31.'\'';
}
if($reponse_a['a32'] != 0 AND $reponse_a['a32'] != '1,3,7,14,3600,'){
$req_thread .= ' AND (';
$traitement_a32 = explode(",", $reponse_a['a32']);
foreach( $traitement_a17 as $key => $value ){
if($value != ''){
$date_a32 = date("Y-m-d", mktime(0,0,0,date("m"),date("d")-$value,date("Y")));
$req_thread .= ' a32 <= \''.$date_a32.'\' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread = preg_replace('#^AND#', '', $req_thread);
//On a finis la requête, et on sélectionne les sujets voulus...
$sujets = $bdd->query('SELECT threadid FROM vb_thread WHERE dateline >= (UNIX_TIMESTAMP() - (24*3600)) AND '.$req_thread);
//...Qu'on ajoute à un array
while($sujets_unique = $sujets->fetch()){
$sujets_liste[] = $sujets_unique['threadid'];
}
unset ($req_thread);
}
$last_req = '';
$sujets_liste = array_unique($sujets_liste);
//On construit la requete qui ira définitivement chercher les sujets qui l'intéressent
foreach( $sujets_liste as $key => $value ){
$last_req .= ' threadid = '.$value.' OR';
}
//Le mail n'est pas envoyé s'il n'y a pas de sujets contenus
if(isset($last_req) AND $last_req != ''){
$last_req = preg_replace('# OR$#', '', $last_req);
//On récupère tous les sujets qui seront contenus dans le mail
$final_sujets = $bdd->query('SELECT threadid, title FROM vb_thread WHERE '.$last_req);
//On récupère les infos du membre
$final_membres = $bdd->prepare('SELECT userid, username, email FROM vb_user WHERE userid = :memberid');
$final_membres->execute(array('memberid' => $memberid_unique));
$final_membres = $final_membres->fetch();
//On construit le mail
if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $final_membres['email'])){
$passage_ligne = "\r\n";
}
else{
$passage_ligne = "\n";
}
$contenu_mail_html .= 'Bonjour '.$final_membres['username'].',<br /> Vous avez souhaité être averti lorsqu\'une annonce répondant à vos critères a été posté sur le forum RESCUE. Veuillez trouver ci dessous la liste des sujets concernés postés ces dernières 24H : <ul>';
$contenu_mail_txt .= 'Bonjour '.$final_membres['username'].','.$passage_ligne.'Vous avez souhaité être averti lorsqu\'une annonce répondant à vos critères a été posté sur le forum RESCUE. Veuillez trouver ci dessous la liste des sujets concernés postés ces dernières 24H :'.$passage_ligne;
while($final_infos = $final_sujets->fetch()){
$contenu_mail_html .= '<li><a href="http://www.rescue-forum.com/showthread.php?t='.$final_infos['threadid'].'">'.$final_infos['title'].'</a></li>';
$contenu_mail_txt .= '- http://www.rescue-forum.com/showthread.php?t='.$final_infos['threadid'].' '.$passage_ligne;
}
$contenu_mail_html .= '</ul>Cordialement,<br />L\'équipe RESCUE';
$contenu_mail_txt .= 'Cordialement,'.$passage_ligne.'L\'équipe RESCUE';
$boundary = "-----=".md5(rand());
$boundary_alt = "-----=".md5(rand());
$sujet = "Notifications d'annonces d'adoption";
$header = "From: \"RESCUE\"<[email protected]>".$passage_ligne;
$header.= "Reply-to: \"RESCUE\" <[email protected]>".$passage_ligne;
$header.= "MIME-Version: 1.0".$passage_ligne;
$header.= "Content-Type: multipart/mixed;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne;
$message = $passage_ligne."--".$boundary.$passage_ligne;
$message.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary_alt\"".$passage_ligne;
$message.= $passage_ligne."--".$boundary_alt.$passage_ligne;
$message.= "Content-Type: text/plain; charset=\"ISO-8859-1\"".$passage_ligne;
$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
$message.= $passage_ligne.$contenu_mail_txt.$passage_ligne;
$message.= $passage_ligne."--".$boundary_alt.$passage_ligne;
$message.= "Content-Type: text/html; charset=\"ISO-8859-1\"".$passage_ligne;
$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
$message.= $passage_ligne.$contenu_mail_html.$passage_ligne;
$message.= $passage_ligne."--".$boundary_alt."--".$passage_ligne;
$message.= $passage_ligne."--".$boundary.$passage_ligne;
echo 'Réussi avec succès';
//Qu'on envoie
mail($final_membres['email'],$sujet,$message,$header);
$final_sujets->closeCursor();
$final_membres->closeCursor();
unset($last_req);
unset($final_sujets);
unset($final_membres);
unset($passage_ligne);
unset($final_infos);
unset($boundary);
unset($sujet);
unset($header);
unset($message);
}
unset($reponse_a);
unset($sujets);
unset($sujets_unique);
unset($sujets_liste);
unset($contenu_mail_html);
unset($contenu_mail_txt);
unset($memberid_unique);
$req->closeCursor();
$sujets->closeCursor();
}
Bonjour,
J'essaye de créer un script de notifications par email (dans le cadre d'un forum, il avertit un nouveau sujet posté), cependant le résultat final est qu'un seul email est envoyé (au lieu de deux attendu pour le test). Le code est assez long la procédure globale est que :
Je récupère les membres qui ont souscrit, puis pour chaque membre qui a souscrit :
-Je sélectionne tous ce à quoi il a souscrit puis pour tout ce à quoi il a souscrit
--Je récupère les sujets qui le concernent
-Je groupe les sujets dans un email que j'envoie
Etant donné qu'à part mon problème tout mon fonctionne, je suppose que l'erreur se situe sur la première boucle, qui pour chaque membre est censé envoyer un email : Cette boucle :
[php]foreach ($memberid_liste as $memberid_unique)[/php]
qui parcoure un array qui ressort ainsi au print_r :
[php]Array ( [0] => 69571 [1] => 67159 )[/php]
Donc seul le premier membre recoit l'email. A la fin de cette boucle j'ai un message de validation pour chaque email envoyé, je devrais donc en avoir deux mais là encore je n'en ai qu'un.
Je ne comprend vraiment pas pourquoi cette boucle ne s’exécute qu'une fois.
Je vous met également le code complet, qui malheureusement est un peu long et sans doute pas opti.
[php]$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=tests', 'root', 'XXX', $pdo_options);
//On récupère les id des membres qui ont souscrit à quelque chose, et on les array_unique car un membre ne doit recevoir qu'un email même s'il a soucrit à plus d'une chose
$reponse = $bdd->query('SELECT memberid FROM vb_notif_adoptions');
while ($donnees = $reponse->fetch()){
$categories[] = $donnees['memberid'];
}
$memberid_liste = array_unique($categories);
//Pour chaque membre ayant souscrit....
foreach ($memberid_liste as $memberid_unique){
$contenu_mail_html = '';
$contenu_mail_txt = '';
//On sélectionne ce à quoi il a souscrit
$req = $bdd->prepare('SELECT * FROM vb_notif_adoptions WHERE memberid = :memberid');
$req->execute(array('memberid' => $memberid_unique));
//Puis pour chaque souscription on construit la requête en fonction des options de sa soucription, qui ira chercher les sujets qui l'intéresse
while ($reponse_a = $req->fetch()){
$req_thread = '';
if($reponse_a['a2'] != 0){
$req_thread .= 'AND (';
$traitement_a2 = explode(",", $reponse_a['a2']);
foreach( $traitement_a2 as $key => $value ){
if($value != ''){
$req_thread .= ' a2 = '.$value.' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
if($reponse_a['a3'] != 0 AND $reponse_a['a3'] != '1,2,3,'){
$req_thread .= 'AND (';
$traitement_a3 = explode(",", $reponse_a['a3']);
foreach( $traitement_a3 as $key => $value ){
if($value != ''){
$req_thread .= ' a3 = '.$value.' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
if($reponse_a['a4'] != 0 AND $reponse_a['a4'] != '1,2,'){
$req_thread .= 'AND (';
$traitement_a4 = explode(",", $reponse_a['a4']);
foreach( $traitement_a4 as $key => $value ){
if($value != ''){
$req_thread .= ' a4 = '.$value.' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
if($reponse_a['a9'] == 1){
$req_thread .= ' AND a9 = 1';
}
if($reponse_a['a10'] == 1){
$req_thread .= ' AND a10 = 1';
}
if($reponse_a['a11'] == 1){
$req_thread .= ' AND a11 = 1';
}
if($reponse_a['a12'] == 1){
$req_thread .= ' AND a12 = 1';
}
if($reponse_a['a13'] != 0){
$req_thread .= ' AND (';
$traitement_a13 = explode(",", $reponse_a['a13']);
foreach( $traitement_a13 as $key => $value ){
if($value != ''){
$req_thread .= ' a13 = '.$value.' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
if($reponse_a['a14'] != 0 AND $reponse_a['a14'] != '1,2,3,4,5,6,7,'){
$req_thread .= 'AND (';
$traitement_a14 = explode(",", $reponse_a['a14']);
foreach( $traitement_a14 as $key => $value ){
if($value != ''){
$req_thread .= ' a14 = '.$value.' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
if($reponse_a['a17'] != 0 AND $reponse_a['a17'] != '1,2,3,'){
$req_thread .= 'AND (';
$traitement_a17 = explode(",", $reponse_a['a17']);
foreach( $traitement_a17 as $key => $value ){
if($value != ''){
$req_thread .= ' a17 = '.$value.' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
if($reponse_a['a21'] == 1){
$req_thread .= ' AND a21 = 1';
}
if($reponse_a['a22'] == 1){
$req_thread .= ' AND a22 = 1';
}
if($reponse_a['a23'] == 1){
$req_thread .= ' AND a23 = 1';
}
if($reponse_a['a24'] == 1){
$req_thread .= ' AND a24 = 1';
}
if($reponse_a['a25'] == 1){
$req_thread .= ' AND a25 = 1';
}
if($reponse_a['a30'] != 0 AND $reponse_a['a30'] !='0_11,12_35,36_83,84_119,120_1200'){
$req_thread .= ' AND (';
$traitement_a30 = explode(",", $reponse_a['a30']);
foreach( $traitement_a30 as $key => $value ){
if($value != ''){
$a30_clean = explode("_", $value);
$date_a30_debut = date("Y-m-d", mktime(0,0,0,date("m")-$a30_clean[1],01,date("Y")));
$date_a30_fin = date("Y-m-d", mktime(0,0,0,date("m")-$a30_fin[0],01,date("Y")));
$req_thread .= ' a30 BETWEEN \''.$date_a30_debut.'\' AND \''.$date_a30_fin.'\' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
if($reponse_a['a31'] == 1){
$date_a31 = date("Y-m-d", mktime(0,0,0,date("m"),date("d"),date("Y")-5));
$req_thread .= ' AND a31 <= \''.$date_a31.'\'';
}
if($reponse_a['a32'] != 0 AND $reponse_a['a32'] != '1,3,7,14,3600,'){
$req_thread .= ' AND (';
$traitement_a32 = explode(",", $reponse_a['a32']);
foreach( $traitement_a17 as $key => $value ){
if($value != ''){
$date_a32 = date("Y-m-d", mktime(0,0,0,date("m"),date("d")-$value,date("Y")));
$req_thread .= ' a32 <= \''.$date_a32.'\' OR';
}
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread .= ')';
}
$req_thread = preg_replace('# OR$#', '', $req_thread);
$req_thread = preg_replace('#^AND#', '', $req_thread);
//On a finis la requête, et on sélectionne les sujets voulus...
$sujets = $bdd->query('SELECT threadid FROM vb_thread WHERE dateline >= (UNIX_TIMESTAMP() - (24*3600)) AND '.$req_thread);
//...Qu'on ajoute à un array
while($sujets_unique = $sujets->fetch()){
$sujets_liste[] = $sujets_unique['threadid'];
}
unset ($req_thread);
}
$last_req = '';
$sujets_liste = array_unique($sujets_liste);
//On construit la requete qui ira définitivement chercher les sujets qui l'intéressent
foreach( $sujets_liste as $key => $value ){
$last_req .= ' threadid = '.$value.' OR';
}
//Le mail n'est pas envoyé s'il n'y a pas de sujets contenus
if(isset($last_req) AND $last_req != ''){
$last_req = preg_replace('# OR$#', '', $last_req);
//On récupère tous les sujets qui seront contenus dans le mail
$final_sujets = $bdd->query('SELECT threadid, title FROM vb_thread WHERE '.$last_req);
//On récupère les infos du membre
$final_membres = $bdd->prepare('SELECT userid, username, email FROM vb_user WHERE userid = :memberid');
$final_membres->execute(array('memberid' => $memberid_unique));
$final_membres = $final_membres->fetch();
//On construit le mail
if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $final_membres['email'])){
$passage_ligne = "\r\n";
}
else{
$passage_ligne = "\n";
}
$contenu_mail_html .= 'Bonjour '.$final_membres['username'].',<br /> Vous avez souhaité être averti lorsqu\'une annonce répondant à vos critères a été posté sur le forum RESCUE. Veuillez trouver ci dessous la liste des sujets concernés postés ces dernières 24H : <ul>';
$contenu_mail_txt .= 'Bonjour '.$final_membres['username'].','.$passage_ligne.'Vous avez souhaité être averti lorsqu\'une annonce répondant à vos critères a été posté sur le forum RESCUE. Veuillez trouver ci dessous la liste des sujets concernés postés ces dernières 24H :'.$passage_ligne;
while($final_infos = $final_sujets->fetch()){
$contenu_mail_html .= '<li><a href="http://www.rescue-forum.com/showthread.php?t='.$final_infos['threadid'].'">'.$final_infos['title'].'</a></li>';
$contenu_mail_txt .= '- http://www.rescue-forum.com/showthread.php?t='.$final_infos['threadid'].' '.$passage_ligne;
}
$contenu_mail_html .= '</ul>Cordialement,<br />L\'équipe RESCUE';
$contenu_mail_txt .= 'Cordialement,'.$passage_ligne.'L\'équipe RESCUE';
$boundary = "-----=".md5(rand());
$boundary_alt = "-----=".md5(rand());
$sujet = "Notifications d'annonces d'adoption";
$header = "From: \"RESCUE\"<
[email protected]>".$passage_ligne;
$header.= "Reply-to: \"RESCUE\" <
[email protected]>".$passage_ligne;
$header.= "MIME-Version: 1.0".$passage_ligne;
$header.= "Content-Type: multipart/mixed;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne;
$message = $passage_ligne."--".$boundary.$passage_ligne;
$message.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary_alt\"".$passage_ligne;
$message.= $passage_ligne."--".$boundary_alt.$passage_ligne;
$message.= "Content-Type: text/plain; charset=\"ISO-8859-1\"".$passage_ligne;
$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
$message.= $passage_ligne.$contenu_mail_txt.$passage_ligne;
$message.= $passage_ligne."--".$boundary_alt.$passage_ligne;
$message.= "Content-Type: text/html; charset=\"ISO-8859-1\"".$passage_ligne;
$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
$message.= $passage_ligne.$contenu_mail_html.$passage_ligne;
$message.= $passage_ligne."--".$boundary_alt."--".$passage_ligne;
$message.= $passage_ligne."--".$boundary.$passage_ligne;
echo 'Réussi avec succès';
//Qu'on envoie
mail($final_membres['email'],$sujet,$message,$header);
$final_sujets->closeCursor();
$final_membres->closeCursor();
unset($last_req);
unset($final_sujets);
unset($final_membres);
unset($passage_ligne);
unset($final_infos);
unset($boundary);
unset($sujet);
unset($header);
unset($message);
}
unset($reponse_a);
unset($sujets);
unset($sujets_unique);
unset($sujets_liste);
unset($contenu_mail_html);
unset($contenu_mail_txt);
unset($memberid_unique);
$req->closeCursor();
$sujets->closeCursor();
}[/php]