我正在尝试用 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/