防止重复条目sql php

时间:2015-01-14 21:03:24

标签: php sql duplicates

我正在研究数据库系统,我正在尝试避免重复输入电子邮件和用户名。我已经尝试但它仍然拒绝,但无法确切地看到被拒绝的内容。 谁能告诉我哪里错了?

if(isset($_POST['submit'])){
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];

 $sql="INSERT into users (username,password,email) VALUES('$username','$password','$email')";

 $result = mysql_query("INSERT INTO users VALUES ('duplicate')");

 if (!$result) {
echo "Enter a different value";
 } else {
echo "Save successful.";

}
}

4 个答案:

答案 0 :(得分:5)

我只是制定了这个答案,以便向您展示检查重复项和插入的基础知识。

您应该最终在给定列上设置UNIQUE约束,并根据错误结果使用条件语句。

请参阅下面有关安全性的脚注

Sidenote#1:如果您不想检查电子邮件和用户名是否存在,则可以删除OR Username= '".$username."'

Sidenote#2: - 我不确定您的列名是否为大小写,因此您可能需要做一些调整。

  • 电子邮件或电子邮件 - 密码或密码 - 用户名或用户名

Sidenote#2: - 确保所有元素都包含name属性,并确保表单确实使用POST方法。

首先查询,如果用户/电子邮件不存在,请执行INSERT。

这假设您已经建立了DB connection :(请参阅脚注下面的其他注释,"建立数据库连接" )。

if(isset($_POST['submit'])){

    $username = $_POST['username'];
    $password = $_POST['password'];
    $email = $_POST['email'];

$query = "SELECT * FROM users 
          where email='".$email."' 
          OR Username= '".$username."'";

$result = mysql_query($query);

    if(mysql_num_rows($result) > 0){
     echo "A record already exists."; 
     exit;
    }

else{
$insert = mysql_query("INSERT into users (email, Username, Password) 
                       VALUES ('".$email."','".$username."', '".$password."')");
}

if($insert){
    echo "Success";
    }

else{
    echo "There was an error " . mysql_error();
    }

mysql_close();

} // brace for if(isset($_POST['submit']))

您也可以替换

$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$email = mysql_real_escape_string($_POST['email']);

在开始使用预准备语句之前获得一些额外的安全性。


<强>脚注:

关于安全问题。

不要使用较旧的mysql_ API,也不应以纯文本格式存储密码。

使用mysqli with prepared statementsPDO with prepared statements

要进行密码存储,请使用CRYPT_BLOWFISH或PHP 5.5&#39 {s} password_hash()功能。

对于PHP&lt; 5.5使用password_hash() compatibility pack


将错误报告添加到文件的顶部,这有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:错误报告应仅在暂存时完成,而不是生产。


建立数据库连接:

即。来自mysql_select_db()的手册:

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
    die('Not connected : ' . mysql_error());
}

// make foo the current db
$db_selected = mysql_select_db('foo', $link);
if (!$db_selected) {
    die ('Can\'t use foo : ' . mysql_error());
}

答案 1 :(得分:0)

如果电子邮件和用户名列设置了UNIQUE KEY,请检查您的mysql表定义。没有此标志表仍然接受所有电子邮件和用户名。

如果发生了不好的事情,也要尝试获取信息。

if (!$result) {
    die('Invalid query: ' . mysql_error());
}

答案 2 :(得分:0)

只需将电子邮件和用户名的表列结构设置为UNIQUE即可 那一切都会好的。 如果您尝试插入重复数据 它不会插入,mysql_query将返回false

答案 3 :(得分:0)

创建表格时......

CREATE TABLE table_name (
  column_name data_type(size) constraint_name
)

...您可以使用UNIQUE约束,如下所示:

CREATE TABLE table_name (
  column_name data_type(size) UNIQUE
)

此约束不区分大小写,这意味着“ UsErNaMe ”和“用户名”被视为相同。

点击here了解有关此约束的更多信息。