防止将重复数据输入mysql数据库

时间:2013-11-19 20:30:57

标签: php mysql

我正在尝试让我的电子邮件订阅服务拒绝我的数据库中已存在的电子邮件,因此用户不会订阅相同的电子邮件两次。这就是我所拥有但不起作用的任何想法?

<?php 
    if(!isset($_POST['submit'])) 
        exit();

    $vars = array('email');
    $verified = TRUE;
    foreach($vars as $v) {
        if(!isset($_POST[$v]) || empty($_POST[$v])) {
            $verified = FALSE;
        }
    }   
    if(!$verified) {
        echo "<p style='color:white; margin-top:25px;'>*Email required*</p>";
        exit();
    }
    $email = $_POST['email'];
    if($_POST['submit']) echo "<p style='color:white; margin-top:25px;'>*Check your inbox*        </p>";

    // Create connection
    $con=mysqli_connect("mysql.host","user","password","dbname");

    // Check connection
    if (mysqli_connect_errno($con))
    {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }

    $sql="INSERT INTO emails (email)    VALUES  ('$_POST[email]')";
    if (!mysqli_query($con,$sql))
    {
        die('Error: ' . mysqli_error($con));
    }

    $query = mysql_query("SELECT * FROM emails WHERE email='$email'",($con));
    if(mysql_num_rows($query) != 1)
    {
        echo "email already exists";
        // redirect back to form and populate with 
        // data that has already been entered by the user
    }


    mysqli_close($con);
?>

7 个答案:

答案 0 :(得分:2)

让MySQL拒绝重复电子邮件地址的最简单方法是使字段唯一(http://www.w3schools.com/sql/sql_unique.asp

ALTER TABLE emails ADD UNIQUE (email)

但是,MySQL不会返回警告

答案 1 :(得分:1)

使用mysqli_num_rows($query)代替mysql_num_rows($query)

       $query = mysqli_query($con, "SELECT * FROM emails WHERE email='".$email."'");

        if(mysqli_num_rows($query) > 0){

            echo "email already exists";
        }else{
            $sql="INSERT INTO emails (email)    VALUES  ('".$_POST[email]."')";
            if (!mysqli_query($con,$sql))
            {
                die('Error: ' . mysqli_error($con));
            }
        }

答案 2 :(得分:1)

如其他答案所述,你混合了mysqli和mysql函数。

例如,在这两行中你使用mysql而不是mysqli函数。

$query = mysql_query("SELECT * FROM emails WHERE email='$email'",($con));
if(mysql_num_rows($query) != 1)

我还认为您的代码很容易SQL注入。

您在插入查询中使用$ _POST [“email”],而不对其进行清理。

至少查看sql injection wikipedia page

答案 3 :(得分:1)

首先,您将MySQLi_MySQL_混合,因此坚持使用MySQLi_并相应地修改其余代码。

这是我在脚本中使用的逻辑,使用?代替'$email'

$query = $con->query("SELECT * FROM emails WHERE email=?");
// $query = $con->query("SELECT email FROM emails WHERE email=?");
// you may need to use that one --^ if checking a particular column

$numrows=mysqli_num_rows($query);

if($numrows > 0){
die("Email already exists in the database, please try again.");
}

您可以使用此方法绑定参数。假设您的列名为email

$query = "SELECT email FROM emails WHERE email=?";

if ($stmt = $con->prepare($query)){

        $stmt->bind_param("s", $email);

        if($stmt->execute()){
            $stmt->store_result();

            $email_check= "";         
            $stmt->bind_result($email_check);
            $stmt->fetch();

            if ($stmt->num_rows == 1){

            echo "That Email already exists.";
            exit;

            }
        }
    }

答案 4 :(得分:0)

除了混合mysql和mysli

之外

使用&gt;不!=

if(mysqli_num_rows($query) > 1)

但这种方法意味着你已经有了重复。

在电子邮件列中添加唯一索引后

Maybe this will help

答案 5 :(得分:0)

我的回答如下,

首先,创建电子邮件列的UNIQUE KEY,然后:

INSERT INTO `table` VALUES (/*etc*/) ON DUPLICATE KEY UPDATE /*set a column equal to itself*/

这允许您尝试插入数据库,并且可以选择查询是否抛出错误。如果您希望它抛出错误,那么就不要使用ON DUPLICATE KEY,然后捕获从查询中抛出的SQLException并告诉用户该电子邮件已经存在。

答案 6 :(得分:0)

向电子邮件列添加唯一约束。

测试插入或更新时返回的错误。我相信如果代码是主键,外键,索引的唯一约束,则可能会影响代码。

使用PHP,您可以使用

if( mysql_errno() == X) {
    // Duplicate VALUE
} else {
    // fail
}

您可以使用重复的电子邮件或here are the mysql_errNo return values

自行测试

对于非PHP,要确定正确的错误代码,请使用重复的电子邮件自行测试,或者查看以下内容。

MySQL Errors