通过比较时间和地点来避免事件的冲突


Avoiding clashing of events by comparing their time and venues

这对你们中的一些人来说可能很容易,但对我来说这是一个很大的障碍:我想做的是通过比较日期和地点来确保两个事件不会发生冲突。这是我到目前为止所做的:

<?php
    require_once (LIB_PATH.DS.'database.php');
    require_once ('../includes/initialize.php');
    class Event extends DatabaseObject {
        protected static $table_name="event_tbl";
        protected static $db_fields = array('id', 'visible', 'event_title', 'start_date', 'end_date', 'start_time', 'end_time', 'venue', 'event_type', 'event_description', 'event_program', 'reminder_date', 'reminder_time');
        public $id;
        public $event_title;
        public $start_date;
        public $end_date;
        public $start_time;
        public $end_time;
        public $venue;
        public $event_type;
        public $event_description;
        public $event_program;
        public $visible;        
        public $reminder_date;
        public $reminder_time;

        public function avoid_clash($time1, $time2, $database_venue, $time3, $time4, $venues) {
        $timeStart = strtotime("{$time1}");
        $timeEnd   = strtotime("{$time2}");
        $time      = strtotime("{$time3}") - strtotime("{$time4}");
        if ($result =($time > $timeStart && $time < $timeEnd) && $database_venue==$venues) {
            $session->message('Warning: This event clashes with another!');
            redirect_to('event_management.php');
        }
    } 
    }

    /*function process_avoid_clash($time1, $time2, $time3, $time4, $venues) {
        $event = self::find_from_event();
        $row = fetch_array($event);
        foreach ($row as $rows) {
            $time1 = $rows['start_date']." ".$rows['start_time'];
            $time2 = $rows['end_date']." ".$rows['end_time'];
            $database_venue = $rows['venue'];
            if ($time1 && $time2 && $database_venue) {
                avoid_clash($time1, $time2, $time3, $time4, $venues);
            } else {
                 die("find_from_event failed!");
            }
        }
    }*/

?>

然后,这就是我如何使用表单来测试它的方式,该表单在提交时会在两个事件冲突时提醒用户:

<?php
    require_once ('../includes/initialize.php');

    if(!$session->is_logged_in()) {
        redirect_to("login.php");
    }
?>
<?php
    if (isset($_POST['submit'])) {
        $event = new Event();
        $even = Event::find_public();
                $time3  = $_POST['start_date']." ".$_POST['start_time'];
                $time4  = $_POST['end_date']." ".$_POST['end_time'];
                $venues = $_POST['venue'];
         foreach($even as $events):
                $time1  = $events->start_date." ".$events->start_time;
                $time2  = $events->end_date." ".$events->end_time;
                $database_venue = $events->venue;
                if ($time1 && $time2 && $database_venue) {
                 $event->avoid_clash($time1, $time2, $database_venue, $time3, $time4, $venues);
                }       
                endforeach; 

        $event-> event_title       = $_POST['event_title'];
        $event-> start_date        = $_POST['start_date'];
        $event-> end_date          = $_POST['end_date'];
        $event-> start_time        = $_POST['start_time'];
        $event-> end_time          = $_POST['end_time'];
        $event-> venue             = $_POST['venue'];
        $event-> event_type        = $_POST['event_type'];
        $event-> event_description = $_POST['event_description'];
        $event-> event_program     = $_POST['event_program'];
        $event-> visible           = $_POST['visible'];
        $event-> reminder_date     = $_POST['reminder_date'];
        $event-> reminder_time     = $_POST['reminder_time'];
        $event->create();
        $session->message('Event successfully created!');
        redirect_to('event_management.php');

    }

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252" />
<title>New Event</title>
<link rel="stylesheet" type="text/css" href="../anytime/anytime.css"/>
<script src="../anytime/jquery.min.js"></script>
<script src="../anytime/jquery-migrate-1.0.0.js"></script>
<script src="../anytime/anytime.js"></script>
<link href="../assets/css/test_project.css" rel="stylesheet" type="text/css" />
<link href="../assets/css/links.css" rel="stylesheet" type="text/css" media="screen" />
</head>

<body>
<div id="container">
  <div id="header">
    <div class="logo"></div>
    <div class="menu">
   <div id="navcontainer">
        <ul id="navlist">
        </ul>
   </div>
 <br class="clear"/>
   </div>
    <br class="clear"/>
  </div> 
<div id="wrapper">
    <div id="sidebar1"> 
    <p><?php echo output_message($message); ?></p>
      <form id="form1" name="form1" method="post" action="new_event.php">
        <table width="578" height="322" border="0" cellpadding="0">
          <tr>
            <td colspan="3" align="right" valign="top">Event Title:</td>
            <td colspan="5" align="left" valign="top"><input type="text" name="event_title" /></td>
          </tr>
          <tr>
             <td width="3" align="center" valign="top">&nbsp;</td>
            <td width="89" align="center" valign="top"><input name="start_date" type="text" size="14" id="start_date" value="START DATE"/></td>
            <td width="60" align="center" valign="top"><input name="start_time" type="text" size="8" id="start_time" value="TIME"/></td>
            <script>
                AnyTime.picker("start_date",
                {format: "%Y-%c-%e"});
                $("#start_time").AnyTime_picker(
                { format: "%H:%i", LabelTitle: "Time",
                labelHour: "Hour", labelMinute: "Minute" });
            </script>
            <td width="54" align="center" valign="top"><strong>TO</strong></td>
            <td width="71" align="center" valign="top"><input name="end_date" type="text" size="14" id="end_date" value="END DATE"/></td>
            <td width="74" align="center" valign="top"><input name="end_time" type="text" size="8" id="end_time" value="TIME"/></td>
            <script>
                AnyTime.picker("end_date",
                {format: "%Y-%c-%e"});
                $("#end_time").AnyTime_picker(
                { format: "%H:%i", LabelTitle: "Time",
                labelHour: "Hour", labelMinute: "Minute" });
            </script>
            <td width="67" align="center" valign="top">&nbsp;</td>
            <td width="142" align="center" valign="top">&nbsp;</td>
          </tr>
          <tr>
            <td colspan="3" align="right" valign="top">Venue:</td>
            <td colspan="5" align="left" valign="top"><input type="text" name="venue" /></td>
          </tr>
          <tr>
            <td colspan="3" align="right" valign="top">Event Type:</td>
            <td colspan="5" align="left" valign="top"><input type="text" name="event_type" /></td>
          </tr>
          <tr>
            <td height="59" colspan="3" align="right" valign="top">Event Description:</td>
            <td colspan="5" align="left" valign="top"><textarea name="event_description"></textarea></td>
          </tr>
          <tr>
            <td height="51" colspan="3" align="right" valign="top">Event Program: </td>
            <td colspan="5" align="left" valign="top"><textarea name="event_program"></textarea></td>
          </tr>
          <tr>
            <td height="24" colspan="3" align="right" valign="top">Visible:</td>
            <td colspan="5" align="left" valign="top"><input name="visible" type="radio" value="0" />
            No &nbsp;
            <input name="visible" type="radio" value="1" />
            Yes</td>
          </tr>
          <tr>
            <td height="40" colspan="3" align="right" valign="top">Reminder:</td>
            <td align="left" valign="top">
              <input name="reminder_date" type="text" size="10" id="reminder_date" /> </td>
            <td align="left" valign="top">
              <input name="reminder_time" type="text" size="10" id="reminder_time"/></td>
            <script>
                AnyTime.picker("reminder_date",
                {format: "%Y-%c-%e"});
                $("#reminder_time").AnyTime_picker(
                { format: "%H:%i", LabelTitle: "Time",
                labelHour: "Hour", labelMinute: "Minute" });
            </script>             
            <td align="left" valign="top">&nbsp;</td>
            <td align="left" valign="top">&nbsp;</td>
          </tr>
          <tr>
            <td height="40" colspan="3" align="right" valign="top"><input type="submit" name="submit" value="Create Event" /></td>
            <td height="40" align="left" valign="top"> <input name="New" type="button" id="New" value="Cancel" onclick="location.href='event_management.php'"/></td>
          </tr>
        </table>
      </form> 
       </div>
  <?php include_layout_template('footer.php'); ?>

欢迎任何信息或建议。

我的建议是将这个问题推到您的数据库中。例如,PostgreSQL对这类问题有很好的支持,如这篇博文所述:

12月7日,汤姆·莱恩(Tom Lane)提交了杰夫·戴维斯(Jeff Davis)的补丁,增加了一般排除约束: 日志消息: 添加排除约束,将唯一性概念推广到 支持任何可索引的交换运算符,而不仅仅是相等。 两行 违反排除约束,如果"row1.col OP row2.col"为 TRUE 约束中的每一列...。例如,这可以用于确保给定的房间在任何给定时间点仅由 1 个用户预订。

以及一个方便的"临时"扩展(请参阅此处查看PgCon 2012的幻灯片,讨论其一些功能)。