php生成唯一订单号的五种方法详解

发布时间:2019-10-11编辑:脚本学堂
本文介绍了php生成唯一订单号的五种方法,从简单到复杂生成唯一订单号的实例代码,在电子商务类的网站中唯一订单号的生成方法,供大家学习参考。

php生成唯一订单号

如何避免订单号的重复?如何用php生成唯一订单号?这里分享六种方法。

方法1:
 

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

方法二:
 

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

方法三:
 

复制代码 代码示例:
//生成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);

方法四,该方法用上了英文字母、年月日、Unix 时间戳和微秒数、随机数,重复的可能性大大降低。
使用字母很有代表性,一个字母对应一个年份,总共16位,不多也不少。

例子:
 

复制代码 代码示例:
<?php
$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));
?>

输出订单号:
A422694333616096

方法五,PHP生成唯一订单号

例子:
* 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弄成字符串,但是字符长度不定,取前固定的几位,然后前面加上当前的年份和日期,这个方法生成的订单号,全世界不会有多少重复的。
当然,除非你把服务器时间往前调,但是调也不用怕,哥不相信他会在同一微秒内下两次订单,网络数据传输也要点时间的,即便你是在本地。