Запросите базу данных, чтобы получить несколько строк с одинаковыми временными метками и одинаковыми адресами электронной почты - PullRequest
2 голосов
/ 22 ноября 2011
<?php
$curr = time();

$time_query = "SELECT * FROM users ";

$time_query_result = mysql_query($time_query, $db) or 

die("Could not execute sql: $time_query"); 

$num_result = mysql_num_rows($time_query_result);

for ($i1=0; $i1 < $num_result; $i1++){

    $row = mysql_fetch_array($time_query_result); 


    if ($curr > $row["time"] + 259200)//Do if it has been three days since brochure was selected
    {
           $arr = implode (',', $row);//TURN THE ROW[BROCHURES] ARRAY INTO IMPLODE THING INSIDE THIS LOOP!?!?!
        echo $arr;
        $message1  = '<html><body><p>Brochure reminder</p>';
        $message1 .= 'Brochures:<br />'.$arr .$row["brochures"]. $row["time"];
        $message1 .= '</body></html>';
        // Mail it
        mail($row['email'], $subject, $message1, $headers);
    }

} ?>

Итак, я хочу отправить электронное письмо клиентам, выбирающим брошюру. Эта часть сделана хорошо, но я хочу, чтобы через три дня они получили еще одно электронное письмо с напоминанием о выбранных ими брошюрах. Я настроил работу cron, поэтому этот фрагмент кода повторяется каждые три дня.

Когда письмо отправляется, оно отправляется правильному лицу, но выбранные брошюры разбиваются на отдельные электронные письма. Например, если кто-то выберет 5 брошюр, через три дня он откроет 5 отдельных писем с разными брошюрами в каждой.

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

Спасибо!

1 Ответ

1 голос
/ 22 ноября 2011

Вы должны переместить логику времени в запрос к базе данных - нет смысла извлекать ВСЕ строки, только отбрасывать некоторые (большинство? Все?) Строки, если ничего не нужно делать:

SELECT *
FROM users
WHERE `time` < (now() - INTERVAL 3 DAY)

Как только это будет сделано, я бы посоветовал убрать фактическую часть mail () из цикла извлечения базы данных, чтобы вы могли сначала собрать вместе брошюры каждого пользователя:

$users = array();
while($row = mysql_fetch_array($time_query_result)) {
    if (!array_key_exists($row['userID'], $users)) {
        $users[$row['userID']] = array('email' => $row['email'], 'brochures' => array());
    $users[$row['userID']]['brochures'] = array('b' => $row['brochures'], 't' => $row['time']);
    }
}

Затем вы перешли бы этот циклМассив $ users для создания электронных писем для пользователей:

foreach ($users as $user) {
     $text = '<html><body><p>Brochure reminder</p>';
     $i = 1;
     foreach ($user['brochures'] as $brochure) {
        $text .= 'Brochures:<br />'.$i++ .$row['b']. $row['b'];
     }
     $text .= '</body></html>';
     mail($user['email'], $subject, $text, $headers);
}

Таким образом, вы получаете все данные пользователя за один раз.Затем вы создадите ЕДИНСТВЕННОЕ электронное письмо каждому пользователю, в котором перечислены все их брошюры и (надеюсь) проблема решена.

...