PHP Mysql查询不必要地插入数据两次

PHP Mysql查询不必要地插入数据两次,php,mysql,pdo,duplicates,Php,Mysql,Pdo,Duplicates,我面临的这个问题对我来说很不寻常。我实际上想做的是通过HTML表单将数据插入mysql数据库表。 我有一个数据库,我试图插入数据到它,但它总是显示“重复输入错误” 问题是,尽管检查了我输入的信息是否唯一,但它显示了该错误。当我检查数据库表时,我可以看到每次条目都将id增加2。我不知道为什么我的查询要插入两次数据,并使主键增加2,请帮助我希望一切正常 我修不好,请帮帮我 这是我的表单html代码 <form class="form-horizontal" name="RegisterC

我面临的这个问题对我来说很不寻常。我实际上想做的是通过HTML表单将数据插入mysql数据库表。

我有一个数据库,我试图插入数据到它,但它总是显示“重复输入错误”

问题是,尽管检查了我输入的信息是否唯一,但它显示了该错误。当我检查数据库表时,我可以看到每次条目都将id增加2。我不知道为什么我的查询要插入两次数据,并使主键增加2,请帮助我希望一切正常

我修不好,请帮帮我

这是我的表单html代码

<form class="form-horizontal" name="RegisterCandidate" action="../processors/process_register_candidate.php" method="post" enctype="application/x-www-form-urlencoded">
        <div class="form-group">
            <label for="Fname" class="control-label col-sm-4">
                First Name
            </label>
            <div class="col-sm-8">
                <input type="text" class="form-control" name="Fname" tabindex="1" autofocus required placeholder="First Name" />
            </div>
        </div>

        <div class="form-group">
            <label for="Lname" class="control-label col-sm-4">
                Last Name
            </label>
            <div class="col-sm-8">
                <input type="text" class="form-control" name="Lname" tabindex="2"  required placeholder="Last Name" />
            </div>
        </div>

        <div class="form-group">
            <label for="Photo" class="control-label col-sm-4">
                Photograph
            </label>
            <div class="col-sm-8">
                <input type="file" class="form-control" name="Photo" tabindex="3" placeholder="Select Photo" />
            </div>
        </div>
        <div class="form-group">
            <label for="DOB" class="control-label col-sm-4">
                Date of Birth (DD-MM-YYYY)
            </label>
            <div class="col-sm-8">
                <input type="date" class="form-control" name="dob" tabindex="4"  required />
            </div>
        </div>

        <div class="form-group">
            <label for="password" class="control-label col-sm-4">
                Password
            </label>
            <div class="col-sm-8">
                <input type="password" class="form-control" name="password" tabindex="5"  required placeholder="Password" />
            </div>
        </div>

        <div class="form-group">
            <label for="contact" class="control-label col-sm-4">
                Contact No.
            </label>
            <div class="col-sm-8">
                <input type="tel" class="form-control" name="contact" tabindex="6"  required placeholder="Contact Number" />
            </div>
        </div>
        <button type="submit" name="register" class="btn btn-success" style="float:right; margin-right:30%;">
            Register
        </button>
    </form>

名字
姓
照相
出生日期(年月日)
密码
联络电话。
登记
这是我的php mysql代码的副本

<?php
require_once "../web_config/web.config.php";

$conn = connect();

$fname = $_POST["Fname"];
$lname = $_POST["Lname"];
$dob = $_POST["dob"];
$password = $_POST["password"];
$contact = $_POST["contact"];

$insert = " INSERT INTO `candidates`
(
`Fname`,
`Lname`,
`dob`,
`password`,
`contact`
) VALUES (
'$fname',
'$lname',
'$dob',
'$password',
'$contact'
)
";
try{
    $st = $conn->query($insert);
    $st->execute();
} catch(PDOException $e) {
    echo "//Failed to insert data due to ".$e->getMessage();
}
echo $fname." ".$lname;
#header("Location:../src/student_login.php");

?>

在这段代码中,您正在执行$conn->query($insert);对于插入来说足够了$st只保存插入查询的结果,而不是准备好的语句
除去

在这段代码中,您正在执行$conn->query($insert);对于插入来说足够了$st只保存插入查询的结果,而不是准备好的语句 除去


所以,这里有一些问题

$conn->query
如前所述将直接运行代码,因此执行是多余的。但是,您对SQL注入非常开放,因此您应该绑定,如下面的示例所示:

$stmt = $this->conn->prepare("INSERT INTO `candidates`(`Fname`,`Lname`,`dob`,`password`,`contact`) VALUES (?,?,?,?,?)");
$stmt->execute([$fname,$lname,$dob,$password,$contact]);
另外,您不应该对这样的一般查询运行
try{}catch{}
(特别是如果您在实时环境中,因为每个人都能看到这样的问题,您自己也能看到)


另一方面,在未加密中添加密码也会给您带来安全问题。您应该看看如何使用
密码\u散列
文档:

因此,这里有一些问题

$conn->query
如前所述将直接运行代码,因此执行是多余的。但是,您对SQL注入非常开放,因此您应该绑定,如下面的示例所示:

$stmt = $this->conn->prepare("INSERT INTO `candidates`(`Fname`,`Lname`,`dob`,`password`,`contact`) VALUES (?,?,?,?,?)");
$stmt->execute([$fname,$lname,$dob,$password,$contact]);
另外,您不应该对这样的一般查询运行
try{}catch{}
(特别是如果您在实时环境中,因为每个人都能看到这样的问题,您自己也能看到)


另一方面,在未加密中添加密码也会给您带来安全问题。您应该看看如何使用
password\u hash
文档:

remove$st->execute();行并重试如果准备了语句,则使用执行,但查询直接运行sql。请阅读此文章您不是在实时环境中使用此代码,是吗?非常感谢。我的问题已解决。删除$st->execute();行并重试如果准备了语句,则使用执行,但查询直接运行sql。请阅读此文章您不是在实时环境中使用此代码,是吗?非常感谢。我的问题解决了。非常感谢你。。。我的问题已经解决了,也要感谢您对您提到的一些安全问题的建议。我肯定会指望他们。再次感谢。非常感谢你。。。我的问题已经解决了,也要感谢您对您提到的一些安全问题的建议。我肯定会指望他们。再次感谢。
$stmt = $this->conn->prepare("INSERT INTO `candidates`(`Fname`,`Lname`,`dob`,`password`,`contact`) VALUES (?,?,?,?,?)");
$stmt->execute([$fname,$lname,$dob,$password,$contact]);