Я знаю, что это старый пост, но я тоже думал об этом.
Мне нравится, что люди могут использовать для этого несколько таблиц, но на самом деле все это можно сделать из одной таблицы.
Создать таблицу со следующими данными ...
event_title
event_text
event_image
and_other_fields_about_event
recur_code (text)
recur_mode (integer)
start_date (date)
end_date (date)
recur_end_date (date)
recur_mode может иметь три состояния -
0 = нет повторения
1 = повторение с датой окончания
2 = продолжается без даты окончания (например, если вы хотите добавить что-то вроде 1 января в качестве новогоднего дня)
recur_code будет хранить либо NULL, либо код в нем, если дата повторится. Код, который следует использовать, это код PHP DateInterval (т. Е. P1Y на 1 год или P3M (3 месяца) или P7D (7 дней) и т. Д.) - если вы хотите немного уменьшить данные, вы можете отрубить исходные данные. «P» и добавьте его позже, поскольку начальное «P» всегда будет «P», оно означает «Период», поэтому «Период 3 месяца», «Период 7 дней» и т. Д.
Затем, когда вы извлекаете данные из базы данных - вы извлекаете все данные с помощью следующих поисков
(end_date> = CURDATE ()) ИЛИ ((recur_mode = 1) И (recur_end_date> = CURDATE ())) ИЛИ (recur_mode = 2)
(обратите внимание, что это не правильный SQL - это просто базовый пример оператора or, который вам понадобится)
затем, как только вы получите данные, используйте PHP с циклом while и DateInterval для увеличения start_date, пока вы не перейдете к следующему повторному вхождению, а также убедитесь, что если для recur_mode установлено значение 1, дата начала не наступает после recur_end_date .
Все сделано в одной таблице - а также, если вы хотите, чтобы форма ввода содержала код, используйте скрытое поле со значением dateinterval, используя различные переключатели для выбора интервала, - затем используйте jQuery onchange для обновления скрытого значение с новыми значениями селектора.