自动生成号码在新年开始时不起作用

问题描述 投票:0回答:1

我正在尝试在 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"; 
} 

php mysql auto-generate
1个回答
0
投票

您的代码完全有缺陷。数字的构建方式、字母顺序和时间顺序都不相同。因此,当您获取“最后一个”数字时,您会得到 2023 年 12 月的数字,而不是 2024 年 1 月的数字,因为

1223
(作为字符串)大于
0124

您可以更改

ORDER BY
来修复它。但是这样查询将是未优化的(MySQL 需要扫描整个表),更重要的是,代码仍然存在缺陷,因为它对竞争条件敏感。如果 2 个用户尝试同时创建账单,他们可能会创建相同的号码。

生成数字的正确方法是使用专用的计数器表。当您需要获取新号码时:

  • 锁桌子
  • 检索上次使用的计数器
  • 增加它并更新表格
  • 解锁桌子
  • 使用柜台插入新钞票
© www.soinside.com 2019 - 2024. All rights reserved.