检查预订系统中的空位

时间:2017-04-22 17:55:56

标签: php mysql pdo

我正在寻求帮助,因为我正在尝试创建一个测试预订系统,但每个人都需要在特定时间预订到特定的机器(笔记本电脑)。请看下面的数据库:

Database

为可怜的形象道歉,但希望你能得到这个想法。我有数据库向我显示已预订的记录,但我希望能够看到剩下的内容。

我目前有10台机器,每台机器有三个时隙,您可以更容易地看到这样:

****************************************************************
* Machine/Laptop *   Time Slot   *      Name      *     Test   *
****************************************************************
*                * 09:30 - 11:00 * John Adams     * English    *
*    Laptop 1    * 11:00 - 13:00 * Book Slot      * Free       *
*                * 13:00 - 14:00 * Raj Patel      * English    *
****************************************************************
*                * 09:00 - 12:00 * Joe King       * English    *
*    Laptop 2    * 11:00 - 13:00 * Andrew Lil     * Maths      *
*                * 13:00 - 12:00 * Book Slot      * Free       *
****************************************************************

现在我不知道如何使单个数据库查询工作,但是出于示例目的,这是一种非常脏的方法,这将涉及每次加载页面时检查数据库30次:

$sql = $dbconn->prepare('SELECT COUNT(*) AS `total` 
                          FROM event_booking 
                          INNER JOIN event_machine
                          ON event_booking.machine_id=event_machine.id
                          INNER JOIN event_machine_time
                          ON event_booking.machine_time_id=event_machine_time.id
                          WHERE information_id = '.$_GET["id"].' AND event_machine.id=1 AND event_machine_time.id=2');
    $sql->execute();
    $result = $sql->fetchObject();
    if ($result->total > 0) { echo 'Slot Booked'; } else { echo '<a href="booking.php">Book Slot</a>'; }

每次调用时,我都必须更改event_machine.id=? AND event_machine_time.id=?以调用特定的插槽。

我确定我接近这个错误所以任何帮助都会很棒:)

编辑:

如果它有助于继承我想要的东西 enter image description here

正如您所看到的那样,紫色按钮是活动插槽,而较暗的按钮是预订的。对于一个演示,我只能适应10台笔记本电脑中的5台,但你明白了。

以下是我用来调用所有事件预订的数据库查询。这显示了event_information事件中所有预订,然后我将fetchAll用于表格。但我不知道是否可以使用此查询的某些内容将预订ID转到时间段?

$Event_list = $dbconn->prepare('SELECT
                                  event_booking.id,
                                  event_booking.live,
                                  event_booking.confirmation_email,
                                  event_candidate.firstname,
                                  event_candidate.surname,
                                  event_candidate.email,
                                  event_information.type,
                                  event_machine.id AS machine_get_id,
                                  event_machine.name,
                                  event_machine_time.id AS machine_time_get_id,
                                  event_machine_time.start_time AS machine_start_time,
                                  event_machine_time.end_time AS machine_end_time
                                  FROM event_booking
                                  INNER JOIN event_candidate
                                  ON event_booking.candidate_id=event_candidate.id
                                  INNER JOIN event_information
                                  ON event_booking.information_id=event_information.id
                                  INNER JOIN event_machine
                                  ON event_booking.machine_id=event_machine.id
                                  INNER JOIN event_machine_time
                                  ON event_booking.machine_time_id=event_machine_time.id
                                  WHERE information_id = ?'); 
    $Event_list->execute(array($_GET["id"]));

另一个编辑:

另一种选择是废弃event_machine并在machine_name中添加名为event_machine_time的列,然后使用以下内容:

$Event_Times = $dbconn->query('SELECT *
                                   FROM event_machine_time
                                   LEFT JOIN event_booking
                                   ON event_machine_time.id=event_booking.machine_time_id
                                   '); 

在表格中使用:

<td>
        <?php foreach ($Event_Times->fetchAll() as $Event_Times_Row) { ?>
            <?php if($Event_Times_Row["machine_name"] == "Laptop 1") { ?>
            <a class="button<?php if($Event_Times_Row["information_id"] == $_GET["id"]) { echo " button-disabled"; } ?>" href="#"><?php echo date("G:i", strtotime($Event_Times_Row["start_time"])); ?></a>
        <?php } } ?>
</td>

但是我需要打电话10次,我不认为fetchAll允许这样做,我需要重复这个数据库查询10次以使其正常工作。

2 个答案:

答案 0 :(得分:1)

您的方法需要一些更正:

  1. event_machine_time表必须与event_machine表相关。因此event_machine_time表格必须包含字段名称event_machine_id

  2. 之后,您不需要event_bookingevent_machine表之间的直接关系,因为它可以从上一步中的其他关系中找到。

  3. 最好放弃start_date&amp;来自end_date表的event_information个字段,因为它们是相同的。您必须插入代表两者的新字段event_date

  4. 您必须从start_time表中删除end_timeevent_information个字段,因为它们可以从event_machine_time表中与主表相关联,以维护数据集成

  5. 最好在主event_information表中包含booking_event表,因为这些表之间存在一对一的关系。

  6. 进行这些更改后,您想要做的事情将变得非常简单。

答案 1 :(得分:0)

谢谢大家的帮助,但这是我得出的结论:

我通过删除event_machine表来修改我的数据库,如下所示: Database 2

event_booking表中,我添加了一个名为machine_name的列,并使用相同的笔记本电脑名称制作了三个条目,但时间不同,例如。

****************************************
* machine_name * start_time * end_time *
****************************************
* Laptop 1     * 09:30      * 11:00    *
* Laptop 1     * 11:30      * 13:00    *
* Laptop 1     * 13:30      * 15:00    *
* Laptop 2     * 09:30      * 11:00    *
* Laptop 2     * 11:30      * 13:00    *
* Laptop 2     * 13:30      * 15:00    *
****************************************

使用此我然后使用以下数据库关系,我作为fetchAll()循环运行:

$Event_Times = $dbconn->query('SELECT *
                                   FROM event_machine_time
                                   LEFT JOIN event_booking
                                   ON event_machine_time.id=event_booking.machine_time_id
                                   ORDER BY start_time
                                   ');
$Event_Times_Loop = $Event_Times->fetchAll(PDO::FETCH_ASSOC);

然后我在HTML表格中运行循环10次(照片中显示7):

<td>
    <?php foreach ($Event_Times_Loop as $Event_Times_Row) { ?>
    <?php if($Event_Times_Row["machine_name"] == "Laptop 1") { ?>
    <a class="button<?php if($Event_Times_Row["information_id"] == $_GET["id"]) { echo " button-disabled"; } ?>" href="#"><?php echo date("G:i", strtotime($Event_Times_Row["start_time"])); ?></a>
    <?php } } ?>
</td>   

Screenshot

因此,使用一些CSS来禁用某人已经预订的按钮似乎工作得非常好。最有可能是一个更好,更清洁的解决方案,但至少我有一些有用的东西。也为我的术语道歉我也确定我也错了:)

感谢您的帮助!