Home > php教程 > PHP源码 > PHP生成唯一订单号的6种方法

PHP生成唯一订单号的6种方法

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-06-08 17:20:04
Original
2994 people have browsed it

PHP生成唯一订单号其实是非常的简单了我们随便就可以整理多种生成方式了,这里小编整理了6种方式供各位参考。

<script>ec(2);</script>


做商城类项目经常需要生成唯一订单号,下面来个汇总!

方法一:

return date(&#39;Ymd&#39;) . str_pad(mt_rand(1, 99999), 5, &#39;0&#39;, STR_PAD_LEFT);
Copy after login

方法二: 正在使用。。。

/**

 *

 * uniqid - 官方是这样说的:

 * Gets a prefixed unique identifier based on the current time in microseconds.

 */

function build_order_no()

{

    return date(&#39;Ymd&#39;).substr(implode(NULL, array_map(&#39;ord&#39;, str_split(substr(uniqid(), 7, 13), 1))), 0, 8);

}
Copy after login


用uniqid获取一个基于当前的微秒数生成的唯一不重复的字符串(但是他的前7位貌似很久才会发生变动,所以不用考虑可删除),取其第8到13位。但是这个字符串里面有英文字母,咋办?
用ord获取他的ASCII码,所以就有了下一步:用str_split把这个字符串分割为数组,用array_map去操作(速度快点)。
然后返回的还是一个数组,KO,在用implode弄成字符串,但是字符长度不定,取前固定的几位,然后前面加上当前的年份和日期,这个方法生成的订单号,全世界不会有多少重复的。
当然,除非你把服务器时间往前调,但是调也不用怕,哥不相信他会在同一微秒内下两次订单,网络数据传输也要点时间的,即便你是在本地。


方法三:以前使用。。。

public function make_order($user_id)

 {

 return mt_rand(10,99)

 . sprintf(&#39;%010d&#39;,time() - 946656000)

 . sprintf(&#39;%03d&#39;, (float) microtime() * 1000)

 . sprintf(&#39;%03d&#39;, (int) $user_id % 1000);

 }
Copy after login

方法四:

$yCode = array(&#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;D&#39;, &#39;E&#39;, &#39;F&#39;, &#39;G&#39;, &#39;H&#39;, &#39;I&#39;, &#39;J&#39;);

$orderSn = $yCode[intval(date(&#39;Y&#39;)) - 2011] . strtoupper(dechex(date(&#39;m&#39;))) . date(&#39;d&#39;) . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf(&#39;%02d&#39;, rand(0, 99
Copy after login

));


方法五 生成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(&#39;Y-m-d&#39;);
   //订单号码主体(YYYYMMDDHHIISSNNNNNNNN)
   $order_id_main = date(&#39;YmdHis&#39;) . 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,&#39;0&#39;,STR_PAD_LEFT);
  
   if($result = sqlite_query($db,"SELECT * FROM orders WHERE order_id=&#39;$order_id&#39;")){
    if(sqlite_num_rows($result) == 0){
     break;
    }
   }
Copy after login

例子六

/** 

* 生成16位纯数字订单号 

* 最大支持时间到 2056-12-31 23:59:59 

* 

* @access public 

* @return string 

*/ 

public static function getOrderSN() { 

return (date(&#39;y&#39;) + date(&#39;m&#39;) + date(&#39;d&#39;)) . str_pad((time() - strtotime(date(&#39;Y-m-d&#39;))), 5, 0, STR_PAD_LEFT) . substr(microtime(), 2, 6) . sprintf(&#39;%03d&#39;, rand(0, 999)); 

}
Copy after login

目前在用的,基本保证不重复了,能用到2056年,觉得应该够了,以后有需求再扩展

Related labels:
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template