我正在处理学生门户网站,我必须为学生创建一个唯一的登录用户名。我在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++;
}
答案 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变量,这样可以引导您进行非常独特的登录。