Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lịch PHP với các sự kiện lặp lại từ cơ sở dữ liệu MySQL

Trong trường hợp có ai đó muốn làm điều gì đó tương tự, tôi sẽ đăng mã mà tôi đã viết và thử nghiệm trong vòng năm giờ qua.

Tôi quyết định chuyển hai bảng của mình thành ba bảng, chuyển tất cả các tùy chọn lặp lại sang bảng thứ ba:

'Churchcal_events' - có các trường bổ sung cho thông tin sự kiện mà tôi chưa đưa vào đây

+----+-----------+------------+------------+------------+-----------+
| 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' - định tuyến các sự kiện đến các lịch thích hợp (vì sẽ có lịch cho các phòng ban khác nhau trên toàn bộ trang web)

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

'Churchcal_recur_events' - Đây là các quy tắc cho sự lặp lại của từng sự kiện

+----------+-----------+------------+----------------+------------+-------------+-----------+
| 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      |
+----------+-----------+------------+----------------+------------+-------------+-----------+

Mã mới (PHP) - Đây là vòng lặp trong ngày

    //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);

          }

      }

    }

Nếu bạn không tạo điều này trong mô-đun Drupal như tôi, bạn có thể thay thế 'db_query ()' bằng hàm truy vấn cơ sở dữ liệu của riêng bạn như hàm mặc định của 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. THAM GIA với GROUP BY trong DB chuẩn hóa về Tài nguyên, Chủ đề và Chương

  2. Hỗ trợ các câu lệnh chuẩn bị phía máy chủ với PDO?

  3. Tự động điền quốc gia và thành phố từ mã zip và tùy chọn

  4. đặt hàng mysql theo vấn đề

  5. Làm cách nào để lưu trữ java.util.Date vào trường dấu thời gian MySQL trong múi giờ UTC / GMT?