PHP產生唯一訂單號的6種方法

來源:互聯網
上載者:User


做商城類項目經常需要產生唯一訂單號,下面來個匯總!

方法一:

return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);

方法二: 正在使用。。。

/** * * uniqid - 官方是這樣說的: * Gets a prefixed unique identifier based on the current time in microseconds. */function build_order_no(){    return date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);}


用uniqid擷取一個基於當前的微秒數產生的唯一不重複的字串(但是他的前7位貌似很久才會發生變動,所以不用考慮可刪除),取其第8到13位。但是這個字串裡面有英文字母,咋辦?
用ord擷取他的ASCII碼,所以就有了下一步:用str_split把這個字串分割為數組,用array_map去操作(速度快點)。
然後返回的還是一個數組,KO,在用implode弄成字串,但是字元長度不定,取前固定的幾位,然後前面加上當前的年份和日期,這個方法產生的訂單號,全世界不會有多少重複的。
當然,除非你把伺服器時間往前調,但是調也不用怕,哥不相信他會在同一微秒內下兩次訂單,網路資料轉送也要點時間的,即便你是在本地。


方法三:以前使用。。。

public function make_order($user_id) { return mt_rand(10,99) . sprintf('%010d',time() - 946656000) . sprintf('%03d', (float) microtime() * 1000) . sprintf('%03d', (int) $user_id % 1000); }

方法四:

$yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J');$orderSn = $yCode[intval(date('Y')) - 2011] . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99

));


方法五 產生24位唯一訂單號碼

//產生24位唯一訂單號碼,格式:YYYY-MMDD-HHII-SS-NNNN,NNNN-CC,其中:YYYY=年份,MM=月份,DD=日期,HH=24格式小時,II=分,SS=秒,NNNNNNNN=隨機數,CC=檢查碼  @date_default_timezone_set("PRC");  while(true){   //訂購日期   $order_date = date('Y-m-d');   //訂單號碼主體(YYYYMMDDHHIISSNNNNNNNN)   $order_id_main = date('YmdHis') . rand(10000000,99999999);   //訂單號碼主體長度   $order_id_len = strlen($order_id_main);   $order_id_sum = 0;   for($i=0; $i<$order_id_len; $i++){    $order_id_sum += (int)(substr($order_id_main,$i,1));   }   //唯一訂單號碼(YYYYMMDDHHIISSNNNNNNNNCC)   $order_id = $order_id_main . str_pad((100 - $order_id_sum % 100) % 100,2,'0',STR_PAD_LEFT);     if($result = sqlite_query($db,"SELECT * FROM orders WHERE order_id='$order_id'")){    if(sqlite_num_rows($result) == 0){     break;    }   }

例子六

/** * 產生16位純數字訂單號 * 最大支援時間到 2056-12-31 23:59:59 * * @access public * @return string */ public static function getOrderSN() { return (date('y') + date('m') + date('d')) . str_pad((time() - strtotime(date('Y-m-d'))), 5, 0, STR_PAD_LEFT) . substr(microtime(), 2, 6) . sprintf('%03d', rand(0, 999)); }

目前在用的,基本保證不重複了,能用到2056年,覺得應該夠了,以後有需求再擴充

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.