Php 如何通过在中间填充0来生成长度正确的票证id
我正在尝试生成一个具有以下格式的票证id值:yymm,以便在我的数据库表中使用。这表示一个2位数的年、2位数的月和一个6位数的数字id,该id对于年-月前缀是唯一的 如果在发布时没有2017年4月当月和年份的其他票证id,则该值的数字部分应默认为000000。在这种情况下,正确生成的票证id应为:1704000000 如果当前月份-年份中存在1个或多个预先存在的票证id,则新票证id应比最高票证id多1个 我目前正在使用php增加票证id,如下所示:Php 如何通过在中间填充0来生成长度正确的票证id,php,html,sql,increment,ticket-system,Php,Html,Sql,Increment,Ticket System,我正在尝试生成一个具有以下格式的票证id值:yymm,以便在我的数据库表中使用。这表示一个2位数的年、2位数的月和一个6位数的数字id,该id对于年-月前缀是唯一的 如果在发布时没有2017年4月当月和年份的其他票证id,则该值的数字部分应默认为000000。在这种情况下,正确生成的票证id应为:1704000000 如果当前月份-年份中存在1个或多个预先存在的票证id,则新票证id应比最高票证id多1个 我目前正在使用php增加票证id,如下所示: $tkid = $rowt["TICKET_
$tkid = $rowt["TICKET_ID"] + 1;
但是使用这个代码,生成一个票证id,如下所示:17041
我已经将我的ticket_id属性设置为unsigned zerofill并键入int 6
由于设计原因,我不想使用自动增量
代码:
尝试更改此选项:
<?php echo date('ym'). $tkid ;?>
为此:
<?php echo date('ym') . str_pad($tkid, 6, '0', STR_PAD_LEFT); ?>
请参阅。如果这是我的项目,我会让mysql完成所有工作,出于安全原因,我会使用一个准备好的语句 为了消除任何关键字/表名冲突,我建议对组表进行反勾选 我的查询将增加所选groupid的最高票证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格式化请求
说真的,printf是一个主力你首先得到的$rowt[TICKET_ID]的值将得到000000。但是如果我注册第二个客户,它将得到000001,因为在我注册第一个客户后,TICKET ID将更新为000001。echo$rowt[TICKET_ID]并查看它显示的内容
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);
}
<?php printf('%s%06d', date('ym'), $tkid); ?>