0

ランダムな ID を作成する関数を作成しましmakeid();た。ID が一意であることを確認するために、ID が既に存在するかどうかを確認する SQL ステートメントがあります。

$does_id_exist = mysql_query("SELECT COUNT(*) AS count FROM signups WHERE affid='$affid'");
if(mysql_num_rows($does_id_exist) == 1) 
  { 
  #loop function and perform query again
  }
else
  {
  #insert record
  }

そのため、関数のループに問題があります。関数をループしてチェックをmakeid()実行し、それぞれが一意であることを確認するにはどうすればよいですか。$does_id_existID

--UPDATE-- 明確にするために- 私のコードは id を次のようにしますが、YES@281Eこの id をユーザーレコードに挿入する前に。他のユーザーが既にこの ID を持っているかどうかを確認する必要があります。別のユーザーがこの ID を持っている場合、そのイベントが私の関数をトリガーして新しい ID を作成する必要があります。たとえばWOW!29E3、SQL/クエリをもう一度チェックして、他のユーザーがその IDを持っていないことを確認します。失敗した場合はループを続行するか、id が使用可能な場合は終了して INSERT を実行します。

4

2 に答える 2

0

データベーステーブルで主キーを使用するか、次のようなものを使用できます。

<?php
    // the id to insert
    $newId = null;

    // populate with results from a SELECT `aff_id` FROM `table`
    $currentIds = array(); 

    // prepopulate
    for( $i=0; $i<100000; $i++ )
    {
        $currentIds[] = "STRING_" + rand();
    }

    // generate at least one id
    do
    {
        $newId = "STRING_" + rand();
    }
    // while the id is taken (cached in $currentIds)
    while( in_array($newId, $currentIds) );

    // when we get here, we have an id that's not taken.
    echo $newId;    
?>

出力:

STRING_905649971 (実行時間 95 ミリ秒);

クエリを繰り返し実行することは絶対にお勧めしません。トラフィック量が十分に多い場合は、おそらく挿入前の最終チェックです。

于 2012-09-06T18:57:31.990 に答える
-1

COUNT(*)行数を知る必要がないため (ID が一意である必要があるため、0 または 1 である必要があります)、DB が行を見つけても、テーブル全体がカウントされるかどうかを確認します。1行を取得したかどうかは本当に気にするので、そのIDを持つ行を選択するだけで十分です. また、使用を避ける必要がありrand()ます。これはご覧のとおり役に立たず、「空きスロット」を見つける前に実行できるループの数を予測できません。日付の接頭辞や毎日増加する接頭辞など、予測可能なものを使用してください。データセットを絞り込むのに役立つものなら何でも。しかし、今のところ (疑似コード!):

$id = null;
while( $id == null ) {
  $newId = 'prefix' . rand();

  mysql_query("SELECT `affid` FROM `signups` WHERE `affid`='${newId}'");
  if( mysql_num_rows() == 0) {
    $id = newId;
    break;
  } 
}

処理を高速化するために、DB にインデックスが作成されていることを確認してください。

編集:キャッシュを高速化するのに役立つことに同意します(@Joshの例に基づいて自分で簡単に追加できます)が、それでも、これは間違った場所で修正されていると思います. 可能であれば、ID の生成方法を再考してください。自動インクリメントである必要はありませんが、rand()役立つよりも予測可能なものです。PREFIX-AX3TKID を覚えやすいものにする必要がなく、ID を連続させてもセキュリティ上の問題がない場合は、基数が 10 以外の数字を使用してください (つまり、26 を使用するとすべての数字と文字が使用されるため、末尾が.あなたが望むと同時に、次のIDをすばやく簡単に生成できます

于 2012-09-06T19:02:08.867 に答える