Как сгенерировать идентификатор билета правильной длины, заполнив середину 0

Я пытаюсь сгенерировать значение идентификатора билета в следующем формате: yymm###### для использования в моей таблице базы данных. Это выражает 2-значный год, 2-значный месяц и 6-значный числовой идентификатор, уникальный для префикса года-месяца.

Если нет других идентификаторов билетов для текущего месяца и года (апрель 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" >

person Qiu Xue    schedule 29.04.2017    source источник
comment
какое значение вы получаете от $rowt[TICKET_ID]   -  person Ahmed Ginani    schedule 29.04.2017
comment
первый получит 000000. Но если я зарегистрирую второго клиента, он получит 000001   -  person Qiu Xue    schedule 29.04.2017
comment
Потому что после того, как я зарегистрирую первого клиента, идентификатор билета будет обновлен до 000001.   -  person Qiu Xue    schedule 29.04.2017
comment
echo $rowt["TICKET_ID"] и посмотрите, что он показывает   -  person B. Desai    schedule 29.04.2017


Ответы (3)


Если бы это был мой проект, я бы позволил 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);
}

Это не только обеспечивает необходимую безопасность вашего запроса, но и объединяет все операции с данными в одном месте, а не смешивает обработку с эхом.

Используемые функции:

person mickmackusa    schedule 29.04.2017

Попробуйте изменить это:

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

к этому:

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

См. str_pad().

person Joe Black    schedule 29.04.2017

Отформатировать запрос с помощью printf

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

Серьезно, printf — рабочая лошадка.

person Jim U    schedule 29.04.2017