PHP определяет, появляется ли электронная почта более одного раза в SQL результатах запроса - PullRequest
0 голосов
/ 22 апреля 2020

Мы работаем над небольшим последующим сценарием электронной почты и теперь должны определить, появляется ли электронное письмо более одного раза в результатах запроса. Если электронное сообщение появляется только один раз, используйте содержимое электронной почты A, если оно появляется более одного раза, используйте содержимое электронной почты B.

Мы используем довольно стандартный запрос PHP, а затем используем для обработки время l oop. каждая строка:

// 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
  }
}

Существует ли автомагический способ выполнить такую ​​задачу? Или мы ограничены настройкой другого запроса / в то время как l oop для сравнения электронной почты друг с другом и подсчета того, сколько раз оно соответствует одному?

Некоторые дополнительные уточнения:

Мы работаем только с одной таблицей, которая содержит: fupdate, email, name, productid (плюс несколько других столбцов, не связанных с этой функцией).

Любые дублированные электронные письма будут иметь уникальный productid

--- Разобрались ---

Это был трудный выбор в отношении принятого ответа, оба имели одинаковую направленность и были написаны в течение нескольких минут друг от друга, но Qirel пошел немного дальше со своими объяснениями.

Окончательная версия сильно отличается от первоначальной концепции, поскольку теперь мы сначала будем использовать функции COUNT(*) и GROUP by email, чтобы получить список уникальных электронных писем для обработки, а затем выполнить второй запрос, используя JOIN объединить описания и таблицы продуктов, чтобы собрать имена клиентов, а также названия продуктов и URL-адреса для создания содержимого электронной почты.

Спасибо всем трем Хо предоставил ответы / комментарии, так как все внесли свой вклад в окончательные идеи.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Вы должны использовать подготовленный оператор с вашим запросом, чтобы избежать внедрения переменных непосредственно в ваш запрос SQL.

Чтобы получить количество вхождений записи, используйте GROUP BY email, а затем используйте агрегатную функцию COUNT(), которая даст вам счетчик каждого электронного письма, соответствующего условию в вашем предложении WHERE.

Затем запрос становится

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

Где ? - это заполнитель, который мы связываем, передавая массив методу 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 голосов
/ 22 апреля 2020

Используйте запрос с GROUP BY:

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

В массиве $followup у вас будет два ключа: email и email_count, которые будут отображать счет текущей электронной почты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...