【问题标题】:Repeating a function重复一个函数
【发布时间】:2010-12-26 18:04:02
【问题描述】:

这是问题I posted here 的后续问题。

我正在使用以下代码给用户一个唯一的 id:

function NewGuid() { 
    $s = strtoupper(uniqid(rand(),true)); 
    $guidText = substr($s,0,8) . '-' . substr($s,8,4) . '-' . substr($s,12,4). '-' . substr($s,16,4). '-' . substr($s,20); return $guidText; 
} 

$Guid = NewGuid();
echo $Guid;

$alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';

function base_encode($num, $alphabet) { 
    $base_count = strlen($alphabet); 
    $encoded = '';

    while ($num >= $base_count) {
        $div = $num/$base_count;
        $mod = ($num-($base_count*intval($div)));
        $encoded = $alphabet[$mod] . $encoded;
        $num = intval($div);
    }

    if ($num) $encoded = $alphabet[$num] . $encoded;
    return $encoded;    
}

function base_decode($num, $alphabet) { 
    $decoded = 0;
    $multi = 1;

    while (strlen($num) > 0) {
        $digit = $num[strlen($num)-1];
        $decoded += $multi * strpos($alphabet, $digit);
        $multi = $multi * strlen($alphabet);
        $num = substr($num, 0, -1);
    }

    return $decoded;
}

echo base_encode($Guid, $alphabet);

因此,如果生成的 id 已在使用中,我希望此代码能够重复,直到生成全新的 id 并将其输入数据库。另外我是编程新手,所以请随时详细说明;)

有什么想法吗?谢谢。

【问题讨论】:

  • 请正确格式化您的代码。

标签: php mysql function uniqueidentifier


【解决方案1】:

超级简单。

你有 3 个功能。

一-主要生成guid函数。
二——子生成guid函数。
三 - 子插入引导功能。

子生成函数:
是否实际生成,返回一个 guid。

子插入功能:
尝试将 guid 插入数据库。失败时返回 false/null。真实/成功的数据。

主要功能:
在循环中:
调用子函数获取 guid。
调用子函数插入数据库中,其中 guid 是唯一键或主键。
失败时,重新启动循环。
成功退出循环并返回guid。

例子:

function GetGuid()
{
    do
    {
        $guid = GenerateGuid();
    } while (!InsertGuid($guid));
    return $guid;
}

function GenerateGuid()
{
    // do your stuff here.
    return $guid;
}

function InsertGuid($guid)
{
    $sql = 'INSERT INTO `guid_table` (`guid`) VALUES ('$guid')';
    $connection = //do sql connect here;
    return // do sql execution here which will return false/null on failure;
}

【讨论】:

  • 是的,这就是我想做的,问题是怎么做,我现在正在从书本中学习,书本没有太大帮助。
【解决方案2】:
function randr($j = 8){
$string = "";
    for($i=0;$i < $j;$i++){
        srand((double)microtime()*1234567);
        $x = mt_rand(0,2);
        switch($x){
            case 0:$string.= chr(mt_rand(97,122));break;
            case 1:$string.= chr(mt_rand(65,90));break;
            case 2:$string.= chr(mt_rand(48,57));break;
        }
    }
return $string; 
}

    do{
    $id = randr();
    $check = mysql_query("SELECT uniq FROM users WHERE uniq = '$id'");
    }while(mysql_num_rows($check) != 0);

考虑一下。

【讨论】:

    【解决方案3】:

    我必须升级/修复一个编写方式与你编码方式相似的系统,我得告诉你,我真的越来越讨厌原来的程序员了。

    想想你在做什么,如果另一个用户在你询问 guid 是否有效(并返回是)和你实际插入行之间创建了一个帐户,你仍然可能会发生冲突。太可怕了……

    但是制作数据库程序的人想到了这一点,并为您提供了一个轻松的选择:身份列。它们具有 3 大优势:

    • 保证唯一(或插入失败)
    • 它们会自动成为主键
    • 数据库会为您生成它们

    要使用它们,请将您的 ID 列设置为标识列,并在插入时这样写:

    insert into users (name, passwordhash, extrastuff) 
    values (@name, @passwordhash, @extrastuff);
    select @@identity -- or ident_current() for mysql
    

    然后您会取回为您生成的用户 ID 以供进一步处理。这一切都是同时完成的,无论有多少用户同时尝试。

    【讨论】:

    • 首先,您需要知道@@identity 是否存在于您的SQL 风格中。它在 MySQL 中不存在。当你的答案甚至不适用于最有可能使用的 SQL 版本时,为了把你的答案放在首位,而否决其他人的答案是非常粗鲁的。
    • 这就是为什么除了你的答案之外的每个答案都有反对票的原因吗?基本上,你只是重复了我的回答。
    • 您仍然在自己生成 id。
    【解决方案4】:

    我之前构建了类似的代码,我通常从一个空变量开始,我这样做 while ($variable == null) { }

    在 while 中,我创建了新代码,并对照数据库检查它,如果它还不存在,我设置 $variable = $new_code(这将打破 while),然后相应地继续。

    此外,我会记录任何可能发生的冲突

    希望对你有帮助

    【讨论】:

    • 理想情况下,您不希望发生任何冲突。无论如何没有它?如果可以,你能帮我编辑代码吗,我正处于早期学习阶段。
    • 如果永远不会发生冲突,那为什么还要检查数据库呢?
    【解决方案5】:

    可能是,稍微不同的方法

    我会将我的生成逻辑移动到一个存储过程中,并要求数据库生成一个独特的序列,就像在 oracle 中一样。

    这样,我就可以避免多次检查号码是否唯一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 2020-10-09
      相关资源
      最近更新 更多