1

嗨,我正在创建一个处理 ID 和 UID 的系统,我们随机生成的 UID 但我有点卡住了,我需要始终生成数据库中当前不存在的 UID,因为该字段是使用的唯一字段在前端,以免暴露真实ID。

所以回顾一下,我正在尝试生成一个当前在数据库中不存在的唯一 ID,我没有工作的部分是数据库中的交叉检查,所以它有时会给出一个已经存在于数据库中的数字,即使它不应该提前感谢。

到目前为止,这是我的代码:

function uniqueID($table) 
{
$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

$possible = '1234567890';
$code = '';
$characters = mt_rand(7,14);
$i = 0;

while($i < $characters) 
{ 

    $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
    $i++;

}

$result = $db->query('
SELECT uniqueID
FROM '.$table.'
WHERE uniqueID = "'.$code.'"
LIMIT 1
');

$totalRows = $result->num_rows;

if(!$result)
{

    return $db->error;

}
else
{

    if($totalRows > 0)
    {

        return uniqueID($table);

    }
    else
    {

        return $code;

    }

}

}
4

6 回答 6

3

http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid

于 2012-03-12T13:46:47.930 回答
3

要生成 unic UID,您可以使用时间,我认为这是一个很小的变化,记录将在同一秒内添加,带有两个随机数据。

写一些函数,像这样返回给你

function generate_uid(){
 return md5(mktime()."-".rand()."-".rand());
}
于 2012-03-12T14:56:15.350 回答
3

在 PHP 中有一个函数叫做uniqid()

http://php.net/manual/en/function.uniqid.php

于 2012-03-12T15:22:15.573 回答
1

我可以像其他人一样谈论生成 id,但这不是你的问题。您的查询似乎很好。如果它返回 0 行但您似乎在数据库中找到了代码,那么很可能它只是看起来相同,但实际上并非如此。它可以用空格填充。

于 2012-03-12T13:56:20.887 回答
0

解决此问题的一种方法是选择用户数据库的最后一行并让脚本检查 id 字段(您可以通过在后代模式下按 ID 执行选择排序来实现此目的),然后您可以使用该信息随机化数字大于该 ID。

编辑

$result = $db->query('
SELECT uniqueID
FROM '.$table.'
');

$already_in_database = array();
while ($row = mysql_fetch_array($result)){
    $already_in_database[] = $row['UID'];    
}

$new = rand(0,$some_max_value);
while(in_array($new,$already_in_database)){
    $new = rand(0,$some_max_value);
}
于 2012-03-12T13:48:13.840 回答
0

我已经弄清楚了问题所在,正如我向大家提到的那样,代码生成不是问题!问题是交叉检查没有正常工作。所以我所做的只是删除了这个循环

while($i < $characters) 
{ 

    $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
    $i++;

}

因为这导致我的唯一 ID 最终出错。

于 2012-03-16T14:55:37.343 回答