[英]Repeating Events
对于我当前的项目,我正在创建一个php脚本,该脚本允许我们的讲师管理他们的可用时间,以便学生查看。 我已经启动并运行正常,但是我被要求添加一些内容。 基本上,当讲师增加时间时,他们需要能够“每个星期一,星期二,星期三等重复很多次”,当前的执行代码如下:
$cid = $_SESSION['CID'];
$day = $_POST['day'];
$month = $_POST['month'];
$year = $_POST['year'];
$btime = $_POST['btime'];
$etime = $_POST['etime'];
$rep_mon = $_POST['repeat_day_mon'];
$rep_tues = $_POST['repeat_day_tues'];
$rep_wed = $_POST['repeat_day_wed'];
$rep_thur = $_POST['repeat_day_thur'];
$rep_fri = $_POST['repeat_day_fri'];
$rep_sat = $_POST['repeat_day_sat'];
$rep_sun = $_POST['repeat_day_sun'];
$xrep_day = $_POST['xrepeat_day']; //How many times they want to repeat it
$current_month = date("n");
$tm = mktime(0, 0, 0, $month, $day, $year);
$day_name = date("D",$tm);
if($rep_mon == '1')
{
if($day_name == 'Mon')
{
$counter = 0;
$day1 = $day;
while($counter <= $xrep_day)
{
$q1 = sprintf("INSERT INTO `INS_TIME`(cid, month, day, year, btime, etime)VALUES('%s', '%s','%s', '%s', '%s', '%s')",
mysql_real_escape_string($cid, $con),
mysql_real_escape_string($month, $con),
mysql_real_escape_string($day1, $con),
mysql_real_escape_string($year, $con),
mysql_real_escape_string($btime, $con),
mysql_real_escape_string($etime, $con));
mysql_query($q1, $con) or die("There was an error with the query:" . mysql_error());
$counter++;
$day1 += 7;
}
}
if($day_name == 'Tue')
{
$counter = 0;
$day1 = $day;
while($counter <= $xrep_day)
{
$q1 = sprintf("INSERT INTO `INS_TIME`(cid, month, day, year, btime, etime)VALUES('%s', '%s','%s', '%s', '%s', '%s')",
mysql_real_escape_string($cid, $con),
mysql_real_escape_string($month, $con),
mysql_real_escape_string($day1, $con),
mysql_real_escape_string($year, $con),
mysql_real_escape_string($btime, $con),
mysql_real_escape_string($etime, $con));
mysql_query($q1, $con) or die("There was an error with the query:" . mysql_error());
$counter++;
$day1 += 6;
if($counter >=2)
{
$day1++;
}
}
}
// ...
它继续提供更多的ifs,但我不想将其全部粘贴,因为它的长度超过1000行。 如果您需要完整的代码,我也可以轻松获取。
我们已经注意到,有时它无法正常工作,并且会多次重复执行或根本不执行。 我还想用较短的代码和更少的ifs完成任务。
如果您能想到更好的方法,我将不胜感激!
谢谢!
::::: EDIT :::::不想工作的新代码:
$this_sunday = time() - (date("w") * 86400); // this will give you Sunday
$monday = $this_sunday + 1 * 86400; // 86400 = seconds in a day
$tuesday = $this_sunday + 2 * 86400; // 86400 = seconds in a day
$wednesday = $this_sunday + 3 * 86400; // 86400 = seconds in a day
$thursday = $this_sunday + 4 * 86400; // 86400 = seconds in a day
$friday = $this_sunday + 5 * 86400; // 86400 = seconds in a day
$saturday = $this_sunday + 6 * 86400; // 86400 = seconds in a day
$sunday= $this_sunday + 7 * 86400; // 86400 = seconds in a day
$start_time = mktime($hour, $minute, 0, $month, $day, $year);
//FUNCTION TO DO THE ACTUAL REPEATING
function repeat($start_time, $duration, $repeat)
{
$week = 604800; // 60 * 60 * 24 * 7 (1 week in seconds)
for ($i=0; $i<$repeat; ++$i, $start_time += $week)
{
$date = date("Y-m-d", $start_time);
$sql = sprintf("INSERT INTO STAT_INS_AVAIL(CID,DATE,DURATION)VALUES('%s','%s','%s')",$cid,$date,$duration);
}
}
//REPEAT ON MONDAYS
if($rep_mon == '1')
{
repeat($monday, $duration, $xrep_day);
}
//REPEAT ON TUESDAYS
if($rep_tues == '1')
{
repeat($tuesday, $duration, $xrep_day);
}//REPEAT ON WEDBNESDAYS
if($rep_wed == '1')
{
repeat($wednesday, $duration, $xrep_day);
}//REPEAT ON THURSDAYS
if($rep_thur == '1')
{
repeat($thursday, $duration, $xrep_day);
}//REPEAT ON FRIDAYS
if($rep_fri == '1')
{
repeat($friday, $duration, $xrep_day);
}//REPEAT ON SATURDAYSS
if($rep_sat == '1')
{
repeat($saturday, $duration, $xrep_day);
}//REPEAT ON SUNDAYS
if($rep_sun == '1')
{
repeat($sunday, $duration, 4);
}
//Go through this is they do not want to repeat AT ALL
if(!$rep_mon || !$rep_tues || !$rep_wed || !$rep_thur || !$rep_fri || !$rep_sat || !$rep_sun)
{
$date = date("Y-m-d G:i:s", $start_time);
$sql = sprintf("INSERT INTO STAT_INS_AVAIL(CID,DATE,DURATION)VALUES('%s','%s','%s')",$cid,$date,$duration);
mysql_query($sql,$con);
}
我会做这样的事情:
function repeat($start_time, $duration, $repeat) {
$week = 604800; // 60 * 60 * 24 * 7 (1 week in seconds)
for ($i=0; $i<$repeat; ++$i, $start_time += $week) {
$date = date("Y-m-d", $start_time);
$sql = "INSERT INTO ... $date, $duration ...";
}
}
$start = mktime($hour, $minute, $second, $month, $day, $year);
// some logic to figure out start times by dates of the week
// ...
repeat($monday, 100, 4);
repeat($tuesday, 100, 4);
当然,我将使用单个DATETIME
字段来存储日期时间,并使用INTEGER
来存储持续时间(以分钟为单位)(或者更方便的方式)。
编辑 :您可以将调度部分放在函数中,并使用不同的参数调用它,但是您仍然需要逻辑来确定正确的开始时间。
要确定一周的开始时间,可以使用类似以下内容的方法:
$this_sunday = time() - (date("w") * 86400); // this will give you Sunday
$tuesday = $this_sunday + 2 * 86400; // 86400 = seconds in a day
$friday = $this_sunday + 5 * 86400; // 86400 = seconds in a day
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.