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

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
但現在產生的是要給人看的
想問一下更好的方式???

阅读 2.6k
3 个回答

1: uuid
2:使用更小的微秒

// 生成一万个
for ($i = 0; $i < 10000; ++ $
    
    do {
        $time = str_replace('.', '', microtime(true));
        // 这样子重复的概率已经比较小了,如果还怕重复,只能手动筛选了
        $key = $time . str_pad(1, 9999, STR_PAD_LEFT);
        
        // 可以装进数组判断,但注意内存
        if (不存在) {
            // 存起来
            break;
        }
        
        // 不存在 继续循环
    } while(true);
    
}

我觉得你这个用date('Ymd').uniqid().rand(10000,99999)够了

订单编号可以拼上用户标识(user_id)和用户订单数。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题