【问题标题】:Generate a Unique ID using PHP and MYSQL使用 PHP 和 MYSQL 生成唯一 ID
【发布时间】: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。验证是否有两个回声以及脚本输入的位置。

标签: php mysql uid unique-id


【解决方案1】:

【讨论】:

  • 您好,抱歉,我们创建的 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 错误。

      【讨论】:

        猜你喜欢
        • 2010-11-17
        • 2011-06-20
        • 2010-12-11
        • 2014-05-26
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 2010-11-30
        相关资源
        最近更新 更多