我正在尝试在 php 中按以下顺序生成我的帐单号 L5- 0124-0001 (其中 L5 是公司名称,01 代表月份,24 代表年份,最后四位数字代表序列号),我自 2023 年 10 月开始使用此代码,一切正常,直到 2023 年年底,但随着今天 2024 年开始,它停止工作,(公司名称正确显示,年月也正确显示,但当需要生成新账单时,最后四位数字不会增加。所有账单仍为 0001,它应该是 L5 -0124-0002等等........下面是代码
$CI = "L5"; //Example only
$CIcnt = strlen($CI);
$offset = $CIcnt + 6;
// Get the current month and year as two-digit strings
$month = date("m"); // e.g. 09
$year = date("y"); // e.g. 23
// Get the last bill number from the database
$query = "SELECT patientno FROM iap2 ORDER BY patientno DESC LIMIT 1";
$result = mysqli_query($con,$query);
// Use mysqli_fetch_assoc() to get an associative array of the fetched row
$row = mysqli_fetch_assoc($result);
// Use $row[‘patientno’] to get the last bill number
$lastid = $row['patientno'];
// Check if the last bill number is empty or has a different month or year
if(empty($lastid) || (substr($lastid, $CIcnt + 1, 2) != $month) || (substr($lastid, $CIcnt + 3, 2) != $year)) {
// Start a new sequence with 0001
$number = "$CI-$month$year-0001";
} else {
// Increment the last four digits by one
$idd = substr($lastid, $offset); // e.g. 0001
$id = str_pad($idd + 1, 4, 0, STR_PAD_LEFT); // e.g. 0002
$number = "$CI-$month$year-$id";
}
您的代码完全有缺陷。数字的构建方式、字母顺序和时间顺序都不相同。因此,当您获取“最后一个”数字时,您会得到 2023 年 12 月的数字,而不是 2024 年 1 月的数字,因为
1223
(作为字符串)大于 0124
。
您可以更改
ORDER BY
来修复它。但是这样查询将是未优化的(MySQL 需要扫描整个表),更重要的是,代码仍然存在缺陷,因为它对竞争条件敏感。如果 2 个用户尝试同时创建账单,他们可能会创建相同的号码。
生成数字的正确方法是使用专用的计数器表。当您需要获取新号码时: