开发者

While loop for mysql database with php?

I am developing开发者_运维百科 a mysql database.

I "need" a unique id for each user but it must not auto increment! It is vital it is not auto increment.

So I was thinking of inserting a random number something like mt_rand(5000, 1000000) into my mysql table when a user signs up for my web site to be. This is where I am stuck?!

The id is a unique key on my mysql table specific to each user, as I can not 100% guarantee that inserting mt_rand(5000, 1000000) for the user id will not incoherently clash with another user's id.

Is there a way in which I can use mt_rand(5000, 1000000) and scan the mysql database, and if it returns true that it is unique, then insert it as the user's new ID, upon returning false (somebody already has that id) generate a new id until it becomes unique and then insert it into the mysql database.

I know this is possible I have seen it many times, I have tried with while loops and all sorts, so this place is my last resort.

Thanks


You're better off using this: http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid

Or using this: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

But if you actually want to do what you are saying, you can just do something like:

$x;
do {
 $x = random_number();
 "SELECT count(*) FROM table WHERE id = $x"
} while (count != 0);
// $x is now a value that's not in the db


You could use a guid. That's what I've seen done when you can't use an auto number.

http://php.net/manual/en/function.com-create-guid.php


Doesn't this function do what you want (without verification): http://www.php.net/manual/en/function.uniqid.php?


I think you need to approach the problem from a different direction, specifically why a sequence of incrementing numbers is not desired.

If it needs to be an 'opaque' identifier, you can do something like start with a simple incrementing number and then add something around it to make it look like it's not, such as three random numbers on the end. You could go further than that and put some generated letters in front (either random or based on some other algorithm, such as the day of the month they first registered, or which server they hit), then do a simple checksuming algorithm to make another letter for the end. Now someone can't easily guess an ID and you have a way of rejecting one sort of ID before it hits the database. You will need to store the additional data around the ID somewhere, too.

If it needs to be a number that is random and unique, then you need to check the database with the generated ID before you tell the new user. This is where you will run into problems of scale as too small a number space and you will get too many collisions before the check lucks upon an unallocated one. If that is likely, then you will need to divide your ID generation into two parts: the first part is going to be used to find all IDs with that prefix, then you can generate a new one that doesn't exist in the set you got from the DB.


Random string generation... letters, numbers, there are 218 340 105 584 896 combinations for 8 chars.

function randr($j = 8){
$string = "";
    for($i=0;$i < $j;$i++){
        srand((double)microtime()*1234567);
        $x = mt_rand(0,2);
        switch($x){
            case 0:$string.= chr(mt_rand(97,122));break;
            case 1:$string.= chr(mt_rand(65,90));break;
            case 2:$string.= chr(mt_rand(48,57));break;
        }
    }
return $string; 
}

Loop...

do{
    $id = randr();
    $sql = mysql_query("SELECT COUNT(0) FROM table WHERE id = '$id'");
    $sql = mysql_fetch_array($sql);
    $count = $sql[0];
}while($count != 0);


For starters I always prefer to do all the randomization in php.

function gencode(){
$tempid=mt_rand(5000, 1000000);
$check=mysql_fetch_assoc(mysql_query("SELECT FROM users WHERE id =$tempid",$link));
if($check)gencode();
$reg=mysql_query("INSERT INTO users id VALUES ('$tempid')",$link);
//of course u can check for if $reg then insert successfull
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜