PHP生成唯一订单号的6种方法
三月 06, 2019 | views
Comments 0
PHP生成唯一订单号其实是非常的简单了我们随便就可以整理多种生成方式了,这里小编整理了6种方式供各位参考。
做商城类项目经常需要生成唯一订单号,下面来个汇总!
方法一:
- 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').<a href="/tags.php/substr/" target="_blank">substr</a>(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
- //phpfensi.com
- */
- public static function getOrderSN() {
- return (date('y') + date('m') + date('d')) . str_pad((time() - <a href="/tags.php/strtotime/" target="_blank">strtotime</a>(date('Y-m-d'))), 5, 0, STR_PAD_LEFT) . substr(microtime(), 2, 6) . sprintf('%03d', rand(0, 999));
- }
目前在用的,基本保证不重复了,能用到2056年,觉得应该够了,以后有需求再扩展.
zend