4

データベースをチェックせずにPHPで一意のシリアル番号または注文番号を生成するにはどうすればよいですか?

4

4 に答える 4

5

uniqidまたはuuid peclまたはcom_create_guid()uuid_createを参照してください

于 2010-06-21T05:53:44.407 に答える
1

mysql で自動インクリメント列を使用すると、いくつかの問題があります (特に、同等のノードにスケーリングされないという事実)。

シーケンス ジェネレーターはほぼどこでも (memcache、ファイル、データベース) 維持できますが、PHP は洗練されたファイル ロック セマンティクスを実装していません。大規模なボリュームには対応していません。

PL/SQL を利用できる場合は、そこにシーケンス ジェネレーターを実装することをお勧めします。代わりに、PHP と sqlite にジェネレーターを実装することを検討することもできます。

ジェネレーターを実装して、フォーマットの数値を作成することを強くお勧めします。

$use_number = ++$sequence_number . str_pad($node_id, '0', $max_nodes, STR_PAD_LEFT);

ここで、node_id は、現在のシーケンス番号が格納されているストレージ サブストレートを一意に参照する番号です。また、$max_nodes は、$node_id で見つかった最大桁数よりもいくらか多くなっています (たとえば、3 の場合、最大 999 ノードが許可されます)。

または、2 つの部分の間に句読点を含む文字列として扱います (および/または 2 つの部分を異なるデータベース列に格納します)。

C.

于 2010-06-21T08:40:34.707 に答える
1

一意性を保証したい場合は、何かに対してチェックする必要があります。フラット ファイルを使用して、最近使用した番号だけを格納することもできますが (これをインクリメントできます)、データベースを使用しないのはばかげています。番号に関連付けられた他の情報 (連絡先の詳細、注文内容など) を保存する必要があり、データベースはそのために理想的です。

于 2010-06-21T05:50:59.230 に答える
0

MySQL データベースを使用している場合は、auto_increment列を使用して、データベースを事前にチェックする必要なく、シリアル オーダー番号を生成できます。新しい行を挿入すると、PHP でその列を読み書きしなくても、新しい一意の ID がその列に割り当てられます。

または、データベースを使用せずにグローバルに一意の ID が必要な場合は、PHP のuniqid () 関数を使用できます。これは文字列を返すことに注意してください。複数の物理マシンを使用するか、サーバー間を移動する場合は、マシンごとに異なるプレフィックス (最初の引数) を追加する必要があります。同じマシンで使用する場合、この関数が同じ文字列値を 2 回返すことはありません。

于 2010-06-21T05:53:29.307 に答える