未使用的随机剂量数

时间:2011-12-20 16:43:45

标签: php mysql phpmyadmin

我正在尝试为我的网站生成一个独特的“dosieid”号码。我的网站是一个人力资源计划解决方案,在该程序中用户在他们的公司创建他们的工人的dosie ...随机dosieid需要我,所以当用户在现场dosieid创建dosie时自动显示之前未使用的dosieid-s。数据库中不存在的dosieid。在其他情况下,我会使用自动增量,但在这种情况下,还没有创建dosie。并且在表单dosieid必须是选项,如果随机不适合用户更改数字。还有一个提示数字必须从1到9999.有人能帮助我吗?我尝试了很多代码,但是我没有找到类似这个规范的代码。

这是我到目前为止所做的。它得到随机数,但我不知道如何将该随机数与数据库行“dosieid”进行比较?

$id_num = mt_rand(1,9999);

$query = "SELECT dosjeid FROM albums";

$result = mysql_query($query) or die(mysql_error());

while($account = mysql_fetch_array($result)){

    if ($id_num == $account['id']){ 

        $id_num = mt_rand(1,9999);  

    }

}   
echo"$id_num<br>";

4 个答案:

答案 0 :(得分:2)

这是非常令人费解的......为什么自动递增数字不够?此代码也永远不会正常工作。如果由于某种原因您必须使用随机数,那么您可以这样做:

while(true) {
    $id_rand = mt_rand(1,9999);
    $result = mysql_query("SELECT count(*) FROM albums WHERE dosjeid=$id_rand") or die(mysql_error());
    $row = mysql_fetch_row($result);
    if ($row[0] == 0) { 
       break; // our random number isn't in the database, so exit the loop
    }
}

但是,这里存在一些问题:

1)当你达到9999个dosie记录时,你会得到一个无限循环 2)数据库中的记录越多,该循环在找到“空置”插槽时所需的时间越长。随着您越来越接近9999条记录,您将花费很长时间找到一个空槽 3)如果你试图“隐藏”任何成员的ID,以便用户不能简单地在某处增加一个ID参数来查看其他人的记录,那么FAR FAR FAR会更好/更容易地做到这一点,比如加密发送给客户之前的ID值。

答案 1 :(得分:0)

您可能还想阅读有关仅限数字的哈希值(检查算法的冲突率) - php: number only hash?

function doesIdExists($id)
{
   $query = "SELECT dosjeid FROM albums";
   $result = mysql_query($query) or die(mysql_error());
   while($account = mysql_fetch_array($result)) 
   {
      if ($id_num == $account['id'])
           return true;  /* The id is taken */
   }
   return false; /* Not taken */
}

$recNotAdded = true;

while($recNotAdded)
{
    $rand = mt_rand(1,1000);  //Whatever your numbers
    $doesExist = doesIdExists($rand);
    if(!$doesExist)
    {
       /* Add to DB */
       $recNotAdded = false;
    }
 }

答案 2 :(得分:0)

使用自动递增编号作为主键,并使用UNIQUE属性作为向用户显示的ID的附加显示ID。这样,您就可以获得内部处理的唯一ID以及可以轻松更改的显示ID。

答案 3 :(得分:0)

这是一个糟糕的设计。你应该:

  1. 不允许用户创建dosieid(自己创建,在创建记录后将其提供给他们)
  2. 尝试首先使用指定的dosieid创建存根记录,然后使用信息
  3. 更新它
  4. 或使用UUID,需要比1-9999更大的范围
  5. 即使您检查该号码是唯一的,在您检查它的时间和您插入记录的时间之间,其他人可能已经接受了该号码。

    在任何情况下都不应该通过随机选择数字来找到空ID。这使得您的程序执行时间不确定,如果您最终获得5000名员工,则可能需要等待很长时间

    此外,此范围对于随机性要求而言太小。