【发布时间】:2026-01-07 09:55:01
【问题描述】:
我创建了一个用于预订大学房间的页面。当工作人员要预订房间时,他/她需要去柜台并要求管理员/ PIC 预订房间。管理员需要填写所有详细信息,包括员工(请求者)电子邮件、目的、开始时间和结束时间。目前,如果时间与其他活动发生冲突,则无法进行预订。
当我插入错误的员工电子邮件(数据库中不存在该电子邮件)并提交表单时,它会给出这个错误
“INSERT 语句与 FOREIGN KEY 约束“FK__Booking__Request__619B8048”冲突。冲突发生在数据库“madb”、表“dbo.Staff”、列“Email”中。”
现在,当管理员在单击按钮提交后输入错误的员工电子邮件时,我想如何提醒管理员。
下面是我的 PHP 代码
<?php
if(isset($_POST['Submit'])) {
$Requested_by = $_POST['Requested_by'];
$date = $_POST['date'];
$timeFrom = $_POST['timeFrom'];
$timeTo = $_POST['timeTo'];
$Meeting_Description = $_POST['Meeting_Description'];
$Room_ID = $_POST['Room_ID'];
$Admin_email = $_POST['Admin_email'];
$Remark = $_POST['Remark'];
$Book_Status = $_POST['Book_Status'];
$StartTime = $date." ".$timeFrom;
$EndTime = $date." ".$timeTo;
$sql2 = "SELECT * FROM booking WHERE NOT (StartTime > :timeTo OR EndTime < :timeFrom)";
$query2 = $conn->prepare($sql2);
$query2->bindParam(':timeFrom',$StartTime,PDO::PARAM_STR);
$query2->bindParam(':timeTo',$EndTime,PDO::PARAM_STR);
$query2 -> execute();
$results = $query2 -> fetchAll(PDO::FETCH_OBJ);
if($query2->rowCount() == 0){
//insert data to database
$sql = "INSERT INTO booking(Requested_by, Book_Date, StartTime, EndTime, Meeting_Description, Room_ID, Admin_email, Remark, Book_Status)
VALUES(:Requested_by, GETDATE(), :StartTime, :EndTime, :Meeting_Description, :Room_ID, :Admin_email, :Remark, :Book_Status)";
$query = $conn->prepare($sql);
$query->bindparam(':Requested_by', $Requested_by);
$query->bindparam(':StartTime', $StartTime);
$query->bindparam(':EndTime', $EndTime);
$query->bindparam(':Meeting_Description', $Meeting_Description);
$query->bindparam(':Room_ID', $Room_ID);
$query->bindparam(':Admin_email', $Admin_email);
$query->bindparam(':Remark', $Remark);
$query->bindparam(':Book_Status', $Book_Status);
$query->execute();
if ($query2->rowCount() > 0){
header("Location:../dashboard/dashboard_admin.php");
} else {
echo "
<script>alert('Something wrong, please try again')</script>
<script>window.location = '../dashboard/dashboard_admin.php'</script>
";
}
} else {
echo "
<script>alert('The time range you are selected is conflicted with another meeting')</script>
<script>window.location = 'manual_booking.php'</script>
";
}
}
?>
【问题讨论】:
-
我只会从电子邮件所在的员工表中选择 id。如果行返回,一切都很好。如果不是,则返回错误。似乎比返回实际的数据库错误更友好。
-
@icecub 可以发一下答案吗
-
我不能。我不知道实际的 Staff 表结构,所以我的答案不起作用。您似乎在上面做得很好(尽管该脚本中有错误)所以应该不难做到?
-
对不起,那部分实际上是我的错,不是你的。无论如何,只需执行
SELECT id FROM Staff WHERE email = :email之类的操作。然后$query3->bindParam(':email', $Admin_email);。执行。然后if($query3->rowCount() > 0){ //Staff found } else { //error No staff } -
外键在该列中的值不能在被引用表的主键列中。这意味着电子邮件地址必须在您的主表中。所以要么删除外键,要么先在主表中输入,然后在预订中插入