php与mysql产生当天订单流水号避免重复处理

简单介绍如何使用php取得订单流水号,mysql使用DATE_FORMAT与FROM_UNIXTIME判断是否为当日订单,根据已存在的订单笔数更新流水号末码。

/**
* 产生当天订单流水号
*
* @return string
*/

function genSn()
{
$oper = 'DATE_FORMAT(FROM_UNIXTIME(t.time),"%Y%m%d") = '
. 'DATE_FORMAT(FROM_UNIXTIME(' . $_SERVER['REQUEST_TIME'] . '),"%Y%m%d") '
. 'LIMIT 1';

$sql = 'SELECT o.order_sn '
. 'FROM order AS o '
. 'WHERE ' . $oper . ' '
. 'ORDER BY o.order_sn DESC';
$res = $db->getOne($sql);

$lastNum = (int)mb_substr($res, -4, 4);

$orderSn = 'PO' . date('Ymd', $_SERVER['REQUEST_TIME']) . str_pad(($lastNum + 1), 4, '0', STR_PAD_LEFT);
return $sn;
}

产生订单流水号之后在insert资料库时可能会有预期外的重复流水号发生,因此可以使用sql执行错误码来决定是否重新取号或者停止取号。

  1. 产生订单编号。
  2. 执行sql insert语句。
  3. 取得sql语法执行错误码。
  4. 若错误码大于0以及错误码等于1062代表资料重复,停止行为。
do {

// 取得订单编号,请使用你的取得方式
$sn = genSn();

// 执行insert sql,请使用你的sql执行方式
$sql = 'INSERT INTO (order_sn) VALUES (' . $sn . ')';
$db->query($sql);

// 取得sql error错误码,请使用你的错误码取得方式
$errorNo = getErrorNo();

// 资料重複以外的错误则停止回圈
if ($errorNo > 0 && $errorNo != 1062) {
break;
}
} while ($errorNo == 1062); // 错误码为1062则重复继续回圈

参与评论