查询DB以获取时间戳相同的多行,并且电子邮件地址相同

时间:2011-11-21 21:12:33

标签: php mysql cron

<?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 个答案:

答案 0 :(得分:1)

你应该把时间逻辑移到你的数据库查询中 - 如果没有任何事情要做,那么获取所有行是没有意义的,只是扔掉一些(大多数?所有?)行:

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);
}

这样,您可以一次性获取所有用户详细信息。然后,您为每个用户构建一封SINGLE电子邮件,列出所有小册子,并(希望)解决了问题。