回答受付が終了しました

ID非公開

2021/5/6 19:56

44回答

PHPを使った重複しないランダム数字の付け方についてご教示ください。

PHP27閲覧xmlns="http://www.w3.org/2000/svg">500

回答(4件)

0

>ごくごくわずかですが偶然に同じ番号が発行されてしまう まずは、これをどうにかしましょう。ランダムに生成したとしても重複チェックは必須になります。注文番号がプライマリキーのテーブルにinsertしたときに重複キーになったら再度採番するだけです。 既存データが注文番号以外もプライマリキーになっているなど、注文番号だけで重複チェックができないならば、専用のテーブルを作ってでもやるべき(そのテーブルは日付が変わったタイミングで truncate table してもいいでしょう)。

0

> (4桁の)重複しない数字を発行するロジック 計算的に求めるのは多分できないので、 テキトーに発生させた乱数を発行済み注文番号と突合させて確認するとか 乱数を格納したテーブルから順次(ランダムも可)取り出しつつ削除していくとか __テーブルの行数が一定数以下になったらとか __日付が変わった時点で再度生成して充填しておく > 偶然に同じ番号が発行されてしまうことがある それが起きているという事は、現状のロジックに穴があるのでは? 同じ様な手順だと、上記の様な方法を採っても重複する可能性が拭えないと思います。 __ロックとかが出来ていないとか... > 注文番号を、接頭語+年+月+日+4桁 乱数にしても、一日1500件あるとすると、1500 ÷ 10000 = 0.15 0.15 の逆数を取ると 6.67 つまり、4桁数字を変えて7回試すと命中するかもって事では? そんな仕様で大丈夫でしょうか? 注文番号を見ただけで注文日が解るような仕組みにしたいのだろうと思いますが、そこにどんな意味があるのでしょう? 注文日は日付として伝票等に表記すれば良いだけだと思います。 DBで管理するなら、注文番号で検索時に知る事は可能でしょう。 注文番号が予測できるのはセキュリティホールだと思いませんか? 10桁前後(もっと長くても可)の数値とチェックデジット(末尾や先頭ではなく秘密の〇桁目なんてのが良さげ)なんてのが良いんじゃないかと。 後は、桁数を長くとってQRコード化し、手入力をしない(したくなくなるくらい長くする)様にするとか。