首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >每天运行的电子邮件脚本(需要一些概念上的帮助)

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

Stack Overflow用户
提问于 2011-02-22 02:25:58
回答 2查看 84关注 0票数 2

我有一个脚本,分几个步骤给学校里迟到的学生发电子邮件。这所学校实质上是惩罚那些有3和5格子的学生。然而,除此之外,还有一个完全的迟滞的数字。例如,一个学生可以有16个格子,但他们的“惩罚”计数将16 % 5 === 1

这就是它的工作原理:

每天3:00运行cron作业,检查以下内容:

如果学生的次数(tardy % 5 == 3),那就意味着他们有3件格子。然后,脚本将该特定学生的一个名为tardyemail的列更新为等于1。

如果学生的时间是延迟% (mod) 5= 0,这意味着他们有5个格子。然后,脚本将tardyemail列更新为等于2。

以下是相关代码:

代码语言:javascript
运行
复制
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,将模板电子邮件发送给这些学生。然后,将tardyemail列更新为0。

选择学生谁的延迟电子邮件列等于2,如果它等于2,发送模板电子邮件的5个格子给这些学生。然后,将tardyemail列更新为0。

相关守则:

代码语言:javascript
运行
复制
$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。我需要一些人的帮助,想出一种方法,如果他们没有积攒更多的油布,就不会给他们发几次邮件。

EN

回答 2

Stack Overflow用户

发布于 2011-02-22 02:42:35

不仅如此,就像您所描述的那样,-at --一个拥有0 times_tardy的学生仍将通过%5=0检查(因此他们将获得2类型的tardyemail )。

本质上,你需要做的是确定当你储存的事实是拖拉的时候要生成什么样的电子邮件。此外,虽然我可能不明白你的过程,你可能想发送一个延迟邮件类型1,每次他们迟到后,前两次(如第4次)和第2类型的电子邮件,每次他们迟到后,前四次(如第6次,第7次,8th...nth次数)。你现在的计划给了学生一个好处后,他们已经打了5个格子(接下来的2个是免费电子邮件)。

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

代码语言:javascript
运行
复制
-- 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代码中,则很容易修改它。

票数 0
EN

Stack Overflow用户

发布于 2011-02-22 02:54:46

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

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

然后,为了让学生收到“三次迟到”的邮件,

代码语言:javascript
运行
复制
$sql = "SELECT *
        FROM student 
        WHERE times_tardy % 5 = 2
        AND tardyemail_sent = 0
        AND grade_level > 10";

(请注意,您使用的是3,该值为1。)

要选择那些应该收到"5次迟到“邮件的学生,

代码语言:javascript
运行
复制
$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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5073402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档