web-dev-qa-db-ja.com

PHP日付付きの一意の注文番号を生成

次の12個の数値形式で一意の識別子を生成したい:

YYYYMMDDXXXX

例:

201403052318

どこ:

YYYYMMDDは現在の日付値であり、他のXXXXはランダムに生成された値です。

$today = date("Ymd");
$Rand = sprintf("%04d", Rand(0,9999));
$unique = $today . $Rand;

1日に必要な一意のボリュームは約100です。PHPを使用する方法を使用して、Rand値の重複を防止したり、すべてのIDを一意にしたりする必要がありますか?現在の時刻関数を使用して、これらの数値を最後に圧縮することができます。 4文字?

編集:テーブルの素数インデックスとしてMySQLデータベースに接続された一意の値。データベースに保存されている情報とは関係のない初期値です。

8
Ken Tang

Rand()に依存することはできません。重複が生成される可能性があります(Rand(0,9999)が重複を生成することは非常にまれですが、ある時点で発生します)。

したがって、Rand()に移動する代わりに、増分値(たとえば、1から開始)を作成し、生成された日付に追加します。

次回新しいIDを再生成するときは、その増分値のステータス(たとえば、どこかに保存した場合は1つ正しい必要がありますか?)を取得し、増分して新しい日付に追加します。

理想的な解決策ではありません..(批評家は歓迎します)

uniqidを_sha-1_およびtimeと組み合わせて使用​​し、最初の4文字に対してsubstr()を実行できます。

_<?php
$today = date("Ymd");
$Rand = strtoupper(substr(uniqid(sha1(time())),0,4));
echo $unique = $today . $Rand;
_

_OUTPUT :_

_201403094B3F
_
12

私は似たようなことをする必要がありました。時間を保ち、IDを一意に保つソリューションで、最終的にPHPfunctiontime()likeを使用するソリューションになりました。この

$reference_number = 'BFF-' . time(); BFFを、ビジネスロジックにとってより意味のあるものに変更できます。

私の一意の参照IDはBFF-1393327176のように見え、番号はUnixからリアルタイムに変換できます。これによりTue, 25 Feb 2014 11:19:36が得られます。

これがお役に立てば幸いです

7
Baig

一意の値が1回生成された場合は、Rand値を条件付きで選択し、その値を配列に格納する必要があります。配列は、-using inarray になります。 =-:

$amount = 100; // the amount of ids
$previousValues = array();
for ($i = 0; $i < $amount; $i++){    
    $Rand = Rand(0,9999);
    while (in_array($Rand, $previousValues)){
        $Rand = Rand(0, 9999);
    }
    $previousValues[] = $Rand;
    $today = date("Ymd");
    $unique = $today.$Rand;
    echo $unique."\n";
}

チェックアウト this demo

0
SaidbakR