2011-12-20 10 views
-2

私のウェブサイトに一意の「dosieid」番号を生成しようとしています。私のウェブサイトは人事プログラムのソリューションです。そのプログラムのユーザーは自分の会社の従業員のdosieを作成します。ランダムなdosieidは、フィールドdosieidにdosieを作成するユーザーが、以前使用されていないdosieidを自動的に表示するときに、データベースに存在しないdosieid。それ以外の場合は、自動インクリメントを使用しますが、この場合はdosieはまだ作成されていません。そして、dosieid形式では、ユーザーがランダムでないと番号を変更するオプションが必要です。もう1つのヒントは、数字が1から9999の間でなければならないことです。誰かが私を助けることができますか?私は多くのコードを試してきましたが、私はこの仕様のもののようなものを見つけませんでした。使用されていないランダムなdosieid番号

これまで私が行ってきたことです。それは乱数を取得しますが、その乱数をデータベース行 "dosieid"と比較する方法はわかりません。

$id_num = mt_rand(1,9999); 

$query = "SELECT dosjeid FROM albums"; 

$result = mysql_query($query) or die(mysql_error()); 

while($account = mysql_fetch_array($result)){ 

    if ($id_num == $account['id']){ 

     $id_num = mt_rand(1,9999); 

    } 

} 
echo"$id_num<br>"; 

答えて

2

これは非常に畳み込まれています...なぜ自動インクリメントが足りないのですか?このコードは正しく動作しません。何らかの理由であなたは乱数を使用する必要がある場合は、このようにそれを行うだろう:

while(true) { 
    $id_rand = mt_rand(1,9999); 
    $result = mysql_query("SELECT count(*) FROM albums WHERE dosjeid=$id_rand") or die(mysql_error()); 
    $row = mysql_fetch_row($result); 
    if ($row[0] == 0) { 
     break; // our random number isn't in the database, so exit the loop 
    } 
} 

をしかし、ここではこのいくつかの問題だ:

1)あなたは時に無限ループを取得しますあなたは9999のdosieレコードに達する
2)データベースにレコードがあるほど、このループが「空き」のスロットを見つけるまでにかかる時間が長くなります。あなたが9999レコードに近づくにつれて、空きスロット1つを見つけるのに時間がかかります
3)誰かのメンバーのIDを「隠す」ようにして、ユーザーが単純にインクリメントできないようにする場合他の人の記録を見るためのIDパラメータですが、ID値をクライアントに送信する前に暗号化するなど、ファーファーファーファーファーファーファーファーファーファーファーファーファーファーファーファーファーファーファーファーファーファーファーファーファーファーファーファーファーファー

+0

+1あなたはそれを良くしました。マーク! – check123

+0

@マークB私は理解します。しかし、最初に未使用の番号をデータベースでまだ使用されていない番号にするには、どうすればいいですか? a-zのように? –

+0

次に、自動インクリメントを使用してそのままにしておきます。 –

0

あなたはまた、数について読むことをお勧めしますのみ(アルゴリズムの衝突速度に確認してください)ハッシュ - php: number only hash?

function doesIdExists($id) 
{ 
    $query = "SELECT dosjeid FROM albums"; 
    $result = mysql_query($query) or die(mysql_error()); 
    while($account = mysql_fetch_array($result)) 
    { 
     if ($id_num == $account['id']) 
      return true; /* The id is taken */ 
    } 
    return false; /* Not taken */ 
} 

$recNotAdded = true; 

while($recNotAdded) 
{ 
    $rand = mt_rand(1,1000); //Whatever your numbers 
    $doesExist = doesIdExists($rand); 
    if(!$doesExist) 
    { 
     /* Add to DB */ 
     $recNotAdded = false; 
    } 
} 
+1

クエリでWHERE句を使用すると、DBフィルタに結果が反映されます。クライアント側のフィルタリングは決して良い考えではなく、非常に非効率的です。 –

+0

@MarcBそれは私が改ざんしていないOPからの部分です。 – check123

0

あなたの主キーとUNIQUE属性を持つ追加のディスプレイIDとして自動インクリメント番号を使用しますIDとしてユーザに示される。これにより、内部処理のための一意のIDと簡単に変更できる表示IDが得られます。

+0

私は主キーを持っています。これはちょうどdosieidです。 –

+0

@ Reddwarf:私はあなたにそれらを分けなければならないと言っています。 – CodeZombie

+0

これらは分離されています。 Useridはautoincrementです。selfe user idはevryユーザーに固有のIDで、evry dosieに固有のdosieidを持っています。多分私は理解できないでしょうか? –

0

これはひどいデザインです。あなたは、どちらかのはず:

  1. ユーザーがdosieid(レコードが作成された後、彼らにそれを与えて、それを自分で作成)
  2. が割り当てられdosieidで第1のスタブレコードを作成してみて、その後の情報で更新作成できません
  3. またはあなたがそれをチェックする時間と時間の間にあなたが他のレコードの誰かを挿入し、あなたは数がユニークだったことを確認した場合でも1-9999

よりもはるかに大きな範囲を必要とする、UUIDを使用しますそれを取ったかもしれない。

数字を無作為に選んで空のIDを見つけてください。これにより、プログラムの実行時間が非決定的になります。最終的に5000人の従業員を取得すると、に長時間待つことができます

また、この範囲はランダム性要件のためには小さすぎます。

+0

最初に、dosie idはidが1つだけです。データベースのuseridのdosieidに3つのid-sがあります。もう1つで、ユーザーは自分のuseridの上にdosieidに==を付けることができません。私は私の自己をafordすることができない何か...私は乱数を使用していないrader azを何かすることができますか?そしてどうやって –

関連する問題