我正在尝试为我的网站生成一个独特的“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>";
答案 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)
这是一个糟糕的设计。你应该:
即使您检查该号码是唯一的,在您检查它的时间和您插入记录的时间之间,其他人可能已经接受了该号码。
在任何情况下都不应该通过随机选择数字来找到空ID。这使得您的程序执行时间不确定,如果您最终获得5000名员工,则可能需要等待很长时间。
此外,此范围对于随机性要求而言太小。