防止重复条目 sql php

prevent duplicate enteries sql php

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

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.";

}
}

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

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

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

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

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

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

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

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

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

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

先查询,如果user/email不存在,则执行INSERT。

假设您已经建立了 DB connection:(请参阅 "Establishing a 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 statements, or PDO with prepared statements

密码存储,使用CRYPT_BLOWFISH or PHP 5.5's password_hash()函数。

对于 PHP < 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());
}

只需将您的 table 电子邮件和用户名列的结构设置为 UNIQUE 那么一切都会好起来的。 如果您尝试插入重复数据 它不会插入并且 mysql_query 将 return false

创建 table...

CREATE TABLE table_name (
  column_name data_type(size) constraint_name
)

...您可以像这样使用 UNIQUE 约束:

CREATE TABLE table_name (
  column_name data_type(size) UNIQUE
)

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

单击 here 了解有关此约束的详细信息。