首页 > 解决方案 > 生成相同订单号的问题

问题描述

我的应用程序是用 symfony 编写的,它有一个在线结帐系统。一般当两个或多个用户同时结账时,会生成相同的订单号。因此,它会在数据库中产生冗余,这可能会导致不一致。

我们正在为订单号生成九位数的 uniqid,同时我们正在对照数据库检查新生成的#id 以避免重复。

$slug = substr(hexdec(uniqid('', false)),0,9);
        while($this->_doctrine->getManager()->getRepository('ZACartBundle:Cart')->findOneBySlug($slug) != null){
            $slug = substr(hexdec(uniqid('', false)),0,9);
        }
        return $slug;

基本上,我们需要在并发用户进行结帐过程时为订单号提供唯一的 slug。

标签: phpdoctrinesymfony-2.3

解决方案


您的脚本从时间戳生成唯一的 slug,但是数字太大(16 位)并且您只取前 10 位数字,这就是为什么当多个用户在短时间内访问购物车时具有相同的 id 时 slug 是相同的的时间。

您可以考虑获取最后 10 位数字来解决此问题:

$slug = substr(hexdec(uniqid('', false)), -10);

推荐阅读