我正在寻找帮助,因为我正在尝试创建一个测试预订系统,但每个人需要在特定的时间预订到特定的机器(笔记本电脑)。请参阅以下数据库:
为糟糕的形象道歉,但希望你能明白。我有数据库可以显示我预订的记录,但我想知道还剩下什么。
我目前有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=?
来调用特定的插槽。我肯定我错了,所以任何帮助都是很好的:)
编辑:
如果这对我有帮助的话
如你所见,紫色的按钮是活动的插槽,而较暗的是预定的。作为一个演示,我只能装下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
不允许这样做,我需要重复这个db查询10次才能使其工作。 最佳答案
你的方法需要修正:event_machine_time
表必须与event_machine
表相关。所以event_machine_time
表必须有一个字段名event_machine_id
。
之后,您不需要在event_booking
和event_machine
表之间建立直接关系,因为在上一步中可以从relation other relation中发现它。
最好从start_date
表中删除end_date
&event_information
字段,因为它们是相等的。必须插入一个新的event_date
字段来表示这两个值。
必须从start_time
表中删除end_time
和event_information
字段,因为它们可以从event_machine_time
表中与主表相关的位置发现,以保持数据集成。
最好将event_information
表包含在主booking_event
表中,因为这些表之间存在1:1的关系。
在你做了这些改变之后,你想做的一切都会变得非常简单。