用php防止Mysql中的重复数据

分享于2022年07月17日 mysql pdo php 问答
【问题标题】:用php防止Mysql中的重复数据(Prevent duplicate data in Mysql with php)
【发布时间】:2022-01-25 02:59:29
【问题描述】:

我创建了一个与mysql连接的简单注册表

html代码:




    
    
    
    Document
    


    
    



mysql : dbname = final 表是=学生

在学生表中,我有列(用户名),我将其设置为 UNIQUE,

在 php 代码中我建立连接:

    exec("insert into students(username,password,age)
                        values('$username','$password','$age')"); 
                                                                                        

}

catch(PDOExeption $e){

    echo "error in data send";

}
         

}

}

?>

现在,我想检查一下,如果用户输入了列(用户名)中已经存在的重复名称,它会阻止向数据库发送数据并给用户错误消息

提前致谢

  • 您应该查阅教程或手册。您可以使用此代码进行 SQL 注入。如果您检查 $sendvalues 错误代码,您可以查看它是重复错误还是其他错误。或者,您可以发送 AJAX 检查,然后在注册之前告诉用户它已经存在。尽管可以识别所有用户名,但这将允许暴力攻击。
  • 谢谢 user3783243 我还没学过 AJAX 或 php 注入
  • 在 INSERT 之前,执行 SELECT 以查看用户名是否存在。
  • 我想检查一下,如果用户输入了列(用户名)中已经存在的重复名称,它会阻止向数据库发送数据并给用户错误消息 没有意义.现在您发送 1 个查询并查看名称是否重复。在您想要进行的情况下,您将发送 1 个查询(并查看名称是否重复)或 2 个查询。您想从哪里获利?
  • 旁注:不要使用字符串插值或连接将值获取到 SQL 查询中。这很容易出错,并且可能使您的程序容易受到 SQL 注入攻击。使用参数化查询。见 "How to include a PHP variable inside a MySQL statement" "How can I prevent SQL injection in PHP?"

【解决方案1】:

您可以继续使用 insert into ,如果在执行这样的查询时发生错误,请捕获错误:

try {
   $conn->exec("insert into students(username,password,age)
                        values('$username','$password','$age')"); 
   // do other things if successfully inserted
} catch (PDOException $e) {
   if ($e->errorInfo[1] == 1062) {
      // duplicate entry, do something else
   } else {
      // an error other than duplicate entry occurred
   }
}

由于您将列 username 设置为 UNIQUE ,因此在尝试插入重复条目时执行将引发错误。

或者您可以使用 insert ignore 并完全忽略错误消息。 阅读更多关于 insert ignore here

  • 你好@noah1400 当我注册现有帐户时没有任何反应,它没有记录在数据库中,但没有向用户显示有关重复输入的错误