Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP显示SQL数据库中的重复日期_Php_Mysql - Fatal编程技术网

使用PHP显示SQL数据库中的重复日期

使用PHP显示SQL数据库中的重复日期,php,mysql,Php,Mysql,我正在访问另一家网络公司创建的数据库,以检索当前客户端的事件信息。我的客户输入事件信息并记录日期是否重复。我正在尝试显示所有重复的日期。到目前为止,我已经能够显示所有内容,包括定期日期和重复日期 各表的布局如下: 事件 重复发生的事件 这是事件表的一部分 这就是Events\u Recurtive表的外观 当客户端将其检查为定期时,events_Recurtive table将创建一行,其中包含事件ID和其他信息,如事件在每周或每月的哪一天重复发生 我只是不知道如何显示重复出现的特定ID的倍数。

我正在访问另一家网络公司创建的数据库,以检索当前客户端的事件信息。我的客户输入事件信息并记录日期是否重复。我正在尝试显示所有重复的日期。到目前为止,我已经能够显示所有内容,包括定期日期和重复日期

各表的布局如下:

事件 重复发生的事件 这是事件表的一部分

这就是Events\u Recurtive表的外观

当客户端将其检查为定期时,events_Recurtive table将创建一行,其中包含事件ID和其他信息,如事件在每周或每月的哪一天重复发生

我只是不知道如何显示重复出现的特定ID的倍数。我有一个可以访问的开始日期和结束日期,以及它在一周中的哪一天重复出现

举个例子:如果这个事件每周四再次发生。我知道它从1月1日开始,到1月31日结束,我能把这段经历,并说出4个不同的事件,所有这些事件的日期都是1月的每个星期四吗

这是我正在使用的完整代码,在试图解决这个问题时有点混乱。我正在检查底部是否有复发

// Access external database
$events_db = new wpdb(TOP SECRET CREDENTIALS HERE);
$events_db->show_errors();

if ($events_db) :
    // Query Events Database
    $events = $events_db->get_results(
        "
        SELECT ID, RequestDateStart, RequestDateEnd, Ministry, RequestTimeStart, EventName, CoordinatorName, EventDescription, Location
        FROM gc_events
        WHERE PrivateEvent = 0
        AND Ministry = 15
        AND date(RequestDateStart)>=date(NOW())
        ORDER BY RequestDateStart
        "
    );

    // Create the event data that will be displayed
    foreach ($events as $event) :

        // Store Event ID in a variable
        $masterID = $event->ID;

        echo '<div class="col-12">';

        echo '<strong>ID:</strong> ' . $event->ID . '<br /><strong>Event Name:</strong> ' . $event->EventName . '<br /><strong>Leader:</strong> ' . $event->CoordinatorName . '<br /><strong>Date:</strong> ' . date('l, F j',strtotime($event->RequestDateStart)) . '<br /><strong>Start Time:</strong> ' . date('g:i a',strtotime($event->RequestTimeStart));

        // CHECK IF RECURRING

        $recurring_events = $events_db->get_results(
            "
            SELECT gc_event_id, period, day
            FROM gc_event_recurring
            WHERE gc_event_id = '$masterID'
            "
        );

        foreach ($recurring_events as $recurring_event) :
        if ($recurring_event->period === 'week') {

        echo '<div class="col-12"><strong>&uarr; WEEKLY</strong><br />';

        echo $recurring_event->day;

        echo '</div>';

        }
        endforeach;

        echo '</div>';

    endforeach;
endif;
我现在通过重复事件得到的结果是

活动:每周祈祷 日期:2013年2月1日

我想要的结果是

活动:每周祈祷 日期:2013年2月1日

活动:每周祈祷 日期:2013年2月8日

活动:每周祈祷 日期:2013年2月15日

活动:每周祈祷 日期:2013年2月22日

如果开始日期是2月1日,结束日期是2月28日

        foreach ($events as $event) :

                // Store Event ID in a variable
                $masterID = $event->ID;

                echo '<div class="col-12">';

                echo '<strong>ID:</strong> ' . $event->ID . '<br /><strong>Event Name:</strong> ' . $event->EventName . '<br /><strong>Leader:</strong> ' . $event->CoordinatorName . '<br /><strong>Date:</strong> ' . date('l, F j',strtotime($event->RequestDateStart)) . '<br /><strong>Start Time:</strong> ' . date('g:i a',strtotime($event->RequestTimeStart));

                // CHECK IF RECURRING

                $recurring_events = $events_db->get_results(
                    "
                    SELECT gc_event_id, period, day
                    FROM gc_event_recurring
                    WHERE gc_event_id = '$masterID'
                    "
                );

                foreach ($recurring_events as $recurring_event) :
                if ($recurring_event->period == 'week') {
                $StartDate = strtotime($event->RequestDateStart);
                $EndDate = strtotime($event->RequestDateEnd);
$TotalDays = round(($EndDate-$StartDate)/(60*60*24*7));
                for($i = 0 ;$i<($TotalDays-1);$i++)
                {
                $StartDate += (60*60*24*7);
                echo '<div class="col-12">';

                echo '<strong>ID:</strong> ' . $event->ID . '<br /><strong>Event Name:</strong> ' . $event->EventName . '<br /><strong>Leader:</strong> ' . $event->CoordinatorName . '<br /><strong>Date:</strong> ' . date('l, F j',$StartDate) . '<br /><strong>Start Time:</strong> ' . date('g:i a',strtotime($event->RequestTimeStart));


                }


                }
                endforeach;

                echo '</div>';

            endforeach;
试试这个,告诉我它是否有效。给我一点建议

尽管从设计的角度来看,设计一个数据库来存储重复模式的“描述”是一种非常干净的方法,但在这一过程中可能会遇到很多问题

不久前,我用类似的方法完成了一个项目,我将查找数据库设计并将其添加到我的答案中,尽管我能够重现重复事件的确切日期/时间,但在以下情况下,您将遇到问题;大多数来自于此:

重复事件描述了重复模式,因此实际的单个事件在数据库中没有物理记录

如果客户决定添加新事件,您将如何检查它是否与任何现有事件重叠?你必须根据重复模式计算所有“事件”。 如果客户决定需要更改事件的计划时间,您将如何将此更改应用于所有未来事件而不是过去的事件?您必须复制原始事件,修改其结束日期,并将复制的事件设置为新的开始日期 如果客户决定从重复模式中删除一天,例如单个事件已取消,则您还必须将原始事件拆分为两个单独的重复,或创建一个“取消/阻止”日期/时间表 如果人们需要“预订”特定事件,您将无法将其附加到“真实”事件记录,因为单个事件并不存在于数据库中。e、 g.要检查单个事件是否可以重新安排或取消,您需要从代码中执行此操作,因为数据库无法使用外键约束自动更新相关保留 关于绩效;因为单个事件不是物理存储的,所以每次要显示它们时都必须计算它们。考虑在数据库中有1000个重复事件,并尝试显示两年后的23周的“日历”。您必须分析所有重复事件模式,并计算它们产生的所有事件! 当然,这一切都取决于您系统的实际使用情况,但我想提醒您我们遇到的问题

下面是“schedules”表的模式,其中包含重复事件模式

CREATE TABLE IF NOT EXISTS `schedules` (
  `id`              int(11)     NOT NULL auto_increment,
  `date_start`      date        NOT NULL,
  `time_start`      time        NOT NULL,
  `time_end`        time        NOT NULL,
  `recur_until`     date        default NULL COMMENT 'end date when recurrence stops',
  `recur_freq`      varchar(30) default NULL COMMENT 'null, "secondly", "minutely", "hourly", "daily", "weekly", "monthly", "yearly"',
  `recur_interval`  smallint(5) unsigned default NULL COMMENT 'e.g. 1 for each day/week, 2 for every other day/week',
  `recur_byday`     smallint(5) unsigned default NULL COMMENT 'BITWISE; monday = 1, sunday = 64',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
如何规避所描述的问题

完全描述这些问题的解决方案在这里可能不合适,但这里有一些要考虑的事情; 按描述的方式存储重复事件本身并不是一种坏做法。它完美地描述了事件发生的时间和频率。然而,缺乏实际事件的物理记录是造成问题的原因

创建或修改定期事件时,计算所有结果事件并将其存储为物理记录。可以查询这些记录,可以将“保留”附加到这些记录,并且您可以利用数据库功能,如外键约束来正确处理它们。 当存储1中所述的单个事件时,请确保保留对它们所属的“计划”的引用。例如,如果客户想要更改重复事件的时间,您将能够更新所有相关事件 所有事件。 请记住,在情况2中,您可能只想更新未来的事件,因此“重复事件”仍然需要“拆分”为两部分才能实现这一点。在这种情况下,“未来”事件需要附加到新的“定期事件”,旧事件将保留附加到现有的“定期事件” 在数据库/软件设计上投入时间,适当地调查设计是否对您试图实现的目标“有效”。测试它,尝试一些事情,如果它们不起作用,毫不犹豫地“扔掉”,通常从零开始比尝试“修复”事情更容易。正确的设计需要时间,可能需要几次“重新设计”才能正确,但最终会为您节省时间和金钱


希望这有帮助,祝你好运

你的问题让人困惑,你能展示一下代码吗?是的,请试着用一种好的方式定义你的问题dnt恐慌,冷静一点,不要恐慌:添加了更多的信息,以及我正在使用的代码,周期性事件显示多次?$Recurrential\u event->period=='week'不使用===使用==请发布表结构和临时数据;另外,您希望获得的示例结果$Recurtive_event->day是我相信的一周中的某一天。但在表中,我认为这是一个计数。请参见问题。他可以使用该值作为计数,无论它是什么!我以为这是有效的,但在检查它们时,有些已经超过了它们应该结束的日期。客户端输入我可以使用的开始日期和结束日期。我猜这些可以解决过去的问题?你面临的问题是什么?你能告诉我你现在的表现吗?你可以在这里看到:应该结束的活动仍然有更多的日期。哇,谢谢你提供的信息!实际上,我这周才开始摆弄数据库。我没有建立当前正在使用的数据库,只是试图从中提取信息。不过,你确实提出了一些我会记住的要点。谢谢@不客气。我会在我的帖子中添加一些额外的信息,这些信息可能会绕过所描述的问题。我喜欢它。谢谢这是一个伟大的回应,来自一个平面设计的背景,我可以肯定地看到建立一个漂亮的,可读的数据库的艺术。