为什么我的PHP/SQL生成重复的数据库条目?

1 php mysql forms sql-server

我对PHP很陌生,在SQL方面是一个绝对的初学者.我只是在学习基础知识而且我无法理解为什么每次提交表单时我的代码都会生成重复的条目,例如

Name: Joe Blogs Email: info@email.co.uk
Name: Joe Blogs Email: info@email.co.uk
Run Code Online (Sandbox Code Playgroud)

该数据库有一个名为user的表和两列,名称和电子邮件.

我的索引文件看起来像这样,它有一个简单的名称和电子邮件表单,并在submit上插入数据:

<form method="post" action="insert.php">
    <input name="name" type="text">
    <input name="email" type="email">
    <input type="submit" value="Submit Form">
</form>

<?php
$servername = "localhost";
$username = "DB_USER";
$password = "PASSWORD";
$dbname = "DB_NAME";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sqlout = "SELECT name, email FROM user";
$result = $conn->query($sqlout);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        echo "<b>Name:</b> " . $row["name"]. " <b>Email:</b> " . $row["email"]. "<br>";
    }
} else {
    echo "0 results";
}

$conn->close();
?>

<form method="post" action="wipe.php">
    <input type="submit" value="Wipe ALL Data">
</form>
Run Code Online (Sandbox Code Playgroud)

提交表单时调用此insert.php文件:

<?php
$servername = "localhost";
$username = "DB_USER";
$password = "PASSWORD";
$dbname = "DB_NAME";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "INSERT INTO user ( name, email ) VALUES ( '{$conn->real_escape_string($_POST['name'])}', '{$conn->real_escape_string($_POST['email'])}' )";
$insert = $conn->query($sql);

if ($conn->query($sql) === TRUE) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

$conn->close();
?>

<a href="index.php">Back</a>
Run Code Online (Sandbox Code Playgroud)

我可能犯了一些基本错误,但我不确定为什么要添加重复项.是否与每个文件中的数据库连接两次有关?有没有更好的方法只连接一次?或者它是由表单提交本身引起的?

Bar*_*chs 5

因为你打了query两次电话:

$insert = $conn->query($sql);

if ($conn->query($sql) === TRUE) {
Run Code Online (Sandbox Code Playgroud)

你应该重写为

$insert = $conn->query($sql);

if ($insert === TRUE) {
Run Code Online (Sandbox Code Playgroud)

此外,您应该使用预准备语句.