Page 1 sur 1

Envoie d'une newsletter

Posté : 20 déc. 2021, 13:11
par ThomasPph
Bonjour à tous,

Pour commencer mon code est en PDO.
Pour vous expliquez mon probème.. Je suis sur la création d'une newsletter qui s'enverra tous les mois. J'arrive à envoyer les mails avec mes articles.

Cependant lorsque je selectionne 1 article il va s'envoyer au premier destinataire de la bdd 1x au second 2x ainsi de suite.
Si je change de sens les parentheses celui-ci va s'envoyer dans différents mails mais autant de fois..

Ce que je souhaiterais c'est grâce à la selection de mes articles, ceux-ci s'envoie dans le même mail et tout ça qu'une seule fois.

Voici mon code, je vous remercie pour le temps que vous m'accorderai.

Code : Tout sélectionner

[color=#FF40BF][color=#800000]<?php $page = 'communication'; include("header.php"); // Update des articles vers le menu if(isset($_POST['delete'])) { foreach ($_POST['delete'] as $id) { $stmt = $mysqlClient->prepare("UPDATE `articles` SET valide = 3 WHERE idArticle = '".$id."'"); $stmt->bindValue(':id', $id); $stmt->execute(); // Envoie de mail aux différentes adresse $stmt = $mysqlClient->prepare("SELECT email, titre, contenu, auteur, objet FROM articles INNER JOIN profil WHERE idArticle = '".$id."'"); $stmt->bindValue(':id', $id); $stmt->execute(); foreach($stmt as $r){ $tab_email = $r['email']; //prend l'email de la table $message .= "Titre : " . $r['titre']; //prend titre de la table $message .= "\n\nRésumé : " . $r['objet']; //prend l'objet de la table $message .= "\n\n".$r['contenu']; //prend contenu de la table $message .= "\n\nÉcrit par : ".$r['auteur']."\n\n\n\n"; //prend auteur de la table mail($tab_email,"Article du mois",$message,"Merci"); } } } header('Location: newsletter.php'); ?>[/color][/color]

Re: Envoie d'une newsletter

Posté : 20 déc. 2021, 13:20
par or 1
il faut faire une première boucle qui parcoure les articles à envoyer, construire le texte de l'email.
ensuite, faire une seconde boucle qui parcoure les profils et envoie le texte à chaque email.
donc 2 requêtes sql et pas une seule erronée.

Re: Envoie d'une newsletter

Posté : 20 déc. 2021, 13:46
par ThomasPph
J'ai fait ça, ça ne fonctionne pas, suis-je sur la bonne voie ? et si oui je peux faire quoi d'autre pour que ça fonctionne ?
Merci pour ton aide et ta réactivité

Code : Tout sélectionner

<?php $page = 'communication'; include("header.php"); // Update des articles vers le menu if(isset($_POST['delete'])) { foreach ($_POST['delete'] as $id) { $stmt = $mysqlClient->prepare("UPDATE `articles` SET valide = 3 WHERE idArticle = '".$id."'"); $stmt->bindValue(':id', $id); $stmt->execute(); } // Envoie de mail aux différentes adresse $smtp = $mysqlClient->prepare("SELECT titre, contenu, auteur, objet FROM articles WHERE idArticle = '".$id."'"); $smtp->bindValue(':id', $id); $smtp->execute(); foreach($smtp as $r){ $tab_email = $r['email']; //prend l'email de la table $message .= "Titre : " . $r['titre']; //prend titre de la table $message .= "\n\nRésumé : " . $r['objet']; //prend l'objet de la table $message .= "\n\n".$r['contenu']; //prend contenu de la table $message .= "\n\nÉcrit par : ".$r['auteur']."\n\n\n\n"; //prend auteur de la table } } $aaa = $mysqlClient->prepare("SELECT email FROM profil"); $tab_email->bindValue($rrr); $tab_email->execute(); foreach($tab_email as $rrr){ mail($rrr,"Article du mois",$message,); } header('Location: newsletter.php'); ?>

Re: Envoie d'une newsletter

Posté : 20 déc. 2021, 14:00
par or 1
il y a 2 select donc c'est mieux qu'avec un seul.

pour debuger, il faut activer l'affichage des erreurs, voir tutoriels/page-blanche-script-php-comme ... 73178.html

Re: Envoie d'une newsletter

Posté : 20 déc. 2021, 18:19
par ThomasPph
J'ai cherché toute l'aprem une solution j'ai mutiplié les essaie, ce que j'ai fait c'est décomposer mon code pour savoir ce que j'arrivais à faire ou non.

Dans un premier temps l'envoie des articles a une seul adresse

Code : Tout sélectionner

<?php $page = 'communication'; include("header.php"); // Update des articles vers le menu if(isset($_POST['delete'])) { foreach ($_POST['delete'] as $id) { $stmt = $mysqlClient->prepare("UPDATE `articles` SET valide = 3 WHERE idArticle = '".$id."'"); $stmt->bindValue(':id', $id); $stmt->execute(); $stmt = $mysqlClient->prepare("SELECT titre, contenu, auteur, objet FROM articles WHERE idArticle = '".$id."'"); $stmt->bindValue(':id', $id); $stmt->execute(); foreach($stmt as $r){ $message .= "Titre : " . $r['titre']; //prend titre de la table $message .= "\n\nRésumé : " . $r['objet']; //prend l'objet de la table $message .= "\n\n".$r['contenu']; //prend contenu de la table $message .= "\n\nÉcrit par : ".$r['auteur']."\n\n\n\n"; //prend auteur de la table } } mail("monEmail","Article du mois",$message,"Merci"); } ?>
Cette fonctionnalité est bonne.

Dans un second temps un envoie de mail bidon a mes adresses mail..
C'est ici que provient mon problème.

Si je met ça :

Code : Tout sélectionner

<?php $page = 'communication'; include("header.php"); // Update des articles vers le menu if(isset($_POST['delete'])) { foreach ($_POST['delete'] as $id) { $stmt = $mysqlClient->prepare("UPDATE `articles` SET valide = 3 WHERE idArticle = '".$id."'"); $stmt->bindValue(':id', $id); $stmt->execute(); // Envoie de mail aux différentes adresse $smtp = $mysqlClient->prepare("SELECT email FROM profil"); $smtp->execute(); foreach($smtp as $a){ $tab_email = $a['email']; //prend l'email de la table } } mail($tab_email,"Article du mois","Bonjour"); } ?>
Je ne reçoit un mail avec le message qu'a une seul de mes adresse mail présente dans la bdd, pour recevoir le mail pour tout le monde il sufi que je mette la ligne mail dans la boucle mais je sais pas si c'est ce qu'il faut que je fasse.

Et ensuite d'essayer de relier les deux bout de code en un.

Si vous avez des idées de comment je peux procéder je vous remercie pour vos réponses.

Re: Envoie d'une newsletter

Posté : 20 déc. 2021, 18:29
par or 1
2 possibilités :
- envoyer un seul email à plusieurs destinataires, donc dans la boucle, mettre les emails dans un tableau et envoyer l'email (plus facile avec post469857.htm )
- envoyer le message à chaque email, donc dans la boucle et pas après.

dans le dernier code, si $_POST['delete'] contient plusieurs id, l'envoi des emails va se faire plusieurs fois, donc il faut revoir le code pour ne pas mélanger des choses qui n'ont rien à voir.

Re: Envoie d'une newsletter

Posté : 21 déc. 2021, 10:06
par ThomasPph
Donc voilà il faut bien que je le mette dans la boucle, mais l'association des codes fait que les messages s'envoient plusieur fois ou bien les articles sont multiplié dans le mail par le nombre d'adresse mail.

Re: Envoie d'une newsletter

Posté : 21 déc. 2021, 10:16
par ThomasPph
Dans ma page précédente j'ai des articles afficher, avec a coté d'eux une checkbox.

Donc le delete reprend les checkbox selectionner, il peut y en avoir 1 ou plusieur,

Ce que je souhaite c'est que les articles selectionner soit envoyer par mail a toutes les adresse emails de la bdd.
Dans ce même temps j'ai un update qui change le statut des articles choisi pour qu'il parte vers une autre page.

Re: Envoie d'une newsletter

Posté : 21 déc. 2021, 10:28
par ThomasPph
C'est BONNNNN j'ai réussi haha, j'ai le cerveau broyer mdrrr, voici ma solution si sertaine personne passe sur le tuto :D :D

Code : Tout sélectionner

<?php $page = 'communication'; include("header.php"); // Update des articles vers le menu if(isset($_POST['delete'])) { foreach ($_POST['delete'] as $id) { $stmt = $mysqlClient->prepare("UPDATE `articles` SET valide = 3 WHERE idArticle = '".$id."'"); $stmt->bindValue(':id', $id); $stmt->execute(); $stmt = $mysqlClient->prepare("SELECT titre, contenu, auteur, objet FROM articles WHERE idArticle = '".$id."'"); $stmt->bindValue(':id', $id); $stmt->execute(); foreach($stmt as $r){ $message .= "Titre : " . $r['titre']; //prend titre de la table $message .= "\n\nRésumé : " . $r['objet']; //prend l'objet de la table $message .= "\n\n".$r['contenu']; //prend contenu de la table $message .= "\n\nÉcrit par : ".$r['auteur']."\n\n\n\n"; //prend auteur de la table } } // Envoie de mail aux différentes adresse $smtp = $mysqlClient->prepare("SELECT email FROM profil"); $smtp->execute(); foreach($smtp as $a){ $tab_email = $a['email']; //prend l'email de la table mail($tab_email,"Article du mois",$message); } } ?>