php - 检查预订系统中的空闲时段

标签 php mysql pdo

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

Database

为糟糕的形象道歉,但希望你明白了。我有数据库显示我的预订记录,但我希望能够看到还剩下什么。

我目前有 10 台机器,每台机器都有 3 个时隙,这样你更容易想象:

****************************************************************
* 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 次才能使其正常工作。

最佳答案

您的方法需要一些修正:

  1. event_machine_time 表必须与 event_machine 表相关。所以 event_machine_time 表必须有一个字段名 event_machine_id

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

  3. 最好从 event_information 表中删除 start_dateend_date 字段,因为它们是相等的。您必须插入一个新的 event_date 代表它们。

  4. 您必须从 event_information 表中删除 start_timeend_time 字段,因为它们可以从 event_machine_time 中发现> 与主表关联的表以保持数据集成。

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

完成这些更改后,您想做的一切都会变得非常简单。

关于php - 检查预订系统中的空闲时段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43562641/

相关文章:

php - 在 php 中获取唯一的命中数

php - 如何在 Laravel 中使用 PDO 进行 block 更新

php - 我可以在 PHP 中混合使用 MySQL API 吗?

php - 为什么我无法运行此查询?

mysql - 如何在多对一关系上使用 DELETE ON CASCADE

php - mysql选择两个表并使用 "or"变得非常慢

php - MySQL 和 PHP 日期和时间

php - 如何使用 php 验证输入字段

php - MySQL 数据库结构 - 存储 Facebook FQL 结果

php - 如何生成HTML文件取决于数组长度php