【问题标题】:Random dosieid number that is not used未使用的随机 dosieid 编号
【发布时间】:2011-12-20 16:43:44
【问题描述】:

我正在尝试为我的网站生成一个唯一的“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>";

【问题讨论】:

    标签: php mysql phpmyadmin


    【解决方案1】:

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

    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 个剂量记录时,您将获得一个无限循环
    2)数据库中的记录越多,这个循环找到“空”槽所需的时间就越长。随着您越来越接近 9999 条记录,您将需要很长时间才能找到一个空槽
    3) 如果您试图“隐藏”任何成员的 ID,以便用户不能简单地在某处增加 ID 参数以查看其他人的记录,那么有 FAR FAR FAR 更好/更简单的方法来做到这一点,例如加密发送给客户之前的 ID 值。

    【讨论】:

    • @Marc B 好的,我明白了,但是我怎样才能对其进行编码以获取第一个未使用的数字,即数据库中尚未使用的数字?喜欢从 a-z?
    • 然后,只需使用自动增量并保持不变。
    【解决方案2】:

    使用自动递增的数字作为主键,并使用具有 UNIQUE 属性的附加显示 ID 作为向用户显示的 ID。这样,您就有了一个用于内部处理的唯一 ID 和一个可以轻松更改的显示 ID。

    【讨论】:

    • 我的主键是dosieid
    • @Reddwarf:我告诉你的是你应该把它们分开。
    • 它们是分开的。 Userid 是自动递增的,因为它 selfe 用户 id 是每个用户唯一的 id,我有每个 dosie 唯一的 dosieid。也许我不明白?
    【解决方案3】:

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

    1. 不允许用户创建 dosieid(自己创建,创建记录后给他们)
    2. 尝试先使用分配的 dosieid 创建存根记录,然后使用信息更新它
    3. 或使用 UUID,这需要比 1-9999 大得多的范围

    即使您检查该号码是唯一的,在您检查它的时间和您插入其他人可能已经使用它的记录之间。

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

    另外,这个范围对于随机性要求来说太小了。

    【讨论】:

    • 首先,dosie id 只是一个 id,数据库 userid dosieid 中有 3 个 id-s,还有一个,所以用户只能在他的 userid 上输入不是 == 的数字来 dosieid ...好的,我理解等待,那是我无法承受的事情......我可以做一些不使用随机数的事情然后 rader a-z 吗?以及如何
    【解决方案4】:

    您可能还想了解仅数字哈希(检查算法的冲突率)-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;
        }
     }
    

    【讨论】:

    • 您的查询应该使用 WHERE 子句让数据库过滤结果。客户端过滤绝不是一个好主意,而且效率极低。
    • @MarcB 那是我没有篡改的 OP 部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    相关资源
    最近更新 更多