关于唯一用户名

时间:2014-04-04 08:58:31

标签: php mysql csv

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

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

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

我希望我能清楚地了解详细信息,如果不是,请发表您的意见,我会改进它。

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

逻辑 - USERNAME ='名字的第3个字母' +' DOB' +'姓氏的前3个字母'

            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++;
            }

2 个答案:

答案 0 :(得分:2)

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

  

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

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

真正的问题是,你拥有的数据本身并不能保证唯一性,所以即使是我建议的解决方案,如果没有在用户数据中实现某种随机盐,也不会100%工作。

这是一段代码片段,可以帮助您了解我的想法:

$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);

我希望这是有道理的。

答案 1 :(得分:0)

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

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

并在名称的末尾添加此$ uniqueid变量,这样可以引导您进行非常独特的登录。