使用 PHP 和 MYSQL 生成唯一 ID

Posted

技术标签:

【中文标题】使用 PHP 和 MYSQL 生成唯一 ID【英文标题】:Generate a Unique ID using PHP and MYSQL 【发布时间】:2012-03-28 21:59:38 【问题描述】:

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

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

这是我目前的代码:

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;

    




【问题讨论】:

请在 $totalRows 中做一个 var_dump 你有什么方法可以发现数据库中已经存在代码? @Leif 上面代码中的方法可以在Gabriel的下半部分看到,$totalRows是一个int,不管我们查询的总行数是多少。 @AndréFigueira 在 if($totalRows &gt; 0)echo('RETURN'); 内添加 echo('RERUN'); if($totalRows &gt; 0) 的 else。验证是否有两个回声以及脚本输入的位置。 【参考方案1】:

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

【讨论】:

您好,抱歉,我们创建的 UID 仅由数字组成,因此没有多大帮助... 那你有问题了。 UUID() 是一个经过验证的函数,它总是会返回一个唯一的字符串(实际上,它是一个数字,但是..)。如果您正在生成随机数以“隐藏” auto_increment-ed 整数 - 您做错了。使用 UUID 或至少 phpuniqid 并将您的唯一列更改为 varchar。【参考方案2】:

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

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

function generate_uid()
 return md5(mktime()."-".rand()."-".rand());

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

谢谢,是的,我想,但是我从字段中删除了唯一键并允许添加重复项,并且没有填充该函数放弃了已经存在的代码,唯一的原因是我可以想为什么它不能递归工作,但我不明白为什么...... 从概念的角度来看,我强烈建议再次添加唯一键。您不希望那里有重复的键,对吗?你必须能够通过它来识别用户。您仍将需要您的 id 检查代码,但如果您在未来某处将错误放入此代码中,则唯一密钥违规将提醒您并防止事情变得真正糟糕。 您好,我刚刚删除了它以进行检查,显然会放回去,哈哈,不用担心 - 我只需要在数据库中查看是否添加了重复项。【参考方案5】:

解决此问题的一种方法是选择用户数据库的最后一行并让脚本检查 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);

【讨论】:

问题是我们正在生成随机 ID,所以这意味着如果我们一次创建一个非常大的 ID,那么其余生成的 ID 只会比那个大,我们会丢失一个很多ID 然后您可以从数据库中选择所有 UID 到一个数组中,并有一个循环生成随机数并检查该数组(更新答案中的代码 谢谢,是的,我可以这样做,但这似乎太笨重了,因为我将在需要 uid 字段的任何地方执行此操作,问题是该表将有数百万行所以我需要一些更快的东西,最终可能只是让 MYSQL 完成工作。【参考方案6】:

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

while($i < $characters) 
 

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


因为这导致我的唯一 ID 错误。

【讨论】:

以上是关于使用 PHP 和 MYSQL 生成唯一 ID的主要内容,如果未能解决你的问题,请参考以下文章

使用 select last_insert_id 生成唯一 ID

使用 auto_increment 生成 PHP 短唯一 ID?

PHP uniqid 高并发生成不重复唯一ID

PHP生成唯一ID的三种方法

PHP实现生成唯一id的雪花算法

mysql 在插入数据时,怎么样做到自动生成16位唯一的ID?