【问题标题】:Alert and prevent data to save into database if the user's Email is does't exist in database如果数据库中不存在用户的电子邮件,则提醒并阻止数据保存到数据库中
【发布时间】: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-&gt;bindParam(':email', $Admin_email);。执行。然后if($query3-&gt;rowCount() &gt; 0){ //Staff found } else { //error No staff }
  • 外键在该列中的值不能在被引用表的主键列中。这意味着电子邮件地址必须在您的主表中。所以要么删除外键,要么先在主表中输入,然后在预订中插入

标签: php sql pdo


【解决方案1】:

外键在该列中的值不能不在被引用表的主键列中。这意味着电子邮件地址必须在您的主表中。所以要么删除一个外键,要么先在主表中输入一个条目,然后在预订中插入。

【讨论】:

    最近更新 更多