2011-12-20 64 views
-2

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

这是我迄今为止所做的。它获取随机数,但我不知道如何将该随机数与数据库行“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>"; 

回答

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参数用于查看其他人的记录,还有更远/更简单的方法,比如在将ID值发送给客户端之前加密ID值。

+0

+1你有更好的马克! – check123 2011-12-20 17:27:55

+0

@Marc B好吧,我明白但是我该如何编码才能得到第一个未使用的数字,这个数字在数据库中还没有被使用呢?从a-z? – 2011-12-20 17:52:46

+0

然后只需要一个自动增量,然后离开它。 – 2011-12-20 18:18:33

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; 
    } 
} 
+1

您的查询应该使用WHERE子句来让数据库过滤结果。客户端过滤从来不是一个好主意,而且非常低效。 – 2011-12-20 17:34:10

+0

@MarcB这是OP没有被篡改的部分。 – check123 2011-12-20 17:35:21

0

使用自动递增号码作为主键,具有独特的属性附加显示器ID作为向用户显示的ID。通过这种方式,您可以为您的内部处理设置唯一的ID,并且可以轻松更改显示ID。

+0

我掌握了我的主键这只是dosieid – 2011-12-20 17:30:33

+0

@Reddwarf:我告诉你,你应该把它们分开。 – CodeZombie 2011-12-20 17:32:25

+0

他们分开。用户ID是自动增量的自动用户ID是evry用户唯一的ID,并且我有dosieid,这对evry dosie是唯一的。也许我不明白? – 2011-12-20 17:56:01

0

这是一个可怕的设计。你应该:

  1. 没有让用户创建dosieid(自己创建它,把它给他们记录创建后)
  2. 首先尝试创建一个存根记录与分配dosieid,然后用信息更新
  3. 或使用的UUID,这需要一个更大的范围比9999

即使你检查的数量是独一无二的,在时间之间,当你检查它,你插入记录别人的时间可能已经采取了它。

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

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

+0

首先,dosie id只有一个id,在数据库userid dosieid中有三个id-s,还有一个,所以用户只能输入不是==的数字来表明他的userid ...好吧,我明白了等待和那个是我不能保护我的自我...我可以做一些不使用随机数字然后拉扯az吗?如何 – 2011-12-20 17:40:34