Requête mysql liste mail avec fin de fichier

Résolu/Fermé
OrionM24 Messages postés 6 Date d'inscription lundi 27 septembre 2021 Statut Membre Dernière intervention 13 janvier 2022 - 12 janv. 2022 à 13:43
OrionM24 Messages postés 6 Date d'inscription lundi 27 septembre 2021 Statut Membre Dernière intervention 13 janvier 2022 - 13 janv. 2022 à 16:37
Bonjour,
Débutant d'un certain age, Svp, problème de syntaxe dans mon code php , je ne trouve pas la solution :

J'ai besoin de récupérer la liste des emails de certains membres inscrits pour leur transmettre un email commun, toujours le même, à chacun d'eux.
(C'est un résultat de match de tennis issu d'un formulaire pour un tournoi interne.)
C'est en ligne et tout fonctionne, mais :
Ce processus fonctionne très bien lorsque je transcris moi même manuellement la liste des emails à envoyer, mais le but est bien sûr de tirer cette liste de notre base de données mysql.
C'est uniquement sur ce point que je galère depuis pas mal de temps :

Mon problème :
l'envoi des mail par la liste fonctionne lorque la liste des emails obtenue est sous la forme
email1@fai.fr, // avec une virgule entre chaque résultat obtenu
email1@fai.fr, // avec une virgule entre chaque résultat obtenu
email1@fai.fr, // avec une virgule entre chaque résultat obtenu
email1@fai.fr // et ici en fin de table sans la virgule !

mais avec mon code ci-dessous, la dernière ligne récupérée contient elle aussi une virgule
ce qui empêche l'envoi des mails (j'ai testé) et donc ma question :
Comment supprimer cette virgule après le dernier email récupéré ?
autrement dit en fin de fichier ?
Je n'arrive pas à trouver la bonne syntaxe, mais peut-être existe t-il une meilleure solution ?
---------------------------------------------------------------
Merci de votre aide, voici mon code :

<?php
/ on se connecte à MySQL
$bdd = mysqli_connect ('monserveur', 'mabasededonnees', 'monPass');
mysqli_select_db ($bdd, 'mabasededonnees');
?>


<html>
<head>
<meta charset="utf-8" />
<title>récupérer les emails des membres inscrits au challenge</title>
</head>
<body>
<?php
// on crée la requête SQL
$sql = 'SELECT * FROM `matable` WHERE mail_challenge IN ("oui") ORDER BY `matable`.`nom`ASC';
// on envoie la requête
$req = mysqli_query($bdd, "$sql") or die('Erreur SQL !<br />'.$sql.'<br />'.mysqli_error($bdd));

$retour = "";

/* Boucle pour récupérer les emails de chaque membre dans un tableau : */

while($donnees = mysqli_fetch_assoc($req)) {
if (mysqli_num_rows($sql)){
// si fin de la table, après la récupération du dernier email, entrer un espace à la place d'une virgule :
$retour .= "<tr>";
$retour .= "<th>".$donnees['user_email']."</th>";
$retour .= "</br>";
$retour .= "</tr>";
$retour .= "</br>";

} else {
$retour .= "<tr>";
$retour .= "<th>".$donnees['user_email']."</th>";
$retour .= ","; // après chaque récupération d'email, entrer une virgule pour séparer chaque ligne :
$retour .= "</br>";
$retour .= "</tr>";
}
}

// echo $retour ;
$to = $retour ;
// echo $to ;


$subject = "Info TCSP : Encore un nouveau match de tennis du challenge JLB !";

$message = ''.$nomdeclarant.' vous informe :
Voici un nouveau resultat de match du challenge au '.$datematch.' :

poule '.$poule.' : '.$nomgagnant. ' ' .$prenomgagnant. ' (' .$classtgagnant.') bat : '.$nomperdant.' ' .$prenomperdant.' (' .$classtperdant.') en ' .$nbsets. 'sets ('.$score.')

Merci de controler vos propres resultats sur le tableau des matchs et aussi sur le tableau de classement !

Cliquez sur ce lien pour afficher le tableau des resultats ==> https://monsite.fr/challenge/affiche-matchs.php

Si vous ne souhaitez plus recevoir ces résultats de matchs informez en JpleWebMaster qui vous supprimera de la liste des envois.

Bons matchs ! ';

$headers = "Message emis par le site : https://monsite.fr/ " . $from;

mail($to,$subject,$message,$headers);

echo $from;

echo $to;

echo $subject;

echo $message;

echo $headers;

echo "<center> Ce résultat a été envoyé par mail aux participant(e)s inscrit(e)s au challenge JLB</center>";

// on ferme la connexion à mysql
mysql_close();

?>

</body>
</html>





MERCI pour votre aide



Configuration: Windows / Chrome 97.0.4692.71

A voir également:

4 réponses

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
Modifié le 12 janv. 2022 à 17:41
Bonjour,

Pense à utiliser les balises de code pour rendre ton code plus lisible sur le forum stp :
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Le premier paramètre $to passé à la fonction php mail() attends effectivement une chaine de caractère contenant la liste des adresses séparées par une virgule.
Je ne comprends pas trop pourquoi tu utilises des balises th ou tr (et la balise </br> n'existe pas au passage, c'est soit <br>, soit <br/>), mais ces balises html n'ont rien à faire dans la liste des adresses mail.

Une solution possible :
- modifier la requête sql pour sélectionner uniquement le champ user_email puisque les autres champs ne semblent pas utilisés
- à la place de faire une boucle avec mysqli_num_rows(), utiliser directement mysqli_fetch_all() pour récupérer la liste des adresses sous la forme d'un tableau php
- utiliser la fonction implode pour transformer le tableau php en chaine de caractère en séparant chaque adresse par une virgule
$sql = 'SELECT user_email FROM `matable` WHERE mail_challenge IN ("oui") ORDER BY `matable`.`nom`ASC';
$req = mysqli_query($bdd, $sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysqli_error($bdd)); 
$emails = mysqli_fetch_all($req);
$to = implode(', ', $emails);

// [...] suite du code

mail($to, $subject, $message, $headers); 
0
OrionM24 Messages postés 6 Date d'inscription lundi 27 septembre 2021 Statut Membre Dernière intervention 13 janvier 2022
Modifié le 12 janv. 2022 à 18:49
bonsoir et merci pour ton aide,
oui j'ai compris, en fait j'ai d'autres champs utiles, mais dans l'exemple j'ai raccourci pour la compréhension.
D'accord pour la fonction implode, mais il faut que la dernière adresse récupérée ne comporte pas de virgule, sinon la fonction mail attend une suite et ça ne marche pas.
C'était çà mon problème.
Je vais quand même tester ta solution.
Je reviendrai au besoin.
Bonne soirée
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525 > OrionM24 Messages postés 6 Date d'inscription lundi 27 septembre 2021 Statut Membre Dernière intervention 13 janvier 2022
12 janv. 2022 à 20:14
La fonction implode n'ajoute pas le séparateur (ici la virgule et un espace) après le dernier élément.

Je n'avais pas compris que le code avait été simplifié, du coup je suppose que la variable $retour avec le code html est utilisée autre part ?
Dans tous les cas, la variable $to ne doit pas contenir de code html.

Tu peux sinon, dans ta boucle, concaténer les adresses dans la variable $to en ajoutant la virgule et l'espace.
Puis après la boucle, si la variable $to n'est pas vide, supprimer les deux derniers caractères (la virgule et l'espace) avec la fonction php substr :
// on crée la requête SQL
$sql = 'SELECT * FROM `matable` WHERE mail_challenge IN ("oui") ORDER BY `matable`.`nom`ASC';
// on envoie la requête
$req = mysqli_query($bdd, "$sql") or die('Erreur SQL !<br />'.$sql.'<br />'.mysqli_error($bdd));

$retour = "";
$to = "";

while($donnees = mysqli_fetch_assoc($req)) {
    $retour .= "<tr><td>".$donnees['user_email']."</td></tr>";
    $to .= $donnees['user_email'] . ", ";
}

if (!empty($to)) {
    $to = substr($to, 0, -2);
} else {
    die('Aucun challenger !');
}

// var_dump($to);
// var_dump($retour);

// [...]

mail($to,$subject,$message,$headers); 
0
jordane45 Messages postés 38331 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 5 décembre 2024 4 713
Modifié le 12 janv. 2022 à 21:33
Bonjour,

une petite amélioration du code..

<?php
//Affichage des erreurs php 
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

// on se connecte à MySQL
$bdd = mysqli_connect("monserveur","mabasededonnees","monPass","mabasededonnees");

// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  exit();
}

// on crée la requête SQL
$sql = 'SELECT * FROM `matable` WHERE mail_challenge IN ("oui") ORDER BY `matable`.`nom`ASC';
// on envoie la requête
$req = mysqli_query($bdd, $sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysqli_error($bdd));

$retour = "";
$to = "";
$arrTo = [];


while($donnees = mysqli_fetch_assoc($req)) {
    $retour .= "<tr><td>".$donnees['user_email']."</td></tr>";
    $arrTo[] = $donnees['user_email'];
}


$subject = "Info TCSP : Encore un nouveau match de tennis du challenge JLB !";

$message = $nomdeclarant.' vous informe :
      Voici un nouveau resultat de match du challenge au '.$datematch.' :

      poule '.$poule.' : '.$nomgagnant. ' ' .$prenomgagnant. ' (' .$classtgagnant.') bat : '.$nomperdant.' ' .$prenomperdant.' (' .$classtperdant.') en ' .$nbsets. 'sets ('.$score.')

      Merci de controler vos propres resultats sur le tableau des matchs et aussi sur le tableau de classement !

      Cliquez sur ce lien pour afficher le tableau des resultats ==> https://monsite.fr/challenge/affiche-matchs.php

      Si vous ne souhaitez plus recevoir ces résultats de matchs informez en JpleWebMaster qui vous supprimera de la liste des envois.

      Bons matchs ! ';

 // $headers = "Message emis par le site : https://monsite.fr/ " . $from; // pas valide ...
 $headers = 'From: ' .$from . "\r\n" .
     'Reply-To: ' . $from . "\r\n" .
     'X-Mailer: PHP/' . phpversion();

if (!empty($arrTo)) {
  $to = join(", ",$arrTo);
  mail($to,$subject,$message,$headers); 
} else {
  die('Aucun challenger !');
}
?>

<!Doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>récupérer les emails des membres inscrits au challenge</title>
  </head>
  <body>
    <table>
    <?php
      echo $retour;
    ?>
    </table>
   </body>
</html>


0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
12 janv. 2022 à 21:10
Oui c'est encore mieux et plus clair comme ça ! Merci Jordane ;)
0
OrionM24 Messages postés 6 Date d'inscription lundi 27 septembre 2021 Statut Membre Dernière intervention 13 janvier 2022
13 janv. 2022 à 15:38
Bonjour et merci à tous les deux Pitet et jordane,
j'ai intégré ce dernier code à mon site et je suis en train de vérifier, mais j'ai une erreur HTP error 500
J'ai pourtant mis mes bons paramètres de bdd !
Je cherche ce que j'ai fait de travers et je reviendrai vers vous
Encore MERCI !!!! en attendant
0
OrionM24 Messages postés 6 Date d'inscription lundi 27 septembre 2021 Statut Membre Dernière intervention 13 janvier 2022
13 janv. 2022 à 16:08
C'est réparé, un ; oublié de ma part,
d'autre part il fallait aussi initialiser les variables :
$from = "";
$headers = "";
et maintenant c'est nickel !
Merci les gars pour ce coup de main bien sympathique et surtout terriblement efficace !
J'espère que votre code rectifié servira aussi à la communauté !
Jean-Pierre
https://tennisclubsaintpaulais.fr/?doing_wp_cron=1642086469.7887659072875976562500
0
jordane45 Messages postés 38331 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 5 décembre 2024 4 713
13 janv. 2022 à 16:11
Une erreur 500 c'est souvent une erreur de point-virgule oublié, une parenthèse ou une accolade mal fermée ...ou une variable mal nommée.
Par exemple, peux tu nous montrer ta ligne 52 ?
J'avais mal écrit le nom de la variable puis édité le code ensuite pour le corriger...
0
OrionM24 Messages postés 6 Date d'inscription lundi 27 septembre 2021 Statut Membre Dernière intervention 13 janvier 2022
13 janv. 2022 à 16:37
pas d'inquiétude, c'est déjà tout intégré à notre site officiel et çà fonctionne.
(Malheureusement vous ne pouvez pas tester, il faut être inscrit et connecté pour accéder au menu du challenge.)
C'était en effet un point-virgule oublié de ma part, désolé pour la petite frayeur...
Ah ! et aussi dans la requête j'avais laissé "matable" au lieu du "vrai" nom de la table. (à 73 bougies, je code encore bénévolement pour les besoins de mon club de tennis, mais je commence à avoir quelques petits soucis de mémoire) ... mais bon pour la raquette, çà fonctionne encore !
A bientôt de vous lire et bonne fin de journée.
Encore Merci pour vos précieux conseils.

0