Nous travaillons sur un petit script d'e-mail de suivi et devons maintenant déterminer si un e-mail apparaît plus d'une fois dans les résultats de la requête. Si l'e-mail n'apparaît qu'une seule fois, utilisez le contenu de l'e-mail A, s'il apparaît plus d'une fois, utilisez le contenu de l'e-mail B.

Nous utilisons une requête PHP assez standard, puis une boucle while pour traiter chaque ligne:

// query database followups for rows which fupdate = todays date
require 'user password stuff.php';
$today = date("Y-m-d");

// tourname, email, tourid, fupsent
$fups = $database->query("SELECT * FROM followups WHERE fupdate='$today'");
while ($followup = $fups->fetch(PDO::FETCH_ASSOC))
{
  $email = $followup["email"];
  // check if email appears more than once
  // the code we need...

  if ($emailcount === 1) {
    // include content A in email body
  } else {
    // include content B in email body
  }
}

Existe-t-il un moyen auto-magique d'accomplir une telle tâche? Ou sommes-nous limités à configurer une autre requête / boucle while pour comparer les e-mails les uns aux autres et compter combien de fois il correspond à un?

Quelques précisions supplémentaires:

Nous travaillons avec une seule table, qui contient: fupdate, email, name, productid (plus quelques autres colonnes qui ne sont pas liées à cette fonction).

Tous les e-mails dupliqués auraient un identifiant de produit unique

--- Je l'ai trié ---

C'était un choix difficile quant à la réponse acceptée, les deux avaient le même objectif et étaient écrits à quelques minutes l'un de l'autre, mais Qirel est allé un peu plus loin avec leur explication.

La version finale est assez différente du concept original, car maintenant nous allons d'abord utiliser les fonctions COUNT(*) et GROUP by email pour récupérer une liste d'e-mails uniques à traiter, puis faire une deuxième requête en utilisant {{X2} } pour combiner les suivis et les tableaux de produits pour recueillir le nom du client ainsi que les noms de produit et les URL pour créer le contenu de l'e-mail.

Je remercie tous les trois qui ont fourni des réponses / commentaires, car tous ont contribué aux idées finales.

0
Tom 22 avril 2020 à 10:01

2 réponses

Meilleure réponse

Vous devez utiliser une instruction préparée avec votre requête, pour éviter d'injecter des variables directement dans votre requête SQL.

Pour obtenir le nombre d'occurrences d'une entrée, utilisez GROUP BY email, puis utilisez la fonction d'agrégation COUNT(), qui vous donnera le nombre de chaque e-mail correspondant à la condition de votre clause WHERE.

La requête devient alors

SELECT email, COUNT(*) as email_count
    FROM followups
    WHERE fupdate = ?
    GROUP BY  email

? est un espace réservé, que nous lions en passant un tableau à la méthode execute().

$stmt = $database->prepare("SELECT email, COUNT(*) as email_count
                                FROM followups
                                WHERE fupdate = ?
                                GROUP BY  email");
$stmt->execute([$today]);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $email = $row["email"];

    if ($row['email_count'] == 1) {
        // include content A in email body
    } else {
        // include content B in email body
    }
}
0
Qirel 22 avril 2020 à 07:10

Utiliser la requête avec GROUP BY:

SELECT email, count(*) as email_count FROM followups WHERE fupdate='$today' GROUP BY email

Dans le tableau $followup, vous aurez deux clés: email et email_count qui afficheront le nombre d'e-mails en cours.

0
u_mulder 22 avril 2020 à 07:02