如何通过用 0 填充中间来生成具有正确长度的工单 ID

How to generate a ticket id with correct length by padding middle with 0

我正在尝试使用以下格式生成票证 ID 值:yymm###### 以用于我的数据库 table。这表示一个 2 位数的年份、2 位数的月份和一个 6 位数的数字 ID,它对年月前缀是唯一的。

如果当前月份和年份(发布时为 2017 年 4 月)没有其他工单 ID,则该值的数字部分应默认为 000000。在这种情况下,正确生成的工单 ID 应为:1704000000.

如果当前月 - 年有 1 个或多个预先存在的工单 ID,则新工单 ID 应比最高工单 ID 多 1。

我目前正在使用 php 像这样递增票证 ID:

$tkid = $rowt["TICKET_ID"] + 1;

但是使用这段代码,生成一个像这样的工单 ID:17041

我已经将我的 ticket_id 属性设置为 unsigned zerofilltype int 6

由于设计原因,我不想使用自增

代码:

$sqlt = "SELECT TICKET_ID FROM group where groupid = '$tid' ";
$ticket = mysqli_query($conn , $sqlt);
$rowcount = mysqli_num_rows($ticket);
if ($rowcount == 0)
    echo "No records found";
else 
    {
    $rowt = mysqli_fetch_assoc($ticket);
    }
$tkid = $rowt["TICKET_ID"] + 1;

<input type="text" readonly="readonly" value="<?php echo date('ym'). $tkid ;?>" name="TICKET_ID" >

尝试改变这个:

<?php echo date('ym'). $tkid ;?>

对此:

<?php echo date('ym') . str_pad($tkid, 6, '0', STR_PAD_LEFT); ?>

参见str_pad()

如果这是我的项目,我会让 mysql 完成所有工作(出于安全原因,我会使用准备好的语句)。

为了消除任何 KEYWORD / tablename 冲突,我建议反引号 group table.

我的查询将增加所选 groupid 的最高 TICKET_ID 值(如果您在下一个千年开始时仍在使用此代码,则用零填充它!)。如果所选 groupid 没有行,则结果集中将提供新的 [yymm000000] 值。

if($stmt=$conn->prepare(
      "(SELECT LPAD(`TICKET_ID`+1,10,'0') FROM `group`
        WHERE `groupid`=? ORDER BY `TICKET_ID` DESC LIMIT 1)
      UNION
       (SELECT CONCAT(DATE_FORMAT(CURDATE(),'%y%m'),'000000'))
      LIMIT 1;"
    )
){
    $stmt->bind_param("s",$tid);
    $stmt->execute();
    $stmt->bind_result($new_tkid);
    $stmt->fetch();
    echo "<input type=\"text\" name=\"TICKET_ID\" value=\"$new_tkid\" readonly=\"readonly\">";
    $stmt->free_result();
}else{
    echo "Query Syntax Error"; // echo mysqli_error($conn);
}

这不仅为您的查询提供了基本的安全性,还将所有数据操作放在一个地方,而不是将操作与回显混合在一起。

使用的函数:

使用 printf 格式化请求

<?php printf('%s%06d', date('ym'), $tkid); ?>

说真的,printf 是个主力军