iT邦幫忙

0

while 中處理訂單,如何產生不重複的數字?

  • 分享至 

  • twitterImage
while ($row = mysqli_fetch_array($aa)){

      $public_order_id = date('Ymd', time()).rand(1,999999);

因為在一瞬間會產生不止一筆
我目前很白痴的做法是用 rand.....
但是1,999999 還是有機率重複,因為是用 while 產生訂單!
所以搞不好第一筆是產生222,第二十筆也會有 222 的機率!
因為使用 time() 沒有用,時間會完全一模一樣,速度太快了
除非產生的訂單超過20筆,時間搓個位數可能才會+1
而且還要跟數據庫比對,如果有重複則回到上一步驟重新產生?
我有一個ID是給程式看的,所以用 AUTO_INCREMENT
但現在產生的是要給人看的
想問一下更好的方式???

q00153 iT邦新手 3 級 ‧ 2018-07-17 11:30:45 檢舉
有聽過 UUID 嗎?
Google 找一下相關套件就可以產生唯一識別碼了~
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
最佳解答

如果不是multi thread,重覆的問題不大會發生,用time()可以使用到毫秒,如果還擔心執行太慢重覆,可以配合uspleep:

function getOrderID(){
     $t = microtime(true);
     $micro = sprintf("%06d", ($t - floor($t)) * 1000000);
     uspleep(10000);
}

參考來源:
http://www.w3school.com.cn/php/func_misc_usleep.asp
https://stackoverflow.com/questions/3656713/how-to-get-current-time-in-milliseconds-in-php

有人提到UUID…差點忘了有這東西:
https://adon988.logdown.com/posts/2788007-php-create-uuid-and-guid

小魚 iT邦大師 1 級 ‧ 2018-07-17 11:57:52 檢舉

我是都用GUID, 不過我覺得用AUTO_INCREASE就好了...

AUTO_INCREASE也太不安全~

fillano iT邦超人 1 級 ‧ 2018-07-17 14:11:19 檢舉

也可以用auto_increment產生的id,再來產生hash,不過這樣要寫入兩次。

我要發表回答

立即登入回答