使用 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 > 0)
和 echo('RETURN');
内添加 echo('RERUN');
if($totalRows > 0)
的 else。验证是否有两个回声以及脚本输入的位置。
【参考方案1】:
http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid
【讨论】:
您好,抱歉,我们创建的 UID 仅由数字组成,因此没有多大帮助... 那你有问题了。UUID()
是一个经过验证的函数,它总是会返回一个唯一的字符串(实际上,它是一个数字,但是..)。如果您正在生成随机数以“隐藏” auto_increment-ed 整数 - 您做错了。使用 UUID
或至少 php 的 uniqid
并将您的唯一列更改为 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