2010-12-26 17 views
1

これは質問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が生成され、データベースに入力されます。また、私はプログラミングの初心者ですので、お気軽にご説明ください)

ご意見はありますか?ありがとう。私は前に類似したコードを建て

+0

コードを正しくフォーマットしてください。 – Oswald

答えて

2

超簡単。

あなたには3つの機能があります。

1つのメイン生成guid関数。
2 - Subはguid関数を生成します。
3つのサブ挿入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; 
} 
+0

はい、それは私がしたいことです、問題はそれを行う方法です、私は現時点で本から学んでいます、本はそれほど多くの助けではありません。 – AAA

+0

例が追加されました。 – evan

0

、私は通常、ヌル変数で始まり、しばらく($変数== NULL){}

私はしばらくの内部で行う、私は新しいコードを作成するデータベースに対してそれをチェックし、それがまだ存在しない場合は、$ variable = $ new_code(これは中断します)を設定し、それに応じて進みます。

また、私は

希望を発生する可能性の衝突を記録し、この

+0

理想的には、衝突を起こさないことです。とにかくそれなしで?コードを編集する手助けができたら、私は初期の学習段階です。 – AAA

+0

衝突が起こらない場合、なぜデータベースをチェックする必要がありますか? – joshtronic

1
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); 

はこれについて考えることができます。

0

が若干異なるアプローチ

私は、ストアドプロシージャ内の私の世代のロジックを移動し、Oracleのようにユニークなシーケンスを生成するためにデータベースを求めるだろうとすることができます。

この方法では、番号が一意であるかどうかを確認するために数多くの旅行を避けることができます。

1

私はあなたのコードと同じように書かれたシステムをアップグレード/修正する必要があります。私は本当に元のプログラマーを憎んできました。

guidが有効かどうかを尋ねるときに別のユーザーがアカウントを作成したときに、実際に行を挿入しても衝突が発生する可能性があります。それはひどいことを超えています...

しかし、データベースプログラムを作った人は、これを考えて、あなたに痛みのない代替手段を提供します。

  • 一意であることが保証(または挿入が失敗した)
  • それらは自動的にデータベースがあなた
のためにそれらを生成
  • 主キーに作られている:彼らは、3つの主要な利点を提供します

    これらを使用するには、ID列をID列にします。挿入を行うときは、次のように記述します。

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

    さらに処理のために生成されたユーザーIDが返されます。何人ものユーザーが同時にこれを試していても、これはすべて同時に実行されます。

    +0

    まず、@@アイデンティティがSQLのフレーバーに存在するかどうかを知る必要があります。 MySQLには存在しません。あなたのものがSQLの最も一般的に使用されるバージョンのために働いていないときにあなたの上に置くだけで他の人の答えをdownvoteにかなり失礼です。 – evan

    +0

    が修正されました。そして私は誰にもダウンボケをしなかった。 – Blindy

    +0

    すべての答えはあなたのものですが、ダウンボートがあるのはなぜですか?基本的に、あなたは私の答えを繰り返しました。 – evan

    関連する問題