1

こんにちは、ID と UID を処理するシステムを作成しています。UID はランダムに生成していますが、少し行き詰まっています。フィールドは使用される一意のフィールドであるため、現在データベースに存在しない UID を常に生成する必要があります。実際の ID を公開しないように、フロント エンドで。

要約すると、現在 DB に存在しない一意の ID を生成しようとしています。作業していない部分は、db のクロスチェックであるため、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;

    }

}

}
4

6 に答える 6

3

PHPには、という関数がありますuniqid()

http://php.net/manual/en/function.uniqid.php

于 2012-03-12T15:22:15.573 に答える
3

http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid

于 2012-03-12T13:46:47.930 に答える
3

時間を使用できるユニックUIDを生成するには、2つのランダムデータを使用して、レコードが同じ秒で追加されるのは非常に小さなチャンスだったと思います。

そのようにあなたに返す関数を書いてください

function generate_uid(){
 return md5(mktime()."-".rand()."-".rand());
}
于 2012-03-12T14:56:15.350 に答える
1

他の人がしたように、ID の生成について話すことはできますが、これはあなたの質問ではありません。あなたのクエリは問題ないようです。0 行が返されたが、データベース内にコードが見つかったように見える場合は、おそらく同じに見えるだけで、実際にはそうではありません。空白でパディングできます。

于 2012-03-12T13:56:20.887 に答える
0

これを解決する 1 つの方法は、ユーザー データベースの最後の行を選択し、スクリプトで 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);
}
于 2012-03-12T13:48:13.840 に答える
0

私はすでに問題が何であるかを理解しました。皆さんに言ったように、コード生成は問題ではありませんでした! 問題は、クロス チェックが正しく機能していないことでした。だから私がしたことは、このループを削除したことだけです

while($i < $characters) 
{ 

    $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
    $i++;

}

これが原因で、私の一意の ID が間違ってしまいました。

于 2012-03-16T14:55:37.343 に答える