Php 未使用的随机数字
我正在尝试为我的网站生成一个唯一的“dosieid”编号。我的网站是一个人力资源计划解决方案,在该计划中,用户为其公司的员工创建dosie…random dosieid需要我,因此,当用户在现场创建dosie时,dosieid会自动显示以前未使用过的dosieid-s…数据库中不存在的dosieid。在其他情况下,我会使用自动增量,但在这种情况下,dosie尚未创建。如果用户对随机不满意,则表单中的dosieid必须是更改数字的选项。还有一个提示,数字必须在1到9999之间。有人能帮我吗?我尝试了许多代码,但我没有找到像这样的规范之一 这就是我到目前为止所做的。它获取随机数,但我不知道如何将该随机数与数据库行“dosiid”进行比较Php 未使用的随机数字,php,mysql,phpmyadmin,Php,Mysql,Phpmyadmin,我正在尝试为我的网站生成一个唯一的“dosieid”编号。我的网站是一个人力资源计划解决方案,在该计划中,用户为其公司的员工创建dosie…random dosieid需要我,因此,当用户在现场创建dosie时,dosieid会自动显示以前未使用过的dosieid-s…数据库中不存在的dosieid。在其他情况下,我会使用自动增量,但在这种情况下,dosie尚未创建。如果用户对随机不满意,则表单中的dosieid必须是更改数字的选项。还有一个提示,数字必须在1到9999之间。有人能帮我吗?我尝试
$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@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;
}
}