首页 > 解决方案 > 如何阻止 mysqli_query 添加缺少信息的记录?

问题描述

我有订阅者输入他们的电子邮件地址的表格,这将被发布到 mysql 数据库。问题是,如果您访问该页面,即使没有订阅,即使没有所需的电子邮件地址,也会将一条记录添加到数据库中。更糟糕的是,它似乎每三秒添加一次记录。我怎么能阻止这个?我的代码有问题吗。

<?php

$servername = "localhost";
$username = "root";
$password = "";
// create connection
$conn = mysqli_connect($servername, $username, $password);
// check connection
if (!$conn) {
    die("connection error: " . mysqli_connect_error());
}
echo "connected";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (empty($_POST['email'])) {
        $emailErr = "Email required";
    } else {
        $email = post_input($_POST['email']);
        $email = filter_var($email, FILTER_SANITIZE_EMAIL);
        if (!isset($emailErr)) {
            if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
                $emailErr = "Invalid email address";
            }
        }
    }
}
// function to clean email
function post_input($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}
// select correct database
mysqli_select_db($conn, "mailinglist");
// query to insert email
$sql = "INSERT INTO subscribers (email) VALUES ('" . $_POST['email'] ."')";
if (mysqli_query($conn, $sql)) {
    echo "Thank you for subscribing";
} else {
    echo "Error creating record: " . "<br>" . mysqli_error($conn);
}
header('location: index.php');
mysqli_close($conn);

标签: phpmysql

解决方案


只需检查 if 语句是否有可以保存的电子邮件并将保存到数据库的 if 语句如下所示:

<?php

$servername = "localhost";
$username = "root";
$password = "";
// create connection
$conn = mysqli_connect($servername, $username, $password);
// check connection
if (!$conn) {
    die("connection error: " . mysqli_connect_error());
}
echo "connected";

$emailErr = ''; //it is a good practice to initialize variable before its use.

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (empty($_POST['email'])) {
        $emailErr = "Email required";
    } else {
        $email = post_input($_POST['email']);
        $email = filter_var($email, FILTER_SANITIZE_EMAIL);
        if (!isset($emailErr)) {
            if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
                $emailErr = "Invalid email address";
            }
        }
    }
}
// function to clean email
function post_input($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}
// select correct database
mysqli_select_db($conn, "mailinglist");

//if you have an email in $email and there is no
//error in $emailErr
if(!empty($email) && empty($emailErr)) {

    //insert it to the db.

    //THIS IS INSECURE WAY - Check links in comments!

    // query to insert email
    $sql = "INSERT INTO subscribers (email) VALUES ('" . $_POST['email'] ."')";
    if (mysqli_query($conn, $sql)) {
        echo "Thank you for subscribing";
    } else {
        echo "Error creating record: " . "<br>" . mysqli_error($conn);
    }

}

mysqli_close($conn);
header('location: index.php');
exit();

推荐阅读