繁体   English   中英

重复活动

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM