php - 如何防止同时创建具有相同详细信息的多个用户

标签 php mysql ajax duplicates

我正在尝试用 PHP 创建一个注册表单,它工作正常;用户名和加密密码和电子邮件被添加到数据库中,如果用户名或电子邮件已经存在,则会通知用户他不能使用这些详细信息。然而;我有一个奇怪的错误,当我提交一个用户时,我的数据库中会出现两个副本。

我不确定这是怎么回事,因为 JavaScript 是单线程的,所以即使我生成两个 AJAX 请求,第二个请求也应该失败,因为现在已经存在具有该用户名的用户?

我怎样才能解决这个问题?

我正在使用以下 PHP 文件来处理 AJAX 请求:

// Get our user-data:
 $username = isset( $_POST['username'] ) ? $_POST['username'] : die( "You must enter a valid username" );
 $password = isset( $_POST['pass'] ) ? $_POST['pass'] : die( "You must enter a valid password" );
 $email = isset( $_POST['email'] ) ? $_POST['email'] : "";

 try {
     $connection = new PDO( "mysql:host=$server_name;dbname=$db_name", $db_username, $db_password );
     $connection->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

     // Check to see if that username or password exist:
     $sql_statement = $connection->prepare( "SELECT COUNT(*) FROM users WHERE `username` = ? LIMIT 1" );
     $sql_statement->execute( array( $username ) );
     if( $sql_statement->fetchColumn() > 0 )
     {
         // That username already exists:
         die( "That username already exists" );
     }

     $sql_statement = $connection->prepare( "SELECT COUNT(*) FROM users WHERE `email` = ? LIMIT 1" );
     $sql_statement->execute( array( $email ) );
     if( $sql_statement->fetchColumn() > 0 )
     {
         // That email is already used:
         die( "There already exists an account under that email address" );
     }

     // Add the user to the database:
     $sql_statement = $connection->prepare( "INSERT INTO users( username, email, joined, password ) VALUES (?, ?, NOW(), ?)" );
     $sql_statement->execute( array( $username, $email, password_hash( $password, PASSWORD_DEFAULT ) ) );
 }
 catch( PDOException $e )
 {
     die( "There was an internal database error whilst creating your user, error code (" . $e->getCode() . ")" );
 }

最佳答案

也许用sum代替count,甚至在数据库中做成唯一字段,但是为了性能,找到两次进入ajax的根本原因效率更高,是表单被提交了两次吗?如果是这样,您也许可以通过在 if 语句中进行额外检查来避免它,并且可以放置断点并打印出每个变量的值

关于php - 如何防止同时创建具有相同详细信息的多个用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29019887/

相关文章:

java - 如何使用php将参数传递给java?

php/mysql 表单验证问题

php - 在php中设置新用户后无法访问我的网页

mysql - 在本地主机上遇到 MySQL 列宽度限制,但在 AWS 服务器上却没有

jquery - 显示使用 getJSON 加载图像

php - 学说 2.x 增删改查

php - 如何在mysql中搜索base64编码的字符串?

javascript - "Re open last closed tab"导致显示最后的ajax请求内容

javascript - setInterval() 未按时停止,间隔之间为 "jumping"

java - 使用 hibernate 存储/从 MySql 检索 JSON 数据时出现 UTF-8 问题