目前,我正在用以下代码在我的PHP MySQL代码中生成Bill No,它工作得很好(billno是MySQL中的字段,iap3是表名).它是在数据库表中先前附加值的基础上自动增加的票据编号).

但我希望它应该按以下顺序生成Bill No,如下所示

B-0000-0001  

B表示公司,接下来的2个零表示当前日期的月份(例如,因为今天的月份是09),然后接下来的2个零表示当前日期的年份(例如23),最后是每个患者的0001增量.

当月份和年份发生变化时,最后一个0001应重新设置为0001.我怎么能这样做呢?

我需要这个论坛的帮助来解决我的问题

这是我当前的代码:

<?php
$query = "SELECT bilno FROM iap3 ORDER BY bilno DESC";
$result = mysqli_query($conn,$query);
$row = mysqli_fetch_array($result);
$lastid = $row['bilno'];
if(empty($lastid))
{
    $number = "B-00001";
}
else
{
    $idd = str_replace("B-", "", $lastid);
    $id = str_pad($idd + 1, 5, 0, STR_PAD_LEFT);
    $number = 'B-'.$id;
}
?>

推荐答案

您可以在数据库中使用一个标准的自动递增id列、一个时间戳和一个触发器来完成此操作.

作为演示,以下是表格mytable:

CREATE TABLE mytable (
  id int not null primary key auto_increment,
  created timestamp not null default CURRENT_TIMESTAMP,
  bilno char(11),
  something varchar(100),
  otherthing varchar(100)
);

现在,我们设置了一个触发器,每当我们插入一行时都会触发:

DELIMITER //
CREATE TRIGGER mytable_ins BEFORE INSERT ON mytable
FOR EACH ROW
BEGIN

    DECLARE minId INT default 0;

    SET @myId := (SELECT AUTO_INCREMENT
        FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_NAME = 'mytable'
        AND TABLE_SCHEMA = DATABASE());

    SET @minId := (SELECT MIN(id)
        FROM mytable
        WHERE YEAR(created) = YEAR(NEW.created)
        AND MONTH(created) = MONTH(NEW.created));

    IF @minId IS NULL THEN
        SET @bilId = 1;
    ELSE
        SET @bilId = 1 + @myId - @minId;
    END IF;

    SET NEW.bilno = CONCAT('B',
        '-', DATE_FORMAT(NEW.created, "%m%y"),
        '-', LPAD(@bilId, 4, '0')
    );

END;//
DELIMITER ;

由于在触发BEFORE INSERT触发器时,自动递增列的值不可用,因此我们将从INFORMATION_SCHEMA数据库中获取该值.(重要提示:因此,此解决方案仅适用于一次插入一行)

然后,我们将插入的行的id与本月已插入的最低id进行比较.如果没有先前的id,则我们是第一个,因此将bil编号指定为‘1’.如果存在先前的id,则将这两个id相减以得到bil编号.

最后,对结果进行适当的格式化,包括月份和日期.

要进行测试,请创建一些历史数据:

INSERT INTO mytable (something) VALUES ('a');
INSERT INTO mytable (something) VALUES ('b');
INSERT INTO mytable (something) VALUES ('c');
UPDATE mytable SET
    bilno = REPLACE(bilno, DATE_FORMAT(created, "%m%y"), '0823'),
    created = '2023-08-04 18:43:11';

并创建一些新数据:

INSERT INTO mytable (something) VALUES ('d');
INSERT INTO mytable (something) VALUES ('e');

判断结果:

SELECT * FROM mytable;

+----+---------------------+-------------+-----------+------------+
| id | created             | bilno       | something | otherthing |
+----+---------------------+-------------+-----------+------------+
|  1 | 2023-08-04 18:43:11 | B-0823-0001 | a         | NULL       |
|  2 | 2023-08-04 18:43:11 | B-0823-0002 | b         | NULL       |
|  3 | 2023-08-04 18:43:11 | B-0823-0003 | c         | NULL       |
|  4 | 2023-09-05 19:17:13 | B-0923-0001 | d         | NULL       |
|  5 | 2023-09-05 19:17:13 | B-0923-0002 | e         | NULL       |
+----+---------------------+-------------+-----------+------------+

Php相关问答推荐

在PHP中结合每周日程安排和特殊日子查找下一个可用日期

try 修改这个PHP代码如果语句在WordPress""

模型中的Laravel自定义查询字段

如何使用`preg_replace`删除重复的空格字符

在没有谷歌云客户端PHP库的情况下将图像上传到PHP中的Google存储API?

如何限制WordPress自定义分类术语页面中的术语数量

PHP空数组定义与开始或结束逗号

根据WooCommerce中的客户计费国家/地区更改产品价格

PHP-准备用于TCP套接字的数据包

针对给定产品类别的WooCommerce计数审核

从字符串转换日期和/或时间时,Laravel转换失败

使用随机生成器在MYSQL中创建唯一ID-定义一个数组来存储已知ID是否安全

Laravel Http::get not working on controller

获取作者';在WordPress中使用PHP

Filament v3:具有 hasMany 和 BelongsTo 的关系管理器

如何在 Phpunit 的静态提供程序中创建测试双打?

无法读取某些 WordPress 主机上的 cookie

WooCommerce单个产品页面上启用额外选项卡的产品元框字段

在全局安装 Composer 包后运行命令

如何获取最后一条消息属于 Laravel 中特定用户的对话列表