ob_start() & ob_get_clean() dans une boucle fonctionne qu'une fois...

Petit nouveau ! | 9 Messages

09 mai 2008, 14:19

Salut,

Je gère une petite newsletter et je rencontre quelques problèmes avec ob_start(). Je m'explique :

Je stocke tout d'abord mes mes adresses emails dans le tableau $tab_emails. Je parcours ensuite mon tableau avec un foreach(), et c'est dans cette boucle que je récupère le contenu de mon mail à envoyer (qui se trouve dans un fichier externe), et que je l'envoie à chaque destinataire avec ma classe PHPMailer...

Le problème que je rencontre, est lors de la phase de récupération du mail. J'ai créé la fonction suivante qui me récupère ce contenu : getMail().
function getMail($var1, $var2, $var3[, $var4, $var5, ...]) {
    ob_start();
    require_once('monMailAEnvoyer.php');
    return ob_get_clean();
}

// puis :

$monMailHTML = getMail('param1', 'param2', 'param3');

Mon fichier "monMailAEnvoyer.php" contient certaines variables PHP, qui sont remplacées par les valeurs passées en paramètre de ma fonction getMail(). Cela me permet notamment de gérer un traceur.

Bref, lors de la première itération de ma boucle foreach, le contenu du mail est correctement récupéré avec getMail()... Mais lors des itérations suivantes, le contenu est vide. En gros, seule la première adresse email du tableau $tab_emails reçoit le mail normalement. Tous les autres reçoivent un mail vide. Je pense que cela vient de ma fonction getMail, peut-être plus précisément de "ob_get_clean()" que j'emploie sûrement à tort ? j'ai essayé plein d'autres choses mais sans résultat.

Que dois-je faire pour que chacun reçoive correctement le mail ? ob_get_clean() ne peut pas fonctionner dans une boucle ?

merci d'avance pour vos réponses ;-)

ViPHP
ViPHP | 4674 Messages

09 mai 2008, 14:45

Hey :),

En fait, tu ne fermes jamais le tampon, tu ne l'éteins pas. Fait plutôt :
ob_start();
require_once 'monMailAEnvoyer';
$out = ob_get_contents();
ob_end_clean();
return $out;
:)
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 9 Messages

09 mai 2008, 15:16

Hey :),

En fait, tu ne fermes jamais le tampon, tu ne l'éteins pas. Fait plutôt :
ob_start();
require_once 'monMailAEnvoyer';
$out = ob_get_contents();
ob_end_clean();
return $out;
:)
Merci pour ta réponse !

Ben en fait ta solution ne fonctionne pas non plus... En fait j'obtiens le même résultat qu'avant (ma fonction retourne bien le code HTML de "monMailAEnvoyer.php", mais seulement à la première itération)... Après j'ai un beau blanc tristement vide :-(

Bizarre non ?

Eléphant du PHP | 174 Messages

09 mai 2008, 15:32

Bonjour.

Attention ceci est une indication et en rien une certitude :

est-ce que l'instruction return ne conduit pas à la sortie de la boucle ?

la vérification est simple, il suffit de lettre une variable que tu auto-incrémente et tu testes sa valeur finale.
"Il vaut mieux avoir du luxe dans ses sentiments que sur ses habits, je ne crains, moi, le mépris de personne" Honoré De Balzac.
"On s'étonne trop de ce que l'on voit rarement et trop peu de ce que l'on voit chaque jour" Mme de Genlis
"L'absence diminue les médiocres passions et augmente les grandes comme le vent éteint les bougies et allume le feu" La RocheFoucauld
"People have hope because they can't see Death standing behind them" (anonymous)
"Of all the things I've lost, I miss my brain the most" (from a fanfic)

Petit nouveau ! | 9 Messages

09 mai 2008, 15:51

Bonjour.

Attention ceci est une indication et en rien une certitude :

est-ce que l'instruction return ne conduit pas à la sortie de la boucle ?

la vérification est simple, il suffit de lettre une variable que tu auto-incrémente et tu testes sa valeur finale.
Et non, cela ne mène pas à la sortie de la boucle foreach(), car je recois bien mes mails à chaque itération, donc ce n'est pas ça ;-)

ViPHP
ViPHP | 4674 Messages

09 mai 2008, 15:54

Est-ce qu'on pourrait voir exactement le code concerné ?
Merci :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 175 Messages

09 mai 2008, 16:21

tu utilise require_once ....

alors que ca doit etre juste un include standard... (il faut inclure le fichier a chaque fois pas seulement au premier passage...)

Petit nouveau ! | 9 Messages

09 mai 2008, 16:34

tu utilise require_once ....

alors que ca doit etre juste un include standard... (il faut inclure le fichier a chaque fois pas seulement au premier passage...)
Hé oui exact, j'ai eu la même réponse sur un autre forum, et c'était exactement cela mon problème ! ;-)
j'ai donc remplacé "require_once" par "require", et ça fonctionne mieux !

Merci, @++ !

ViPHP
ViPHP | 4674 Messages

09 mai 2008, 23:37

Enfin ... bravo steph hein, mais c'est con ton problème. Si ta fonction te retourne toujours le même résultat, ne serait-il pas plus intelligent de le stocker quelque part (dans une variable par exemple ?) ?Moi je dis ça, c'est juste pour améliorer les performances hein. Déjà que les performances des méthodes *_once ne sont pas bien belles, mais si en plus tu l'exécutes en boucle (pour rien) ...
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 353 Messages

10 mai 2008, 08:22

Enfin ... bravo steph hein, mais c'est con ton problème. Si ta fonction te retourne toujours le même résultat, ne serait-il pas plus intelligent de le stocker quelque part (dans une variable par exemple ?) ?Moi je dis ça, c'est juste pour améliorer les performances hein. Déjà que les performances des méthodes *_once ne sont pas bien belles, mais si en plus tu l'exécutes en boucle (pour rien) ...
C'est ce qu'on a essayé de lui faire comprendre, en vain.

Eléphant du PHP | 175 Messages

13 mai 2008, 10:00

ca c'est sur mais ne sachant pas comment est structurer le 'monMailAEnvoyer.php' avec plein de variable dedans :roll:

on debug et apres on optimise mais la il faut une volonte du cote du posteur ;)