我有一个脚本,分几个步骤给学校里迟到的学生发电子邮件。这所学校实质上是惩罚那些有3和5格子的学生。然而,除此之外,还有一个完全的迟滞的数字。例如,一个学生可以有16个格子,但他们的“惩罚”计数将16 % 5 === 1
。
这就是它的工作原理:
每天3:00运行cron作业,检查以下内容:
如果学生的次数(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,将模板电子邮件发送给这些学生。然后,将tardyemail列更新为0。
选择学生谁的延迟电子邮件列等于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。我需要一些人的帮助,想出一种方法,如果他们没有积攒更多的油布,就不会给他们发几次邮件。
发布于 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语句:
-- 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代码中,则很容易修改它。
发布于 2011-02-22 02:54:46
将student.tardyemail列更改为标志student.tardyemail_sent。
更新student.times_tardy值时,清除标志(设置tardyemail_sent = 0)。
然后,为了让学生收到“三次迟到”的邮件,
$sql = "SELECT *
FROM student
WHERE times_tardy % 5 = 2
AND tardyemail_sent = 0
AND grade_level > 10";
(请注意,您使用的是3,该值为1。)
要选择那些应该收到"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。
https://stackoverflow.com/questions/5073402
复制相似问题