Generate unique 4 char values

I need to generate some PINs for a login system. I only have 39 values but I would like them to be unique,
how would I do that in PHP?
LVL 26
Eddie ShipmanAll-around developerAsked:
Who is Participating?
rdivilbissConnect With a Mentor Commented:
If you want a 4 digit pin, then rand(0,9999); needs to be rand(1111,9999);

$pins = array();
$maxPins = 39;

for ($idx=0; $idx<$maxPins; $idx++) {
      $unique = false;
      while (!$unique) {
            $tmpPin = rand(1111,9999);
            if (!array_search($tmpPin, $pins)) {
       // you can update a table row $idx here

There are several ways.

Are you saving the pins somewhere to make sure that they are not reused?
If so - we could do something like this:

$uniqueval = rand(0,9999);
/// do some code to get a list of previously assigned pins (not shown)
// (now do a while loop to go through the previously assigned vals)
while($x = 0)


oops hit a button on the keyboard and it submitted - try again

if(in_array($uniqueval,$something) {   $uniqueval=rand(0,9999); $x =0; }
else { $x = 1; }

At the conclusion of the loop $uniqueval should be a unique 4 digit value not previously assigned.
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Eddie ShipmanAll-around developerAuthor Commented:
I have 39 records in a mySQL table named Teams, the field is PIN.
Cornelia YoderArtistCommented:
                $result=mysql_query("Select * from Teams where PIN=$newpin;");

At the end of this loop, you will have $newpin equal to a random value that is not in the table.
Why do multiple database lookups, when you can determine the uniqueness in code alone, and only hit the database when you update a record with the new PIN.

Also, (although not explicitly stated by the asker,) a PIN is normally a 4 digit integer, where rand()%1000000000; will return many different lengths.
Cornelia YoderArtistCommented:
OK, so just change the rand statement to generate whatever size number you want for the pin.

However, unless the pins are all generated at the same time and only once, you cannot save them in code.  You will have to do database lookups each time you generate a new one for a new user.
He says he already has 39 rows, so only hit each row one time, e.g. to update it with the unique PIN.

If he was adding a new row subsequent, then your query until unique would be a good choice.
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.