【问题标题】:Regarding unique username关于唯一用户名
【发布时间】:2014-04-04 18:35:44
【问题描述】:

我正在处理一个学生门户网站,我必须在其中为学生创建一个唯一的登录用户名。我在 csv 文件中有他们的名字、姓氏和出生日期。为了唯一性,我尝试使用这三个参数创建一个唯一的用户名。但是 DOB 可能为 null,因此可能会发生冲突。

还有一些学生是一个会话的门户用户,例如:2012-13 将在 2013-14 的 csv 表中有详细信息,如果我们使用具有任何唯一时间戳或唯一 ID 的相同格式,则用户名生成比会有两个相同用户的用户名。

我需要一个解决方案,从中生成一个包含可用详细信息的唯一用户名,还可以检查每个学生是否只输入一次数据库并且只有一个用户名。

如果不是,我希望我清楚细节,如果不是请给你的 cmets,我会改进它。

下面是我用来从 csv 数据生成用户名的代码,

逻辑 - USERNAME = 'first 3 letter of firstname' + 'DOB' + 'first 3 letter of lastname'

            foreach($result as $file_data){
                    //loop throgh the data and find errors

                //check the duplicate entry in the file
                if(count($accepted)>0){
                    foreach($accepted as $accepted_user){

                        if(($file_data['First name'] == $accepted_user['First name']) && ($file_data['Last name'] == $accepted_user['Last name']) && ($file_data['DOB'] == $accepted_user['DOB'] )){
                            $rejected[]=array("error"=> $this->lang->line('duplicate_entry_in_file'),"line_number"=>$error_count);
                        }
                    }
                }

                // Generate username from Firstname , Lastname & DOB (if null than we add auto generated DOB)
                    if($file_data['First name']=='' || $file_data['Last name']==''){ // check if first_name last_name and date-of_birth is empty
                        $rejected[]=array("error"=> "First Name , Last Name not available","line_number"=>$error_count);
                    }else{
                        if($file_data['DOB']==''){
                            $dob=date('dmy',mktime(0,0,0,date("m"),date("d")+1,date("Y")-10)); //
                            $date_of_birth= $dob['4'].$dob['5']."-".$dob['2'].$dob['3']."-".$dob['0'].$dob['1'];
                            $dob_username= $dob['0'].$dob['1']."-".$dob['4'].$dob['3']."-".$dob['4'].$dob['5'];
                        }else{
                            $dob = $file_data['DOB'];
                           if(strlen($dob) == 5 ){
                                $year_of_birth=$dob['3'].$dob['4'];

                                if($year_of_birth < date('y')){
                                    $date_of_birth= "20".$dob['3'].$dob['4']."-".$dob['1'].$dob['2']."-0".$dob['0'];
                                    $dob_username= "0-".$dob['0']."-".$dob['1'].$dob['2']."20".$dob['3'].$dob['4'];
                                }elseif($year_of_birth > date('y')){
                                    $date_of_birth= "19".$dob['3'].$dob['4']."-".$dob['1'].$dob['2']."-0".$dob['0'];
                                    $dob_username= "0-".$dob['0']."-".$dob['2'].$dob['1']."19".$dob['3'].$dob['4'];
                                }                                
                           }elseif(strlen($dob) > 5 ){
                                $year_of_birth=$dob['4'].$dob['5'];
                                if($year_of_birth < date('y')){
                                    $date_of_birth= "20".$dob['4'].$dob['5']."-".$dob['2'].$dob['3']."-".$dob['0'].$dob['1'];
                                    $dob_username= $dob['0'].$dob['1']."-".$dob['2'].$dob['3']."-20".$dob['4'].$dob['5'];
                                }else{
                                    $date_of_birth= "19".$dob['4'].$dob['5']."-".$dob['2'].$dob['3']."-".$dob['0'].$dob['1'];
                                    $dob_username= $dob['0'].$dob['1']."-".$dob['2'].$dob['3']."-19".$dob['4'].$dob['5'];
                                }
                           }
                        }
                        $first_name=$file_data['First name'];
                        $last_name=$file_data['Last name'];

                        $dateOfBirth = str_replace("-", '', $dob_username);

                        if((strlen($last_name) < 3 ) && (strlen($first_name) < 3 ) ){
                            $username=$last_name.$dateOfBirth.$first_name; 
                         }elseif(strlen($last_name) < 3 ){
                            // $username=$last_name.$dateOfBirth.substr($first_name, 0, 3);
                            $username=$last_name.$dateOfBirth. mb_substr($first_name, 0, 3,'UTF-8'); 
                         }elseif(strlen($first_name) < 3){
                             $username=mb_substr($last_name, 0, 3,'UTF-8').$dateOfBirth.$first_name;
                         }else{
                             $username=mb_substr($last_name, 0, 3 ,'UTF-8').$dateOfBirth.mb_substr($first_name, 0, 3,'UTF-8');
                         }
                        //echo $username."<br/>";

                        if($user_datas = $this->user_model->user_exist(array('username'=>$username))){
                            //if user already exist then take the user_id
                            foreach($user_datas as $user_data){
                                $user_id=$user_data['id'];
                            }
                            //if the user is already in the project for this season
                            if($this->user_model->user_exist_in_project(array('project_id'=>$project_name,'student'=>$username,'season'=>$season))){
                                //check users first name and last name if exist
                                if($user_datas = $this->user_model->user_exist(array('first_name'=>$first_name,'last_name'=>$last_name))){
                                    //if match found then reject this data
                                    $rejected[]=array("error"=> $this->lang->line('student_already_in_project_in_season'),"line_number"=>$error_count);
                                }else{
                                    $accepted[]=$file_data;
                                }
                            }

                        }else{
                            $accepted[]=$file_data;
                        }

                    }


                    $error_count++;
            }

【问题讨论】:

  • 我认为这是一个糟糕的想法,即使结合了这 3 个元素,你仍然有相当高的碰撞机会,这意味着你很可能会有几个名字相同的人,并且出生同一日期。争取一些唯一性,可能在生成用户名时添加部分时间戳,或者某种哈希......
  • 您是否只需要使用这些数据,或者您可以在用户名中附加一些随机值以实现唯一性吗?
  • @aleation 感谢 aleation 的回复,如果我使用时间戳作为用户名,那么同一个学生可能会出现在明年的表格中,所以我将如何检查它是否存在于我们的数据库中。例如,如果用户 Raju Jain 在 2013 年进入第 10 班并使用唯一用户名 ujgttggdfgsdfsh 注册,那么在 2014 年再次添加用户时,我们使用新用户名重复输入 Raju Jain
  • @PetarZivkovic 我需要一些对数,从中为用户生成一个唯一的用户名,并在添加新用户时检查它是旧用户还是新用户。我希望你了解我的情况。可能性:来自 CSV 的数据 - 有不同班级的名字、姓氏和 DOB 学生,同一学生将出现在不同的 CSV 表格中,每个用户只有一个用户名
  • 您需要每个人都独一无二的东西,例如电子邮件或学生编号,这些东西可以在他们身上保留多年。名称,DOB 不是唯一的,并且附加随机字符串将不起作用,因为您声明您将获得多年冲突。

标签: php mysql csv


【解决方案1】:

我的回答将解决您遇到的具体问题:

我需要一个解决方案,从中生成一个唯一的用户名 可用的详细信息还可以检查每个学生是否输入 数据库只有一次,并且只有一个用户名。

因为您声明每个学生都有“名字”、“姓氏”和“生日”(可能为空),并且需要创建一个唯一的用户名,所以我建议使用校验和。

真正的问题是,您拥有的数据本身并不能保证唯一性,因此,如果您在用户数据中实施某种随机盐,即使我建议的解决方案也无法 100% 发挥作用。

这是一个代码 sn-p 可以帮助您了解我的想法:

$fname = "John";
$lname = "Doe";
$bday  = "1980-03-01";

$unique_user_string = strtolower($fname . $lname . $bday); // not actually unique if 2 people have same name and birthday
$username = ucfirst(substr($fname, 0, 1)) . ucfirst($lname) . crc32($unique_user_string);

从上面的代码中,你应该有一个类似的用户名:JDoe4246458655

好消息是,您始终可以通过检查校验和并使用 CSV 中的用户数据创建新用户来确认现有用户。要从现有用户名中获取校验和,只需执行以下操作:

$crc = substr($username, -10, 10);

我希望这是有道理的。

【讨论】:

  • 谢谢彼得的回答,但如果这些细节在明年的表格中重复或在明年的表格中得到类似的细节,那么明年 John Doe 将再次获得一个新的用户名。意味着每年他们都有新的登录详细信息以及以前的登录详细信息,并且它与数据库冲突。我希望我清楚吗?
  • @RajuJain,在上面的示例中,用户名对于名字/姓氏/生日组合是唯一的。如果某人拥有确切相同的详细信息,则将计算相同的用户名……这是没有真正唯一标识符(例如学生编号)的缺点。
【解决方案2】:

您可以简单地使用此功能:

$uniqueid2 = md5(uniqid());
$uniqueid = substr($uniqueid2, 0, 8);

并在他们的名字末尾添加这个 $uniqueid 变量,这样可以引导您获得一个非常独特的登录名。

【讨论】:

  • 我如何检查是否是同一个用户在上一年注册了我们。前 Raju Jain 于 2013 年在我们这里注册,2014 年他的名字再次出现,我们将在数据库中为 Raju Jain 添加冗余条目。从您的代码中,每年用户都有可能拥有新的凭据。
  • 不不,aisa nhi。此代码仅在用户在您的网站上注册他的名字时有效(仅一次),并且在注册后,这将是他多年的唯一名字。明白了吗?
  • :-) 亲爱的,我认为您没有正确阅读问题,用户不会从注册表单中注册自己。他们通过我们从学校获得的 CSV 文件读取的数据在门户网站上注册。每年我们都会收到新的 CSV 文件,但明年 CSV 文件也可能包含上一年的用户/学生。因此,根据您的逻辑,相同的用户每年都会有不同的登录凭据。立即清除
  • 那么你应该首先确保你有一个同名和同名的特定用户的记录,并且在插入之前检查以前的同名+同名记录。因此,如果您找到任何以前的记录,则无需生成唯一 id,使用以前的记录,但如果您没有找到任何记录,则可以使用我的代码生成新的 id。明白了吗?
猜你喜欢
  • 2013-07-09
  • 2015-04-12
  • 2016-05-16
  • 2017-11-02
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多