【发布时间】: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 不是唯一的,并且附加随机字符串将不起作用,因为您声明您将获得多年冲突。