做商城類項目經常需要產生唯一訂單號,下面來個匯總!
方法一:
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年,覺得應該夠了,以後有需求再擴充