Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to generate unique username - PHP

Tags:

php

I have strings of usernames in array . I want to generate a unique string of username which do not exits in array.(probably with some numbers following the username)

How do I achieve this?

I have summarize the code:

function generate_unique_username(){
    $firstname      = "james";//data coming from user
    $lastname       = "oduro";//data coming from user
    $new_username   = $firstname.$lastname;
    $usersnames     = array("james39","oduro32","kwame93","elvisasante","frimpong32","edward32","jamesoduro");

    //Loop through ARRAY usernames and check elements against VAR $new_username

    if (in_array($new_username, $usersnames)) {
        //generate new username which is not inside array
        //the new generated string should also be check against array to ensure is doens not exit.


    }else{
        return $new_username;
    }
}

Thank you.

like image 621
james Oduro Avatar asked Oct 18 '25 15:10

james Oduro


2 Answers

Generating username from the stored array is not a good practice, I would suggest you to use the database.

If you are using the database instead of the array, you can use the best method to generate the unique username as following:

function generate_unique_username(){
    $firstname      = "james";//data coming from user
    $lastname       = "oduro";//data coming from user
    $new_username   = $firstname.$lastname;

    /* Note: writing here pseudo sql code, replace with the actual php mysql query syntax */
    $query = "SELECT COUNT(id) as user_count FROM user WHERE username like '%".$new_username."%'";
    $result = mysql_query($query);
    $count = $result['user_count'];

    if(!empty($count)) {
        $new_username = $new_username . $count;
    }

    return $new_username;
}
like image 93
pravindot17 Avatar answered Oct 20 '25 05:10

pravindot17


I think in this case you should first off try and assign cooler user names to the users then when that fails you go for a number suffix. This is an approach I may use. You may need to change the code to your more preferred and secured mysqli call like using the PDO or MySQLI prepared statement.

//function that will be used to figure out if the user name is available or not
function isAvailable($userName){
    global $mysqli;
    $result = $mysqli->query("SELECT id FROM users WHERE user_name='$userName'") or die($mysqli->error());

    // We know username exists if the rows returned are more than 0
    if ( $result->num_rows > 0 ) {
         //echo 'User with this username already exists!';
         return false;
    }else{
        return true;
    }
}

function generate_unique_username($firstname, $lastname, $id){    
    $userNamesList = array();
    $firstChar = str_split($firstname, 1)[0];
    $firstTwoChar = str_split($firstname, 2)[0];
    /**
     * an array of numbers that may be used as suffix for the user names index 0 would be the year
     * and index 1, 2 and 3 would be month, day and hour respectively.
     */
    $numSufix = explode('-', date('Y-m-d-H')); 

    // create an array of nice possible user names from the first name and last name
    array_push($userNamesList, 
        $firstname,                 //james
        $lastname,                 // oduro
        $firstname.$lastname,       //jamesoduro
        $firstname.'.'.$lastname,   //james.oduro
        $firstname.'-'.$lastname,   //james-oduro
        $firstChar.$lastname,       //joduro
        $firstTwoChar.$lastname,    //jaoduro,
        $firstname.$numSufix[0],    //james2019
        $firstname.$numSufix[1],    //james12 i.e the month of reg
        $firstname.$numSufix[2],    //james28 i.e the day of reg
        $firstname.$numSufix[3]     //james13 i.e the hour of day of reg
    );


    $isAvailable = false; //initialize available with false
    $index = 0;
    $maxIndex = count($userNamesList) - 1;

    // loop through all the userNameList and find the one that is available
    do {
        $availableUserName = $userNamesList[$index];
        $isAvailable = isAvailable($availableUserName);
        $limit =  $index >= $maxIndex;
        $index += 1;
        if($limit){
        break;
        }
    } while (!$isAvailable );

    // if all of them is not available concatenate the first name with the user unique id from the database
    // Since no two rows can have the same id. this will sure give a unique username
    if(!$isAvailable){
        return $firstname.$userId;
    }
    return $availableUserName;
}

//Get the unique user id from your database, for now let's go with 30
$userId = 30;
echo generate_unique_username('john', 'oduro', $userId);

Also, it would be nice to provide a fallback feature where the user can change their user name to any other unique value, in case they do not like the auto-generated value.

like image 32
Marcel Avatar answered Oct 20 '25 05:10

Marcel



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!