Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 未使用的随机数字_Php_Mysql_Phpmyadmin - Fatal编程技术网

Php 未使用的随机数字

Php 未使用的随机数字,php,mysql,phpmyadmin,Php,Mysql,Phpmyadmin,我正在尝试为我的网站生成一个唯一的“dosieid”编号。我的网站是一个人力资源计划解决方案,在该计划中,用户为其公司的员工创建dosie…random dosieid需要我,因此,当用户在现场创建dosie时,dosieid会自动显示以前未使用过的dosieid-s…数据库中不存在的dosieid。在其他情况下,我会使用自动增量,但在这种情况下,dosie尚未创建。如果用户对随机不满意,则表单中的dosieid必须是更改数字的选项。还有一个提示,数字必须在1到9999之间。有人能帮我吗?我尝试

我正在尝试为我的网站生成一个唯一的“dosieid”编号。我的网站是一个人力资源计划解决方案,在该计划中,用户为其公司的员工创建dosie…random dosieid需要我,因此,当用户在现场创建dosie时,dosieid会自动显示以前未使用过的dosieid-s…数据库中不存在的dosieid。在其他情况下,我会使用自动增量,但在这种情况下,dosie尚未创建。如果用户对随机不满意,则表单中的dosieid必须是更改数字的选项。还有一个提示,数字必须在1到9999之间。有人能帮我吗?我尝试了许多代码,但我没有找到像这样的规范之一

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

$id\u num=mt\u rand(19999);
$query=“从相册中选择dosjeid”;
$result=mysql\u query($query)或die(mysql\u error());
而($account=mysql\u fetch\u array($result)){
如果($id_num==$account['id']){
$id_num=mt_rand(19999);
}
}   
回显“$id_num
”;
这非常复杂。。。为什么自动递增的数字还不够?这段代码也永远不会正常工作。如果出于任何原因,您必须使用随机数,那么您可以这样做:

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作为显示给用户的id。这样,您就有了一个用于内部处理的唯一id和一个易于更改的显示id。

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

  • 不允许用户创建dosieid(自己创建,在创建记录后交给他们)
  • 尝试先用指定的ID创建存根记录,然后用信息更新它
  • 或者使用UUID,这需要比1-9999更大的范围
  • 即使您检查该号码是否唯一,在您检查该号码和插入该记录的时间之间,其他人可能已经取得了该号码

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


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

    我有主键,这只是dosieid@Reddwarf:我要告诉你的是,你应该将它们分开。它们是分开的。Userid是它的自动增量selfe user id是evry user唯一的id,我有dosiid,它是evry dosie唯一的id。也许我不知道erstand?您的查询应该使用WHERE子句让DB过滤结果。客户端过滤从来都不是一个好主意,而且效率很低。@MarcB这是OP中我没有篡改过的部分。首先,dosie id只有一个id数据库中有3个id-s userid dosieid和一个以上,所以用户只能输入not==发送他的用户ID…好的,我理解等待,这是我自己不能做的事情…我能做一些不使用随机数的事情吗,然后rader a-z?和how@MarcB好的,我明白了,但是我怎样才能把它编码成第一个未使用的数字,即数据库中还没有使用的数字?比如a-z?然后就用它一个自动增量,并保持不变。
    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
        }
    }
    
    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;
        }
     }