[RESOLU] Afficher une liste de produit dans un mail PHPMailer

Jean Yve
Invité n'ayant pas de compte PHPfrance

24 oct. 2019, 13:34

Bonjour,

Je développe un site de gestion de stock et une des fonctionnalités est l'envoi d'un mail via PHPMailer 6.1.1 lorsque qu'un produit arrive en dessous d'un seuil.
J'arrive bien à récupérer la liste des objets contenu dans ma table en base de données mais dans le mail un seul objet s'affiche (alors que je devrais en avoir deux).
Ce code est ensuite destiné à être dans un Cron afin qu'il s’exécute tous les x Heures.
Voici le code :
<?php
include_once('bdd.php'); //$bdd

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

/* Exception class. */
require 'PHPMailer-master/src/Exception.php';
/* The main PHPMailer class. */
require 'PHPMailer-master/src/PHPMailer.php';
/* SMTP class, needed if you want to use SMTP. */
require 'PHPMailer-master/src/SMTP.php';


$users = $bdd->query('SELECT id, nom, prenom, email, responmat, president FROM protec_membre WHERE responmat = 1 OR president = 1');
$nombreproduit = $bdd->query('SELECT produit, COUNT(produit) AS nbproduit FROM protec_inv WHERE nombre < nombrelimite AND emaillownbr = 0');
$produitliste = $bdd->query('SELECT id, produit, nombre, nombrelimite, emaillownbr FROM protec_inv WHERE nombre < nombrelimite AND emaillownbr = 0');

$nbproduit = $nombreproduit->fetch();
$nombreproduit = $nbproduit['nbproduit'];

if ($nombreproduit >= 1) {

    $mail = new PHPMailer(true);

    try {

        //Server settings

        $mail->isSMTP();

        while ($produit = $produitliste->fetch())
        {
            $listeproduit = $produit['produit'];
            $html = "<li>".$listeproduit."</li><br />";
            var_dump($html);
        }

        while ($util = $users->fetch())
        {
            $mail->addBCC($util['email'], $util['prenom']);
        }

        $mail->CharSet = 'UTF-8';

        $mail->Encoding = 'base64';

        $mail->Host       = '***';

        $mail->SMTPAuth   = true;

        $mail->Username   = '***@***.fr';

        $mail->Password   = '***';

        $mail->SMTPSecure = 'ssl';

        $mail->Port       = 465;


        //Recipients

        $mail->setFrom('***@***.fr', '***');

        $mail->addAddress('***.***@orange.fr');



        $mail->isHTML(true);

        $mail->Subject = 'Alerte Stock Faible';

        $mail->Body    = '

          <html>

             <body>

                <div align="center">

                   <u>Bonjour</u><br />

                   <u>Les produits suivant seront bientôt hors stock : </u><br />

                   '.$html.'

                </div>

             </body>

          </html>

        ';

        var_dump($html);

        $mail->send();

        $mail->clearAddresses();
        $mail->clearBCCs();
        echo "Mail envoyé";

    } catch (Exception $e) {

        echo "Mail non envoyé. Erreur: {$mail->ErrorInfo}";

    }

}

?>
Sur ma page php j'ai ces retours suites aux var_dump du code ci-dessus :
https://imgur.com/a/OFKbanX

Et mon mail ressemble à ceci :
https://imgur.com/a/FgzdRd7

Je n'arrive pas à comprendre pourquoi dans mon premier var_dump je récupère les 2 produits alors que dans mon mail je ne vois que le second produit, malgré de nombreux tests... J'ai donc dû passer à coter de quelque chose.

Merci de votre aide.

Jean Yve

Mammouth du PHP | 2703 Messages

24 oct. 2019, 13:37

$html = "<li>".$listeproduit."</li><br />";
le contenu de la variable $html est donc écrasée avec le nouveau contenu. c'est donc normal que de n'avoir qu'un produit au final, le dernier de la boucle.

Jean Yve
Invité n'ayant pas de compte PHPfrance

24 oct. 2019, 13:44

J'ai retiré le $html mais il s'affiche toujours que le second produit. Je pense donc que $listeproduit ce fait écraser aussi. Comment faire pour pas avoir cet ecrassement ?

Merci.

Jean Yve

Mammouth du PHP | 2703 Messages

24 oct. 2019, 14:20


Jean Yve
Invité n'ayant pas de compte PHPfrance

24 oct. 2019, 14:24

Parfait merci à toi je n'y avais pas pensé.
C'est bon ça fonctionne.

Jean Yve