PHP calendrier avec les événements récurrents à partir de bases de données MySQL

Mise à JOUR:
Ci-dessous est ma question d'origine. Voir ma réponse pour voir comment je l'ai résolu.


Je suis en train de remplir mon agenda avec les événements de base de données MySQL table 'churchcal_events'. Je pourrais avoir l'un des événements en temps pour les dates et les événements récurrents qui peuvent être définies pour Chaque lundi, Chaque jeudi, ou Tous les Mois sur un vendredi.

Des événements ponctuels sont pas un problème. Et événements hebdomadaires de travail (chaque semaine, tous les autres). Mais un chaque mois de l'événement montre que sur le premier mois, pas sur le mois suivant.

churchcal_events table - à l'exclusion des domaines qui ne sont pas importantes à cette question

+----+----------------+------------+-----------+------------+------------+
| id | name           | recurring  | frequency | recur_type | recur_day  |
+----+----------------+------------+-----------+------------+------------+
| 1  | Test Weekly    | 1          | 1         | W          | Sunday     |
| 2  | Test Bi-Weekly | 1          | 2         | W          | Monday     |
| 3  | Test Monthly   | 1          | 1         | M          | Friday     |
+----+----------------+------------+-----------+------------+------------+

code php - à l'intérieur d'une boucle pour chaque jour du mois

//query all events
    $get_events = db_query("SELECT * FROM {churchcal_events}
    WHERE (MONTH(date) = :month AND YEAR(date) = :year AND DAY(date) = :day) OR
    (recurring = :recur AND recur_day LIKE :calendar_day)
    ORDER BY starttime",
    array(
      ':month' => $month,
      ':year' => $year,
      ':day' => $list_day,
      ':recur' => '1',
      ':calendar_day' => '%' . date('l', strtotime($month . '/' . $list_day . '/' . $year)) . '%',
    ));

    foreach($get_events as $event) {

      //see if events belong to this calendar
      $calendar_assign = db_query("SELECT * FROM {churchcal_assign} WHERE event_id = :event_id AND calendar_id = :cal_id",
      array(
        ':event_id' => $event->id,
        ':cal_id' => $cal_id,
      ));

      if($calendar_assign->rowCount() > 0) {

        //if recurring, see if event should be on this day
        if($event->recurring == '1') {

          $recur_day = $event->recur_day;
          $recur_freq = $event->frequency;
          $recur_type = $event->recur_type;

          $recur_start = new DateTime(date('Y-m-d', strtotime($event->recur_start)));
          $recur_end = new DateTime(date('Y-m-d', strtotime($event->recur_end)));

          $recur_start->modify($recur_day);

          $recur_interval = new DateInterval("P{$recur_freq}{$recur_type}");
          $recur_period = new DatePeriod($recur_start, $recur_interval, $recur_end);

          foreach($recur_period as $recur_date) {

            if($recur_date->format('Ymd') == date('Ymd', strtotime($month . '/' . $list_day . '/' . $year))) {

              $calendar .= calendar_event($event-id, $event->name, $event->starttime);

            }

          }

        }

Comment puis-je faire ID '3' à partir de l'exemple churchcal_events tableau montrent le premier vendredi de chaque mois?

Quel est votre db_query() la fonction?
c'est le Drupal 7 db_query() de la fonction.
Avez-vous vérifié vos valeurs pour les variables comme recur_period? Aussi à Partir de PHP doc: Dates dans le m/d/y ou d-mes formats sont analysées en regardant le séparateur entre les différents composants: si le séparateur est un slash (/), puis l'Américain m/d/y est supposé; que, si le séparateur est un tiret (-) ou un point (.), puis Européennes d-mon format est pris en charge. Pour éviter l'ambiguïté, il est préférable d'utiliser le format ISO 8601 (AAAA-MM-JJ) date ou DateTime::createFromFormat() lorsque cela est possible.
Aussi, je voudrais vérifier la date et l'heure sur le serveur qui exécute PHP. Parfois, vous pouvez obtenir des résultats inattendus lorsque le serveur de temps est différent de ce que vous pensez que c'est...
Les dates sont correctes comme ça.

OriginalL'auteur nitsuj | 2013-04-01