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

时间:2015-10-23 10:22:02

标签: php mysql sql-server forms

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

Name: Joe Blogs Email: info@email.co.uk
Name: Joe Blogs Email: info@email.co.uk

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

我的索引文件如下所示,它有一个简单的名称和电子邮件表单,并在提交时插入数据:

<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>

提交表单时调用此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>

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

4 个答案:

答案 0 :(得分:5)

因为您拨打query两次:

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

if ($conn->query($sql) === TRUE) {

你应该重写为

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

if ($insert === TRUE) {

此外,您应该使用prepared statements

答案 1 :(得分:1)

您的代码两次致电$conn->query

$insert = $conn->query($sql);// first time 

if ($conn->query($sql) === TRUE) {// second time

答案 2 :(得分:1)

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

答案 3 :(得分:0)

你需要改变:

$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;
}

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

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