如何在php中生成UNIQUE随机数

时间:2012-01-12 11:41:30

标签: php mysql database random

  

可能重复:
  Algorithm for generating a random number

我需要为数据库中的某些条目分配一个随机生成的数字,它必须是唯一的。 我用:

$random_number = mt_rand();
mysqli_query($db_connection, "INSERT INTO my_table (rand_num, blabla) VALUES ('$random_number', '$blabla')");

但是,2个随机数相同的可能性总是略低。 然后我可以做类似的事情:

function random_check($random_number) {
    require_once('db_access.php');
    $random_check = mysqli_query($db_connection, "SELECT rand_num FROM my_table");
    mysqli_close($db_connection);
    $result = 1;
    while($row = mysqli_fetch_array($random_check)){
            if ($row['rand_num'] == $random_number) {
             $result=0
           }
    }
        return $result;
};

$random_number = mt_rand();
$random_check = random_check($random_number);
if ($random_check == 0) {
      $random_number = mt_rand();
}

但是这只会检查一次数字,并且新生成的数字仍然存在于数据库中。

有什么建议吗? 感谢

4 个答案:

答案 0 :(得分:2)

执行SELECT rand_num FROM my_table并检查结果值非常非常低效。使用WHERE子句:

do {
    $random_number = mt_rand();
    $query_object = mysqli_query($db_connection, "SELECT 1 FROM my_table WHERE rand_num = $random_number");
    $query_record = mysqli_fetch_array($query_object);
    if(! $query_record) {
        break;
    }
} while(1);

可以用较小的行编写此代码。

答案 1 :(得分:2)

以下是您可以使用的方法:

<?php
$num= mt_rand();
$con = mysql_connect("localhost","uname","password");
mysql_select_db("dbname",$con);
$sel_query  = "SELECT *  FROM  my_table WHERE rand_num =%d"; // query to select value 
$ins_query = "INSERT INTO my_table(rand_num) VALUES(%d)";    // query to insert value
$result =  mysql_query(sprintf($sel_query,$num),$con);
while( mysql_num_rows($result) != 0 ) {                      // loops till an unique value is found 
    $num = mt_rand();
    $result = mysql_query(sprintf($sel_query,$num),$con);
}
mysql_query(sprintf($ins_query,$num),$con); // inserts value 

&GT;

答案 2 :(得分:0)

function random_check($random_number) {
    require_once('db_access.php');
    $random_check = mysqli_query($db_connection, "SELECT rand_num FROM my_table");
    mysqli_close($db_connection);
    while($row = mysqli_fetch_array($random_check)){
            if ($row['rand_num'] == $random_number) {
             return false;
           }
    }
    return true;
};

while(!random_check(mt_rand()){
    $myNumbber = random_check(mt_rand();
}

- &GT;现在你在“myNumber”中得到了唯一的号码

答案 3 :(得分:0)

md5( strtotime("now").$_SERVER['REMOTE_ADDR'] );

strtotime(“now”)会给你一个唯一的号码,但如果你正在使用这个脚本来处理来自多个用户的表单/上传等,那么ip地址就会确定一下(确切地说就是确定了)相同的第二个两个条目...甚至可以发生??嗯......)

md5()cos我觉得这样:D