我正在访问由另一家网络公司创建的数据库,以检索当前客户端的事件信息.我的客户输入事件信息,并注明日期是否经常发生.我正在尝试显示所有重复日期.到目前为止,我已经能够显示所有内容,定期日期以及重复发生.
表格如下:
这是Events表BIGGER PICTURE的一部分

这就是Events_Recurring表的样子

当客户端将其检查为重复发生时,events_recurring表会创建一个包含事件ID的行以及其他信息,例如事件重复发生的星期几或月份.
我只是不确定如何显示重复出现的某个ID的倍数.我有一个开始日期,我可以访问的结束日期,以及它重复出现的一周中的哪一天.
例如:如果此事件每周四重新发生.我知道它从1月1日开始到1月31日结束,我是否能够完成这个并且在1月的每个星期四的日期中吐出4个不同的事件?
这是我正在使用的完整代码,在尝试解决这个问题时有点混乱.我正在检查底部的重现
// 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>↑ WEEKLY</strong><br />';
echo $recurring_event->day;
echo '</div>';
}
endforeach;
echo '</div>';
endforeach;
endif;
Run Code Online (Sandbox Code Playgroud)
我现在得到的结果(重复发生的事件)是
事件:每周祷告
日期:2013年2月1日
我想要的结果是
事件:每周祷告
日期:2013年2月1日
事件:每周祷告
日期:2013年2月8日
活动:每周祷告
日期:2013年2月15日
事件:每周祷告
日期:2013年2月22日
如果开始日期是2月1日,结束日期是2月28日,那就是这样.
tha*_*tah 11
一句忠告.
虽然从设计的角度来看,设计一个数据库来存储重复模式的"描述"是一种非常干净的方法,但是你可能会遇到很多问题.
我已经做了类似的方法一个项目前一阵子(我将查找数据库设计,并添加到我的答案),虽然我能够重现的确切日期/重复事件的时候,你会碰上在以下情况下出现问题; 大多数起源于此:
定期事件描述重复模式,因此实际(个别)事件不是数据库中的物理记录
一切都取决于你的系统的实际使用情况,但我想警告你我们遇到的问题.
这是'schedule'表的模式(包含重复发生的事件模式);
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;
Run Code Online (Sandbox Code Playgroud)
完全描述这些问题的解决方案在这里可能不合适,但这里有一些需要考虑的事情;
如本身所述存储重复发生的事件并非不好的做法.它完美地描述了事件发生的时间和频率.但是,实际事件缺乏物理记录是导致问题的原因.
在数据库/软件设计上投入时间,正确调查设计是否"适用"您想要实现的目标.测试它,尝试的东西,如果他们不工作,不要犹豫,"把它扔掉",往往更容易从头开始不是试图"修复"的东西.一个合适的设计需要花费时间,并可能需要几次"重新设计"才能使它正确,但它最终将为您节省时间和金钱.
希望这有帮助,祝你好运!