8791 sujets

Développement web côté serveur, CMS

Bonjour à toutes et tous Smiley cligne

Je suis en train de développer un code permettant d'envoyer un mail informant les lecteurs de mon blog ( qui ont laissé leurs adresses mail ) qu'un nouvel article a été posté.

Je bute certainement sur une chose vraiment bête, mais je n'arrive pas à trouver, je vous explique.

Je vous propose le code suivant :

$reponse = $bdd->query('SELECT COUNT(id) as nb, adresse_mail FROM mail_newsletter');
	
	 while ($donnees = $reponse->fetch())
	 {
	 $i = $donnees['nb'];
	 for ($nombre_adresses_mail = 0; $nombre_adresses_mail < $i; $nombre_adresses_mail++)
	 {
     $adresse[$nombre_adresses_mail] = $donnees['adresse_mail'] ;
	 echo $donnees['adresse_mail'];
	 }
	 }
	 echo "<p>Les données ont bien été enregistrées dans la base de données </p>";
	 $reponse->closeCursor(); // Termine le traitement de la requête
	 $adresses_mail_avec_separation = implode(", ", $adresse);
	 echo $adresses_mail_avec_separation;
	 echo $i;
	}


Ce qui donne le résultat suivant :

a écrit :
sdsd@gmail.comsdsd@gmail.comsdsd@gmail.com

Les données ont bien été enregistrées dans la base de données
sdsd@gmail.com, sdsd@gmail.com, sdsd@gmail.com3


J'ai fais exprès de mettre des echos un peu partout afin de mieux cibler le problème.

Pour information, il y a 3 adresses mail différentes dans ma table newsletter, celle de gmail est la dernière de la liste et c'est seulement elle qui est sélectionnée.

Savez-vous pourquoi ? Car là je sèche...

Merci d'avance Smiley lol

Marc
Bonjour,

le problème se situe dans ta boucle while car à chaque itération tu ne reçois qu'une seule adresse ( un record de ta base de donnée via le ->fetch() ).

Actuellement, ton code remplit le tableau successivement avec chacune des adresses et finit toujours par remplir avec la dernière adresse transmise car à chaque itération du while il remplace le tableau avec la dernière valeur de $donnees['adresse_mail'] soumise.

Pour que tu puisses le voir de toi-même ajoute un var_dump de $adresse à la fin du while Smiley smile .

Je te conseille de simplifier ta boucle for comme ceci:

$adresse = array();
while ($donnees = $reponse->fetch())
	 {
	 array_push( $adresse , $donnees['adresse_mail'] );
	 echo $donnees['adresse_mail'];// uniquement si tu veux vérifier 
	 }


De cette manière ça ajoute au tableau l'adresse, tout en réduisant d'une boucle et de quelques lignes ton code.
Smiley biggrin
Salut, merci infiniment pour ta réponse Smiley cligne

Cool pour le code simplifié, je vais l'utiliser et l'étudier afin de bien le comprendre particulièrement la partie array puch.

Néanmoins, afin de bien comprendre la raison pour laquelle l'ancien code ne fonctionnait pas, j'ai encore une petite question à te poser.

Si je comprends bien ton explication, le code écrase au fur et à mesure les adresses mail dans le tableau, ce qui explique pourquoi c'est toujours la dernière adresse qui est enregistrée.

Mais normalement, j'incrémente à chaque fois la variable $nombre_adresses_mail pour mettre une nouvelle entrée dans le tableau, il ne devrait donc pas écraser la précédente adresse enregistrée non ?

Je vais encore étudier la chose, mais merci en tout cas d'avoir pris le temps de me répondre Smiley lol
En faite, si tu veux ta boucle while ($donnees = $reponse->fetch()) retourne à chaque itération un tableau $donnees comme ça :
Array(
 'nb'=>3,
 'adresse_mail'=>'xxx@yyy.fr'
)


ensuite ton for tournait sur ce tableau et renvoyait ceci dans ton tableau $adresse
Array(
 0=> 'adresse_mail'=>'xxx@yyy.fr'
 1=> 'adresse_mail'=>'xxx@yyy.fr'
 2=> 'adresse_mail'=>'xxx@yyy.fr'
)


Donc à chaque itération du while, ton tableau $adresse était écrasé avec la nouvelle adresse fournie. Smiley smile

J'espère avoir pu t'être utile.
Modifié par idsquare (24 Jun 2012 - 18:02)
Salut salut Smiley cligne

Je te remercie pour cette explication complémentaire, je vais tester tout ça très certainement ce soir.

Je te tiens au jus Smiley lol

Merci encore en tout cas !!

a écrit :
J'espère avoir pu t'être utile.


Absolument !!
Bonsoir à toutes et tous Smiley cligne

Alors j'ai fais les essais et cela ne fonctionne pas...

En fait, il fallait rajouter $adresse = array(); au début.

$reponse = $bdd->query('SELECT adresse_mail FROM mail_newsletter');
	
	 $adresse = array();
	 while ($donnees = $reponse->fetch())
	 {
	 array_push( $adresse, $donnees['adresse_mail'] );
	 }
	 $reponse->closeCursor(); // Termine le traitement de la requête
	 $adresses_mail_avec_separation = implode(", ", $adresse);


Merci encore pour ton aide Smiley cligne

Ciao ciao Marc...