0

我最近刚问了一个问题,并将我的代码固定为以下代码:

{ 
//Check if user already exists 
$un_check = mysql_query("SELECT Username FROM users WHERE Username = '$un'");  
if(mysql_num_rows($un_check) >0) {
echo "Username already exists";
}
else{
 // Username Free
}

并且在注册时它声明“用户名已经存在”但是,它仍然允许我创建帐户并将相同的信息添加到数据库中。

这是我的代码或数据库的问题吗?

4

6 回答 6

3

如果要禁止在表中输入相同的值两次,请创建唯一索引

检查是否存在条目是一回事 - 禁止插入具有相同值的另一行是另一回事。

添加这样一个索引的工作方式如下:

ALTER TABLE `users` ADD UNIQUE `MY_UNIQUE_INDEX` ( `username` ) 
于 2013-06-25T13:58:20.620 回答
1

您可以简单地将向数据库添加用户的 mysql 查询代码放在else块内。这样,如果用户已经存在,您将永远不会插入数据库。

于 2013-06-25T13:59:18.783 回答
0

可能的情况

  • Username在您的数据库中不是唯一的。

  • (如果您不想更改表结构)将insert部分代码放入else语句中。

    if(mysql_num_rows($un_check) >0) { echo "用户名已经存在"; } else{ // 插入新用户名 }

顺便说一句,不要使用 mysql_ 函数。已弃用

于 2013-06-25T14:00:34.943 回答
0

另一种方法是谋杀剧本。我的意思是,使用该die();功能。这会在您放置脚本的任何位置停止脚本。你会想像这样插入它:

//Check if user already exists 
$un_check = mysql_query("SELECT Username FROM users WHERE Username = '$un'");  
if(mysql_num_rows($un_check) >0) {
    echo "Username already exists";
    die(); // Don't continue, as we don't want to insert a username
}
else{
    // Username Free
}

尽管这可行,但如果无论用户名是否存在,您仍要执行任何其他代码,只需else{}按照其他人的建议将插入用户的代码放在块内。

于 2013-06-25T14:06:35.987 回答
0

问题有两个方面。

首先,严格从数据存储(也称为数据库)的角度来看,问题出在执行不佳的数据库设计上。如果用户名是一个需要唯一的字段,那么应该通过向用户名列添加唯一索引来在数据库中声明。这会创建正确的数据库设计,因此如果用户名值已存在于表中,则无法添加新记录 - 因此是唯一索引。

第二,检查用户名是否存在的代码。检查数据库是否有重复项后,它是否仍在创建帐户,或者您只是说您可以在数据库中手动复制用户名?如果代码仍在复制用户,那么可能是因为结果是一个空集 - 即没有结果,因为不存在用户名,因此它不会返回行数,因此将 > 更改为 >=。

于 2013-06-25T14:15:34.400 回答
-1

我遇到了同样的问题,我的解决方案是这样

<?php
//Connection Script Start
$mysql_host = "localhost";
$mysql_user = "root";
$mysql_password = "*******";
$mysql_database = "db_name";
$connect = mysqli_connect($mysql_host, $mysql_user, $mysql_password, $mysql_database);
//Connection Script Ends

$un = "userabc";
$search = "SELECT * FROM table_name WHERE username='$un'";
$query = mysqli_query($connect, $search);
$i = mysqli_num_rows($query);
if($i==0){
//username free
}else{
echo "This username is already taken";
}
?>
于 2013-06-25T14:14:21.127 回答