Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Kalendarz PHP z powtarzającymi się wydarzeniami z bazy danych MySQL

Jeśli ktoś chciałby zrobić coś podobnego, opublikuję kod, który napisałem i przetestowałem w ciągu ostatnich pięciu godzin.

Postanowiłem przekonwertować moje dwa stoły na trzy, przenosząc wszystkie powtarzające się opcje do trzeciego stołu:

'wydarzenia_kościelne' - są dodatkowe pola na informacje o wydarzeniu, których tutaj nie umieściłem

+----+-----------+------------+------------+------------+-----------+
| id | name      | date       | starttime  | endtime    | recurring |
+----+-----------+------------+------------+------------+-----------+
| 1  | Event 1   | 2013-04-01 | 10:30:00   | 12:00:00   | 0         |
| 2  | Event 2   |            | 14:00:00   | 15:00:00   | 1         |
| 3  | Event 3   |            | 09:00:00   |            | 1         |
| 4  | Event 4   |            | 19:00:00   | 21:00:00   | 1         |
+----+-----------+------------+------------+------------+-----------+

'churchcal_assign' - kieruje wydarzenia do odpowiednich kalendarzy (ponieważ w witrynie będą kalendarze dla różnych działów)

+----------+-------------+
| event_id | calendar_id | 
+----------+-------------+
| 1        | 1           |
| 2        | 1           |
| 3        | 1           |
| 4        | 1           |
+----------+-------------+

'churchcal_recur_events' - Oto zasady powtarzania każdego wydarzenia

+----------+-----------+------------+----------------+------------+-------------+-----------+
| event_id | frequency | recur_type | recur_day_num  | recur_day  | recur_start | recur_end |
+----------+-----------+------------+----------------+------------+-------------+-----------+
| 2        | 1         | Week       | NULL           | Sunday     | NULL        | NULL      |
| 3        | 2         | Week       | NULL           | Wednesday  | 2013-04-01  | NULL      |
| 4        | 2         | Month      | third          | Friday     | 2013-04-01  | NULL      |
+----------+-----------+------------+----------------+------------+-------------+-----------+

Nowy kod (PHP) - To jest w pętli dziennej

    //query all events
    $get_events = db_query("SELECT * FROM {churchcal_events ce, churchcal_recur_events cre}
    WHERE (MONTH(ce.date) = :month AND YEAR(ce.date) = :year AND DAY(ce.date) = :day) OR
    (ce.id = cre.event_id AND ce.recurring = :recur AND cre.recur_day = :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) {

        //one-time events
        if(($event->recurring != '1') && ($single_event_id != $event->id)) {
          $calendar .= calendar_event($event->id, $event->name, $event->starttime);
          $single_event_id = $event->id;
          //$calendar .= $single_event_id;
        }

          //monthly recurring events
          if(($event->recur_type == 'Month') && ($event->recurring == '1')
          //day is on or before end date
          && (($event->recur_end >= date('Y-m-d', strtotime($month . '/' . $list_day . '/' . $year))) || ($event->recur_end == '0000-00-00') || ($event->recur_end == NULL))
          //day is on or after start date
          && (($event->recur_start <= date('Y-m-d', strtotime($month . '/' . $list_day . '/' . $year))) || ($event->recur_start == '0000-00-00') || ($event->recur_start == NULL))
          //day is equal to date of recurrence, i.e. first friday, third monday, etc
          && ($year . date('m', strtotime($year . '/' . $month . '/' . $list_day)) . $list_day == date('Ymj', strtotime($event->recur_day_num . ' ' . $event->recur_day . ' of ' . date('F', strtotime($month . '/' . $list_day . '/' . $year)) . ' ' . $year)))
          //day is in agreement with month frequency, i.e. every month, every other, etc. from start date
          && ($month % $event->frequency == date('m', strtotime($event->recur_start)) % $event->frequency)) {
            $calendar .= calendar_event($event->id, $event->name, $event->starttime);
          }


          //weekly recurring events
          if(($event->recur_type == 'Week') && ($event->recurring == '1')
          //day is on or before end date
          && (($event->recur_end >= date('Y-m-d', strtotime($month . '/' . $list_day . '/' . $year))) || ($event->recur_end == '0000-00-00') || ($event->recur_end == NULL))
          //day is on or after start date
          && (($event->recur_start <= date('Y-m-d', strtotime($month . '/' . $list_day . '/' . $year))) || ($event->recur_start == '0000-00-00') || ($event->recur_start == NULL))
          //day is in agreement with week frequency, i.e. every week, every other, etc. from start date
          && (date('W', strtotime($month . '/' . $list_day . '/' . $year)) % $event->frequency == date('W', strtotime($event->recur_start)) % $event->frequency)) {

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

          }

      }

    }

Jeśli nie tworzysz tego w module Drupal, tak jak ja, możesz zastąpić 'db_query()' własną funkcją zapytania do bazy danych, taką jak domyślna funkcja PHP 'mysql_query()';




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Node.js i mysql Callback :zapytanie w zapytaniu callback

  2. Równoczesne aktualizacje MySQL

  3. Java+Tomcat, Umierające połączenie z bazą danych?

  4. Funkcja MySQL TRUNCATE() – Obcina liczbę do określonej liczby miejsc dziesiętnych

  5. Jaki jest kanoniczny sposób pobrania rekordu z bazy danych MySQL, który ma najmniejsze/największe pole?