Я пытаюсь сгенерировать значение идентификатора заявки в следующем формате: yymm######
для использования в моей таблице базы данных. Это выражает двухзначный год, двухзначный месяц и шестизначный числовой идентификатор, уникальный для префикса год-месяц.
Если для текущего месяца и года нет других идентификаторов билетов (апрель 2017 года на момент публикации), числовая часть значения должна быть по умолчанию: 000000
, В этом случае правильный сгенерированный идентификатор билета должен быть: 1704000000
,
Если в текущем месяце — году существует 1 или несколько ранее существующих идентификаторов билетов, то новый идентификатор заявки должен быть на 1 больше, чем самый высокий идентификатор заявки.
В настоящее время я использую php для увеличения идентификатора заявки следующим образом:
$tkid = $rowt["TICKET_ID"] + 1;
Но, используя этот код, генерирует идентификатор заявки, например так: 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" >
Если бы это был мой проект, я бы mysql
сделать всю работу (и я бы использовал подготовленное заявление по соображениям безопасности).
Чтобы устранить любые конфликты KEYWORD / tablename, я рекомендую поставить галочку напротив group
Таблица.
Мой запрос будет увеличивать самый высокий TICKET_ID
значение для выбранного groupid
(и дополните его нулями, если вы все еще используете этот код в начале следующего тысячелетия!). Если нет строк для выбранного 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);
}
Это не только обеспечивает необходимую безопасность вашего запроса, но и объединяет все манипуляции с данными, а не смешивает манипуляции с эхом.
Используемые функции:
Попробуйте изменить это:
<?php echo date('ym'). $tkid ;?>
к этому:
<?php echo date('ym') . str_pad($tkid, 6, '0', STR_PAD_LEFT); ?>
Увидеть str_pad ().
Запрос на форматирование с использованием printf
<?php printf('%s%06d', date('ym'), $tkid); ?>
Серьезно, printf — рабочая лошадка