[RESOLU] Enlever la première virgule d'une chaine de caractére (Edit)

Eléphant du PHP | 418 Messages

10 oct. 2012, 07:50

Salutations

Voici mon problème

Je récupère une liste d'email à partir d'une base de donnée.
Le hic c'est que pour l'utiliser comme je souhaite, il faut que je sépare chaque email par une virgule.
$email = ',';
$email .= stripslashes(trim($data['users_mail'])); 
Ceci donne une chaine du style: ,premier_email,deuxième_email,....

J'aimerais afficher une chaine du style premier_email,deuxième_email,....

Merci de votre aide

Cordialement
Modifié en dernier par Fre3z69 le 10 oct. 2012, 15:47, modifié 1 fois.

ViPHP
ViPHP | 2577 Messages

10 oct. 2012, 08:28

Fonction substr($chaine,1)
(j'ai toujours un doute si ca commence à 0 ou 1, donc 1 ou 2 pour enlever le premier caractère)

Par contre tu peux passer par un array et faire un implode avec , comme séparateur.

Eléphant du PHP | 418 Messages

10 oct. 2012, 08:45

j'ai déjà un while () qui me liste les email, je vois pas comment faire un foreach dans une boucle ^^

Si tu as une idée, voici mon script
	$selected_rank = $_POST['selected_rank'];
	$selected_rank = ($selected_rank!=0)?$selected_rank:'';
	$condition_rank = ($selected_rank!=0)?'AND t_users.rank_id = :rank':'';
	$req = 'SELECT
	 t_users.users_mail
	FROM t_users
    LEFT JOIN t_rank ON t_rank.rank_id = t_users.rank_id
    LEFT JOIN t_online ON online_id = users_id
	WHERE users_verif = :users_verif AND t_users.rank_id != :users_verif '.$condition_rank.'
	ORDER BY users_id ASC';
	$query = $cnx->prepare($req);
	$query->bindValue(':users_verif', 1,PDO::PARAM_BOOL);
	if ($selected_rank!=0) { $query->bindValue(':rank', $selected_rank,PDO::PARAM_INT); }
	$query->execute();
	
	while($data = $query->fetch(PDO::FETCH_OBJ))
	{
		// on rajoute des , entre les emails
		$email = ',';
		$email .= trim($data->users_mail);
		// $listmail = substr($email, 1);
		echo $email;
	}
J'avoue que je vois pas trop comment faire ^^

Merci beacoup

cordialement

ViPHP
ViPHP | 2577 Messages

10 oct. 2012, 09:13

Voilà les 2 possibilités que je peux proposer :
<?PHP
      $email = '';   // toujours initialiser les variables
       while($data = $query->fetch(PDO::FETCH_OBJ))
        {
                // on rajoute des , entre les emails
                $email .= ',';    // il manquait un point : .= ? sinon ca efface les mails précédents
                $email .= trim($data->users_mail);
                echo $email;
        }
       $email = substr($email, 1); // suppression de la première ,
?>
<?PHP
       $tab = array();
       while($data = $query->fetch(PDO::FETCH_OBJ))
        {
                $tab[] = trim($data->users_mail);
        }
       $email = implode(',',$tab);
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 oct. 2012, 09:16

perso je pencherais plus pour le fetchAll de PDO ? :)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 418 Messages

10 oct. 2012, 09:31

Salut, j'ai récupérer ta deuxième solution
       while($data = $query->fetch(PDO::FETCH_OBJ))
        {
                $tab[] = trim($data->users_mail);
        }
       $email = implode(',',$tab);
ça fonctionne super.

Peux tu expliquez pk tu utiliserais fetchAll?

Merci à vous

Cordialement
Modifié en dernier par Fre3z69 le 10 oct. 2012, 12:29, modifié 1 fois.

Eléphanteau du PHP | 35 Messages

10 oct. 2012, 09:33

Hello,

le plus simple pour supprimer le premier / dernier caractère d'une chaîne ce sont les fonctions ltrim (pour left) et rtrim (pour right)
Tu peux préciser en paramètre le caractère à supprimer.

http://fr2.php.net/manual/fr/function.ltrim.php
http://fr2.php.net/manual/fr/function.rtrim.php
// tu précise que tu veux supprimer ta virgule
$email = lrim($data->users_mail, ',');
La paresse est mère du génie.

Mammouth du PHP | 2278 Messages

10 oct. 2012, 10:38

Chalut,
Il serait quand même plus simple de constituer correctement la liste.
Lorsque tu récupères tes emails, la fonction mysql rend un tableau
aux erreurs e syntaxe près:
$data =  $query->fetch(PDO::FETCH_OBJ);
$email =  trim($data->users_mail);
while($data = $query->fetch(PDO::FETCH_OBJ))
       {
                // on rajoute des , entre les emails
                $email = ',';
                $email .= trim($data->users_mail);
                // $listmail = substr($email, 1);
                echo $email;
        }
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
ViPHP | 2577 Messages

10 oct. 2012, 11:17

Personnellement, c'est la solution du implode que je préfère.

Dans ce cas, ce n'est pas flagrant, mais dans le cas de la constitution d'une clause where à partir de plusieurs critères, on y gagne beaucoup puis que l'on crée un tableau de condition que l'on "implode" avec ' AND ' sans se poser de question autre que d'avoir un tableau non vide.

Mammouth du PHP | 2278 Messages

10 oct. 2012, 11:36

Juste, mazarini et ça donne le même résultat que moi de façon plus simple.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 418 Messages

10 oct. 2012, 12:38

Oui c'est plus simple avec l'implode, du fait qu'on peux sortir de la boucle, et que de ce fait avec phpmailer, on simplifie l'envoie de l'email de masse ^^

Merci à tous, merci pour votre aide

Ce sujet est donc résolut

Encore merci à tous

Cordialement

Eléphant du PHP | 418 Messages

10 oct. 2012, 15:31

J'ai un soucis, c'est lié à ce sujet, d’où le fait que j'en poste pas un autre

Voici que lorsque j'ai plusieurs emails, ça m'affiche un message me disant qu'il faut que je renseigne un email, alors qu'avec un seul mail, ça fonctionne.
Mailer Error: You must provide at least one recipient email address.
Voici le code utilisé pour l'envoi de l'email
<h3>Envoie d'emails de groupe</h3>
<div id="sous_content">
<?php
/*************/
if (isset($_POST['envoyer']))
{
	//parsing des variables
	$message = $_POST['message'];
	$message = nl2br($message);
	$selected_rank = $_POST['selected_rank'];
	$selected_rank = ($selected_rank!=0)?$selected_rank:'';
	$condition_rank = ($selected_rank!=0)?'AND t_users.rank_id = :rank':'';
	$req = 'SELECT
	 t_users.users_mail
	FROM t_users
    LEFT JOIN t_rank ON t_rank.rank_id = t_users.rank_id
    LEFT JOIN t_online ON online_id = users_id
	WHERE users_verif = :users_verif AND t_users.rank_id != :users_verif '.$condition_rank.'
	ORDER BY users_id ASC';
	$query = $cnx->prepare($req);
	$query->bindValue(':users_verif', 1,PDO::PARAM_BOOL);
	if ($selected_rank!=0) { $query->bindValue(':rank', $selected_rank,PDO::PARAM_INT); }
	$query->execute();
	
$body = "<html><body>
	$message
	<br /><br />
	Cordialement, l'administrateur de ".SITE_NAME.".
	<br /><br />
</body></html>";
$plain = 'contactez <a href="mailto:'.SITE_MAIL.'">'.SITE_MAIL.'</a> si vous voyez ce message'; // optional, comment out and test

#initiate PHPMailer class
$mail = new PHPMailer();
#set the from e-mail address
$mail->From = SITE_MAIL;
#set the from name
$mail->FromName = SITE_NAME;
#set the e-mail type to HTML
$mail->IsHTML(true);
#the subject of the email
$mail->Subject = "Couriel de ".SITE_NAME;
#the HTML content of the email
$mail->Body = $body;
#the plain text version
$mail->AltBody = $plain;
#add subscribers address as the recipient
		$tab = array();
		while($data = $query->fetch(PDO::FETCH_OBJ))
		{
			$tab[] = trim($data->users_mail);
		}
	$email = implode(',',$tab);
	#add subscribers address as the recipient
	$mail->AddAddress($email);
	#sends the newsletter
	$mail->Send();
	#clears the recipient address
	$mail->ClearAddresses();
	if(!$mail->Send()) {
		echo "Mailer Error: " . $mail->ErrorInfo;
	}
	else {
		echo 'email envoyé';
	}
	echo '<br /> '.$email;
}

/*************/
	$query = $cnx->prepare('SELECT
	 t_rank.rank_id,
	 t_rank.rank_libelle
	FROM t_rank
	WHERE t_rank.rank_id != :rank1 AND t_rank.rank_id != :rank2
	ORDER BY rank_id ASC');
	$query->bindValue(':rank1', 1,PDO::PARAM_INT);
	$query->bindValue(':rank2', 2,PDO::PARAM_INT);
	$query->execute();    
	//Si la requ&ecirc;te retourne un truc, le membre existe
?>
	<form action="index.php?r=newsletter" method="POST">
	Membre(s) :
	<br />
	<select name="selected_rank">
		<option value="0">Tous</option>
	<?php
		while($data = $query->fetch())
		{
	?>
		<option value="<?php echo $data['rank_id']; ?>"><?php echo $data['rank_libelle']; ?></option>
	<?php
		}
	?>
		</select>
	<br />
	Votre message :
	<br />
	<textarea class="span11" name="message" id="texte" cols="90" rows="10"></textarea>
	<br />
	<input type="submit" name="envoyer" value="Envoyer l'email" />
	
	</form>
Pouvez vous m'expliquer comment faire pour faire l'envoie de l'emai?

Merci de votre aide

Cordialement