这是我的用户注册数据库的方式,但我的问题是:我如何防止数据库中有相同用户名的副本,换句话说,如果用户的用户名存在于数据库中,我如何向用户提示"您的用户名已经存在"。
<?php
$error = ""; // error
$GoodJob = "";
//When submit button is pressed, send data.
if(isset($_POST['submit'])){
if (empty($_POST['username']) || empty($_POST['email']) || empty($_POST['password'])) {
$error = "<br>Please insert only letters or numbers.";
}else{
// Define username, firstname, lastname, email and password.
$username = $_POST['username'];
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];
$password = $_POST['password'];
// Define database information
$hostnameV = "***";
$usernameV = "***";
$passwordV = "***";
$databaseV = "***";
//connection to the database
$connection = mysql_connect($hostnameV, $usernameV, $passwordV)
or die("Unable to connect to MySQL");
echo "Connected to MySQL<br>";
//select a database to work with
$selected = mysql_select_db($databaseV,$connection)
or die("Could not select company");
// To protect MySQL injection for Security purposes
$username = stripslashes($username);
$firstname = stripslashes($firstname);
$lastname = stripslashes($lastname);
$email = stripslashes($email);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$firstname = mysql_real_escape_string($firstname);
$lastname = mysql_real_escape_string($lastname);
$email = mysql_real_escape_string($email);
$password = mysql_real_escape_string($password);
// SQL query to send information of registerd users
# FORMULA: INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)
$query = mysql_query("INSERT INTO `company`.`users` (`id`, `username`, `firstname`, `lastname`, `email`, `password`)
VALUES (NULL, '$username', '$firstname', '$lastname', '$email', '$password')", $connection);
//close the connection
mysql_close($connection);
} // end if statement
***
}
?>
<div id="main">
<div id="login">
<h2>REGISTER</h2>
<form action="" method="post">
<input id="name" name="username" placeholder="Pick a username" type="text">
<input id="name" name="email" placeholder="Your email" type="text">
<input id="name" name="firstname" placeholder="firstname" type="text">
<input id="name" name="lastname" placeholder="lastname" type="text">
<input id="password" name="password" placeholder="Create a password" type="password">
<input name="submit" type="submit" value=" REGISTER ">
<span><?php echo $error; ?></span>
</form>
</div>
</div>
我首先不使用mysql_*函数,因为它们不推荐使用,并在PDO正常工作时切换到PDO。
要回答您的问题,您只需在数据库中查询用户名,如果存在,请告诉用户。
插入之前,使用PDO和准备好的语句。
$stmt = $dbh->prepare('SELECT count(*) FROM user WHERE username = ?');
$stmt->execute(array($username));
$res = $stmt->fetch(PDO::FETCH_NUM);
$exists = array_pop($res);
if ($exists > 0) {
// tell the user it already exists.
} else {
// carry on with your insert.
}
正如其他人所建议的那样,还应该使用户名唯一。我不会写代码失败,但当试图插入重复的用户名时,我仍然会测试它是否存在。
因此,为了提供更多的清晰度,参考下面关于使用异常的评论,以下是为什么如果有人输入了已经被占用的用户名,我不会编写代码来引发异常。在我看来,例外应该是例外。这意味着发生了一些不同寻常的事情。有人输入了一个已经被占用的用户名,我认为这是应用程序的正常操作,应该以正常的非异常方式进行处理。然而,如果有人输入了一个有效的用户名,在我检查它没有被占用的时间和我运行插入程序的时间之间,其他人获取了该用户名(在2毫秒的时间内),那将是一个异常,我会处理它。对用户来说,这个"异常"看起来完全相同,但在我的代码中,它将作为异常处理。
因此,这就是为什么我不会只编写代码来执行插入操作,当有人输入已被占用的用户名时会引发异常。我会检查它是否被占用,然后插入它,如果在我检查和插入之间用户名被卡住,就会抛出一个异常。我认为这是一个很好的应用程序设计和对异常的正确使用。其他人可能不同意,但我就是这么做的。例外应该是例外,而不是正常业务的一部分。
您可以设置一个验证来检查用户名是否存在。
<?php
function checkUserExist($username){
$checkExist = "SELECT username from userTable WHERE username ='" . $username . "'" or die(mysql_error());
mysql_query($checkExist);
if($checkExist > 0){//That means username is existed from the table
return true;
}else{//username isn't exist
return false;
}
}
if(checkUserExist($username)){//function return true
echo "username is already exist, please change.";
}else{
//Insert the user info into db
}
这是一个用mysql_query函数检查用户名的例子,你也可以用PDO来实现它,干杯!