PHP使用日期生成唯一订单号

时间:2014-03-09 06:26:30

标签: php date time format

我想按照以下12种数字格式生成唯一标识符:

YYYYMMDDXXXX

示例:

201403052318

其中:

YYYYMMDD是当前日期值,其他XXXX是随机生成的值。

$today = date("Ymd");
$rand = sprintf("%04d", rand(0,9999));
$unique = $today . $rand;

每日所需的唯一卷大约为100.我应该使用哪些方法来防止rand值中可能的重复或使所有id最大唯一?也许可以使用当前时间函数来压缩最后4个字符中的这些数字?

EDITED: 连接到MySQL数据库的唯一值作为表的主索引。它是与数据库中任何存储信息无关的初始值。

4 个答案:

答案 0 :(得分:12)

你不能依赖rand(),你有可能会产生重复(rand(0,9999)很少生成重复,但在某些时候会发生重复)。

因此,不要选择rand(),而只需创建一个增量值(例如从...开始)并附加到生成的日期。

下次当你重新生成一个新的id时,抓住那个增量值(比如你把它存储在某处......必须是1对吗?)状态,增加它并将它附加到你的新日期。

不是理想的解决方案..(评论家欢迎)

您可以使用uniqidsha-1time相结合,并为前4个字符对其进行substr()

<?php
$today = date("Ymd");
$rand = strtoupper(substr(uniqid(sha1(time())),0,4));
echo $unique = $today . $rand;

<强> OUTPUT :

201403094B3F

答案 1 :(得分:7)

我需要做类似的事情,这个解决方案可以保留时间并保持ID唯一性,我最终得到了一个使用PHP function time()这样的解决方案

$reference_number = 'BFF-' . time();您可以将BFF更改为对您的业务逻辑更有意义的内容。

我的唯一引用ID看起来像BFF-1393327176,数字可以从Unix转换为实时,这将为您提供Tue, 25 Feb 2014 11:19:36

我希望这会有所帮助

答案 2 :(得分:0)

如果生成一次唯一值,您只需要对rand值进行条件选择,并将值存储在一个数组中,该数组将成为条件 - 使用inarray - :

$amount = 100; // the amount of ids
$previousValues = array();
for ($i = 0; $i < $amount; $i++){    
    $rand = rand(0,9999);
    while (in_array($rand, $previousValues)){
        $rand = rand(0, 9999);
    }
    $previousValues[] = $rand;
    $today = date("Ymd");
    $unique = $today.$rand;
    echo $unique."\n";
}

结帐 this demo

答案 3 :(得分:0)

创建唯一“唯一订单号”的可能解决方案如下,我假设您有订单表和字段order_number,那么代码是:

$orderNumber = DB::table('orders')->max('order_number') + random_int(10, 100);

如果第一个订单号被插入为“100000000000”,该方法会给你这个数字:

100000000025
100000000056
100000000089
100000000123
100000000199
100000000232
100000000249

使用这种方法,不可能出现非唯一数字,但缺点是每个数字都比前一个数字大(不是 100% 随机),但这种方法在大多数情况下是可以接受的。