Bonjour à toutes et tous, Je pense ne pas être le seul à m'être plongé dans des envois de mails. je suis train de voir pour envoyer des notifications lors d'un ajout de commentaires sur un billet, j'ai réussi à faire une newsletter et une notification lors d'une réponse à un billet (pas trop compliqué jusque là). je vais la faire simple: Lors d'une réponse à un commentaire posté sur un billet, je dois envoyer une notification aux membres pour les prevenir d'une réponse postée, mais selon ces critères: - S'il est le premier à répondre, il ne doit pas recevoir de notification - pas fait encore cette partie - Seuls les membres ayant activé la notification reçoivent le mail filtré par une variable "combillet" Et mon soucis principal et celui d'envoi sans les redondances, si un membre a déjà répondu 3 fois, il ne faut pas qu'il reçoivent 3 fois la notification, j'avais filtré par un "*DISTINCT*" tel que: [code]$sql ="SELECT DISTINCT email FROM users WHERE combillet='1'";[/code] Cela ne fonctionnait pas, j'ai donc fait par: [code]$sql ="SELECT email FROM users WHERE combillet='1' GROUP BY email";[/code] mais même résultat. Enfin, je pense que pour le faire plus simple, en utilisant un **array_unique** serait le plus valable (http://php.net/manual/fr/function.array-unique.php) et un **for**, mais je suis une quiche pour ce qui est d'incrémentation des tableaux.., qu'en pensez-vous ? Je cherche de toute façon de mon côté, mais je m'y perds au bout d'un moment :)

5 réponses


Thokki
Auteur
Réponse acceptée

Bon, j'ai refait sur un serveur local, j'ai résolu la boucle en passant par 2 While.

A bientôt.

William_LF
Réponse acceptée

Bonjour Thokki,

à ta place voici ce que je ferai :

  • dans ta table contenant les commentaires 'comments' (par exemple) tu rajoutes un champ 'send' qui est un boolean (true|false)

  • ensuite lorsqu'un nouveau commentaire est posté, tu l'ajoutes dans ta table 'comments' en mettant la valeur 'send' a false

  • puis tu récupères dans cette table les utilisateurs dont le champ send est à false

    SELECT DISTINCT id, user_id FROM comments WHERE send = false;

  • si cette liste contient un seul utilisateur (c'est ton premier com), tu ne fais que modifier la ligne en passant le champ 'send' à true

  • si tu en as plus de un, elle contiendra les utilisateurs ayants commentés et à qui tu dois envoyer un mail

  • enfin passe le champ 'send' à true pour l'ensemble des lignes récupérés

Ciao

Thokki
Auteur
Réponse acceptée

Alors, j'ai modifié, voici ce que ca pourrait donner (code en essai):

<h2>Envoi notification nouveau commentaire [DEBUG]</h2>
<?php   
    // Récupération mails des commentaires postés
    $sqlemailcom = "SELECT DISTINCT mail,send FROM commentaires WHERE idedc=$id and send='0'";
    $reqemailcom = mysql_query($sqlemailcom) or die ('Erreur SQL<br/>'.mysql_error());
        // On initialise le compteur d'envoi
    $i = 0;
                // On boucle
        while ($dataemailcom= mysql_fetch_assoc($reqemailcom)){
            $emailcom = $dataemailcom'mail'];
                        // On récupère l'adresse quand le membre est abonné
            $sqlnotifok =" SELECT login,email FROM users WHERE email='$emailcom' AND combillet='1'";
            $reqnotifok = mysql_query($sqlnotifok) or die ('Erreur SQL<br/>'.mysql_error());
            $datanotifok= mysql_fetch_assoc($reqnotifok);
            if (mysql_num_rows($reqemailcom) == 1){
                // ON NE FAIT RIEN = Premier commentaire posté, pas de notification
            }
            if (mysql_num_rows($reqemailcom) > 1){
                // ON ENVOI LES NOTOFICATIONS:
                    // Objet
                    $objet = 'xxxxxxxxx.fr > Réponse à un commentaire.' . "\r\n";
                    // EMAIL du membre
                    $email = $datanotifok'email'];
                    // Header
                    $headers = 'MIME-Version: 1.0' . "\r\n";
                    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
                    $headers .= 'From:xxxxx@xxxxxx.fr' . "\r\n";
                    // Message
                    $message = file_get_contents('admin/template/_notification_header_format.html', FILE_USE_INCLUDE_PATH);
                    $message .= "Bonjour <b>".$datanotifok'login']."</b>, ";
                    $message .= "un nouveau commentaire a été publié sur l'article <u><a href=\"http://xxxxxxxxx.fr/comments.php?id=\"".$id."\"\">".$data'titre']."</a></u>";
                    $message .= file_get_contents('admin/template/_notification_footer_format.html', FILE_USE_INCLUDE_PATH);

                    // Preview
                    echo $email;
                    echo "<br/>";
                    echo $objet;
                    echo "<br/>";
                    echo $headers;
                    echo "<br/>";
                    echo $message;
                    $i++;
                                        // DESACTIVATION ENVOI MAIL POUR ESSAIS
                                        // mail($email,$objet,$message,$headers);
                }
            }
        // MISE A JOUR BOOLEEN SEND
        $sqlsend ="UPDATE commentaires set send='1' where idedc=$id";
        $reqsend = mysql_query($sqlsend) or die('Erreur de connexion à la base<br/>'.$sqlsend.'<br/>'.mysql_error());
        echo $i." Messages envoyés";
?>
Thokki
Auteur

Bonjour Swup.

Merci de ta réponse, je vais explorer cette méthode. Pour info, j'ai 2 tables, une qui contient les commentaires et une autre (celle des membres) où je vais y récupérer leur adresse mail (permet de vérifier si email commentaire posté = email d'un membre) et de vérifier si le membre en question veut bien recevoir les messages (notifications dans son compte), Mais ca ne change absolument rien à la logique !

Merci !

Je valide :)

Thokki
Auteur

J'ai testé, ca fonctionne super !
Encore merci Swup.