为什么SQL-服务器会为单个条目保存重复数据?

Why does SQL-Server save duplicate data for a single entry?

我在 php 中开发了一个基于 CRUD 的 Web 应用程序。这是一个表单,其输入数据保存在 sql 服务器数据库中。

即使用户填写一次,数据库也会为其保存多个条目。

问题似乎出在数据库中,因为表单已成功提交。

有人可以帮忙吗?

谢谢

代码如下:

<?php
ob_start();
require_once 'db-connect.php';
require_once 'email.php';        

if(isset($_POST['pEmail'])){
    $fName = filter_input(INPUT_POST, "fName") ? filter_input(INPUT_POST, 'fName') : null;
    $lName = filter_input(INPUT_POST, "lName")? filter_input(INPUT_POST, 'lName') : null;
    $mName = filter_input(INPUT_POST, "mName")? filter_input(INPUT_POST, 'mName') : null;
    $tempRace = filter_input(INPUT_POST, "race", FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
    $race = (is_array($tempRace)) ? implode(',', $tempRace) : null;
    $hEthnicity = filter_input(INPUT_POST, "hEthnicity") ? filter_input(INPUT_POST, 'hEthnicity') : null;
    $gender = filter_input(INPUT_POST, "gender") ? filter_input(INPUT_POST, 'gender') : null;
    $age = filter_input(INPUT_POST, "age") ? filter_input(INPUT_POST, 'age') : null;
    $education = filter_input(INPUT_POST, "education") ? filter_input(INPUT_POST, 'education') : null;
    $gpa = filter_input(INPUT_POST, "gpa") ? filter_input(INPUT_POST, 'gpa') : null;
    $hPhone = filter_input(INPUT_POST, "hPhone") ? filter_input(INPUT_POST, 'hPhone') : null;
    $cPhone = filter_input(INPUT_POST, "cPhone") ? filter_input(INPUT_POST, 'cPhone') : null;
    $pEmail = filter_input(INPUT_POST, "pEmail") ? filter_input(INPUT_POST, 'pEmail') : null;
    $aEmail = filter_input(INPUT_POST, "aEmail") ? filter_input(INPUT_POST, 'aEmail') : null;
    $inputAddress = filter_input(INPUT_POST, "inputAddress") ? filter_input(INPUT_POST, 'inputAddress') : null;
    $inputCity = filter_input(INPUT_POST, "inputCity") ? filter_input(INPUT_POST, 'inputCity') : null;

    $conn = DB::databaseConnection();
    $conn->beginTransaction();
    $sql = "INSERT INTO dbo.premedical ( FName,LName, MidInitial, Race, Ethnicity, Gender, Age, SchoolYear, Gpa, HPhone, CPhone, PEmail, AEmail, MailAddress, MailCity) VALUES 
            ( :fName,:lName, :mName, :race, :hEthnicity, :gender,:age, :education, :gpa, :hPhone, :cPhone, :pEmail, :aEmail, :inputAddress, :inputCity)";

    $q = $conn->prepare($sql);
    $q->execute(array($fName,  $lName, $mName, $race, $hEthnicity, $gender, $age,   $education, $gpa, $hPhone, $cPhone, $pEmail, $aEmail, $inputAddress, $inputCity));

    if ($q->execute()) {
        $conn->commit(); 

        if (Form::mailer($fName,  $lName, $mName, $race, $hEthnicity, $gender, $age,   $education, $gpa, $hPhone, $cPhone, $pEmail, $aEmail, $inputAddress, $inputCity)) {
            echo '
            <script >
                alert("Thank you for registration.");
            </script>';
        }

        return true; 
    } else {
        echo '
        <script>
            alert("Error, please try submitting again. Error code 1");
            window.history.back();
        </script>';
    }
}
?>

调用 $q->execute 会触发执行过程,即使您在逻辑检查中使用它也是如此 - 因此它会执行两次。您应该将其更新为:

<?php
ob_start();
require_once 'db-connect.php';
require_once 'email.php';        

if(isset($_POST['pEmail'])){
    $fName = filter_input(INPUT_POST, "fName") ? filter_input(INPUT_POST, 'fName') : null;
    $lName = filter_input(INPUT_POST, "lName")? filter_input(INPUT_POST, 'lName') : null;
    $mName = filter_input(INPUT_POST, "mName")? filter_input(INPUT_POST, 'mName') : null;
    $tempRace = filter_input(INPUT_POST, "race", FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
    $race = (is_array($tempRace)) ? implode(',', $tempRace) : null;
    $hEthnicity = filter_input(INPUT_POST, "hEthnicity") ? filter_input(INPUT_POST, 'hEthnicity') : null;
    $gender = filter_input(INPUT_POST, "gender") ? filter_input(INPUT_POST, 'gender') : null;
    $age = filter_input(INPUT_POST, "age") ? filter_input(INPUT_POST, 'age') : null;
    $education = filter_input(INPUT_POST, "education") ? filter_input(INPUT_POST, 'education') : null;
    $gpa = filter_input(INPUT_POST, "gpa") ? filter_input(INPUT_POST, 'gpa') : null;
    $hPhone = filter_input(INPUT_POST, "hPhone") ? filter_input(INPUT_POST, 'hPhone') : null;
    $cPhone = filter_input(INPUT_POST, "cPhone") ? filter_input(INPUT_POST, 'cPhone') : null;
    $pEmail = filter_input(INPUT_POST, "pEmail") ? filter_input(INPUT_POST, 'pEmail') : null;
    $aEmail = filter_input(INPUT_POST, "aEmail") ? filter_input(INPUT_POST, 'aEmail') : null;
    $inputAddress = filter_input(INPUT_POST, "inputAddress") ? filter_input(INPUT_POST, 'inputAddress') : null;
    $inputCity = filter_input(INPUT_POST, "inputCity") ? filter_input(INPUT_POST, 'inputCity') : null;

    $conn = DB::databaseConnection();
    $conn->beginTransaction();
    $sql = "INSERT INTO dbo.premedical ( FName,LName, MidInitial, Race, Ethnicity, Gender, Age, SchoolYear, Gpa, HPhone, CPhone, PEmail, AEmail, MailAddress, MailCity) VALUES 
            ( :fName,:lName, :mName, :race, :hEthnicity, :gender,:age, :education, :gpa, :hPhone, :cPhone, :pEmail, :aEmail, :inputAddress, :inputCity)";

    $q = $conn->prepare($sql);
    $result = $q->execute(array($fName,  $lName, $mName, $race, $hEthnicity, $gender, $age,   $education, $gpa, $hPhone, $cPhone, $pEmail, $aEmail, $inputAddress, $inputCity));

    if ($result) {
        $conn->commit(); 

        if (Form::mailer($fName,  $lName, $mName, $race, $hEthnicity, $gender, $age,   $education, $gpa, $hPhone, $cPhone, $pEmail, $aEmail, $inputAddress, $inputCity)) {
            echo '
            <script >
                alert("Thank you for registration.");
            </script>';
        }

        return true; 
    } else {
        echo '
        <script>
            alert("Error, please try submitting again. Error code 1");
            window.history.back();
        </script>';
    }
}
?>