Page 1 sur 1

ob_start() & ob_get_clean() dans une boucle fonctionne q

Posté : 09 mai 2008, 14:19
par inetys
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 ;-)

Posté : 09 mai 2008, 14:45
par Hywan
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;
:)

Posté : 09 mai 2008, 15:16
par inetys
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 ?

Posté : 09 mai 2008, 15:32
par animithra
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.

Posté : 09 mai 2008, 15:51
par inetys
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 ;-)

Posté : 09 mai 2008, 15:54
par Hywan
Est-ce qu'on pourrait voir exactement le code concerné ?
Merci :).

Posté : 09 mai 2008, 16:21
par steph29
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...)

Posté : 09 mai 2008, 16:34
par inetys
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, @++ !

Posté : 09 mai 2008, 23:37
par Hywan
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) ...

Posté : 10 mai 2008, 08:22
par nicolas
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.

Posté : 13 mai 2008, 10:00
par steph29
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 ;)