每天运行的电子邮件脚本(需要一些概念上的帮助)

时间:2011-02-22 02:25:58

标签: php mysql math

我有一个脚本,可以通过几个步骤向学生发送电子邮件,这些学生迟到了。学校基本上惩罚了有3和5个迟到的学生。然而,除此之外,还有一个总的迟到计数。例如,学生可以有16个迟到但他们的“惩罚”计数将为16 % 5 === 1

这是它的工作原理:

cron作业每天凌晨3点运行,检查以下内容:
如果学生(tardy % 5 == 3)的次数,这意味着他们有3个迟到。然后,该脚本将该特定学生的tardyemail列更新为等于1。

如果学生迟到的次数%(mod)5 = 0,则表示他们有5次迟到。然后,该脚本将tardyemail列更新为等于2.

以下是相关代码:

if($row['times_tardy'] % 5 == 0) {
    echo $row['fname']." - 5<br />";
    $sql = "UPDATE student SET tardyemail = '2' WHERE rfid = '" . $row['StudentID'] . "'";
    mysql_query($sql) or die (mysql_error());
}
if($row['times_tardy'] % 5 == 3) {
    echo $row['fname']." - 3<br />";
    $sql = "UPDATE student SET tardyemail = '1' WHERE rfid = '" . $row['StudentID'] . "'";
    mysql_query($sql) or die (mysql_error());
}

单独的cron脚本在3:30运行,执行以下操作:
选择tardyemail列等于1的学生,如果等于1,则向该学生发送3个迟到的模板电子邮件。然后,将tardyemail列更新为0。

选择tardyemail列等于2的学生,如果等于2,则向该学生发送5个迟到的模板电子邮件。然后,将tardyemail列更新为0。

相关代码:

$sql = "SELECT * FROM student WHERE tardyemail = '1' AND grade_level > 10";
$result = mysql_query($sql) or die (mysql_error());
if(mysql_num_rows($result) > 0) {
    while($row = mysql_fetch_array($result)) {
        // send the email
    }
}
// update tardyemail to equal 0

$sql = "SELECT * FROM student WHERE tardyemail = '2' AND grade_level > 10";
$result = mysql_query($sql) or die (mysql_error());
if(mysql_num_rows($result) > 0) {
    while($row=mysql_fetch_array($result)) {
         // sendthe mail
    } 
}
// update tardyemail to equal 0

这个问题是,每天3或5个学生的学生都会不断发送电子邮件,因为如果他们不再累积迟到,他们会保持在3和5岁。我需要一些帮助搞清楚一种方法,如果他们没有累积更多的迟到,不要多次发送电子邮件。

2 个答案:

答案 0 :(得分:0)

不仅如此,但至少如你所描述的那样 - 0 times_tardy的学生仍将通过%5=0检查(因此他们将获得tardyemail类型2)。< / p>

您基本上需要做的是确定在存储他们已经迟到的事实时要生成的电子邮件类型。另外,虽然我可能不了解你的过程,你可能想在每次他们在前两次(例如第四次)迟到时发送tardyemail类型1并且每次他们迟到时都发送一个类型2的电子邮件在前四次之后(例如,第6次,第7次,第8次......第n次)。您当前的计划为学生提供了5个迟到的好处(接下来的2个是免费的电子邮件)。

而不是盲目更新times_tardy(事先在某个时刻?)为什么不在存储新内容时根据tardyemail的当前值将times_tardy设置为1或2迟到计数。类似于以下SQL语句:

-- First, Second Offence
UPDATE student SET times_tardy=times_tardy+1 
 WHERE times_tardy<2;
-- 3+ offence
UPDATE student SET times_tardy=times_tardy+1,tardyemail=1 
 WHERE times_tardy>=2 AND times_tardy<4;
-- 5+ offence
UPDATE student SET times_tardy=times_tardy+1,tardyemail=2 
 WHERE times_tardy>=4;

这假设你的times_tardy存储在同一个SQL表中(你没有说)但是如果以其他方式存储它,它可以很容易地在MySQL或PHP代码中修改。

答案 1 :(得分:0)

将student.tardyemail列更改为标志student.tardyemail_sent。

更新student.times_tardy值时,清除标记(设置tardyemail_sent = 0)。

然后,为了让那些应该收到“3次迟到”电子邮件的学生,

$sql = "SELECT *
        FROM student 
        WHERE times_tardy % 5 = 2
        AND tardyemail_sent = 0
        AND grade_level > 10";

(请注意,您使用的是3,其中一个是关闭的。)

选择应该收到“5次迟到”电子邮件的学生

$sql = "SELECT *
        FROM student 
        WHERE times_tardy % 5 = 0
        AND times_tardy > 0
        AND tardyemail_sent = 0
        AND grade_level > 10";

(注意额外条款以排除那些0迟到的人。)

发送电子邮件后,请设置tardyemail_sent = 1。