如何通过用 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 zerofill
和 type 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 是个主力军
我正在尝试使用以下格式生成票证 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 zerofill
和 type 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 是个主力军