Мне нужно сгенерировать номер счета из целого числа таблицы с автоматически увеличивающимся идентификатором базы данных, в которой сохраняются покупки пользователя.
Пример базы данных таблицы счетов:
Пол формата номера счета-фактуры выполняется одним из двух способов.
Пример 1: из числа счетов без префикса:
0000001 |
0000002 |
0000003 |
0000004 |
0000005
Пример 2: количество счетов с префиксами:
F-0000001 |
F-0000002 |
F-0000003 |
F-0000004 |
F-0000005
Вопрос:
1) ¿Какой лучший способ сделать это, вы можете сделать прямо из MySQL или PHP?
2) ¿Какой формат наиболее подходит для примера 1 или для примера 2?
Я ценю вашу поддержку, как всегда!
Благодаря Гордон Линофф, Я мог бы найти способ решить это.
Я поделюсь примером, возможно, кому-то может быть интересно.
SQL — Счет без префикса: SELECT id, LPAD(id,7,'0') FROM invoice WHERE id = 1;
Результат: 0000001
SQL — Счет с префиксом: SELECT id, CONCAT( 'F-', LPAD(id,7,'0') ) FROM invoice;
Результат: F-0000001
1 — 0000001 | 0000002 | 0000003 | 0000004 | 0000005
$ dbValue = 1;
echo $ dbValue = str_pad ($ dbValue, 7, «0», STR_PAD_LEFT); // это даст 0000001;
2 — F-0000001 | F-0000002 | F-0000003 | F-0000004 | F-0000005
$ dbValue = 1;
echo $ dbValue = «F -«. str_pad ($ dbValue, 7, «0», STR_PAD_LEFT); // он выдаст F-0000001;
Получить последний идентификатор из базы данных и сохранить его в переменной PHP.
Например, если последняя запись 100
затем увеличьте его на 1
,
$last = 100; // This is fetched from database
$last++;
$invoice_number = sprintf('%07d', $last);
Наконец, ответ на второй вопрос:
$number = "F-". $number;
Вы можете написать хорошую вспомогательную функцию на PHP, чтобы использовать ее везде, где вы хотите, чтобы в вашем приложении возвращался номер счета. Следующая вспомогательная функция может упростить ваш процесс.
function invoice_num ($input, $pad_len = 7, $prefix = null) {
if ($pad_len <= strlen($input))
trigger_error('<strong>$pad_len</strong> cannot be less than or equal to the length of <strong>$input</strong> to generate invoice number', E_USER_ERROR);
if (is_string($prefix))
return sprintf("%s%s", $prefix, str_pad($input, $pad_len, "0", STR_PAD_LEFT));
return str_pad($input, $pad_len, "0", STR_PAD_LEFT);
}
// Returns input with 7 zeros padded on the left
echo invoice_num(1); // Output: 0000001
// Returns input with 10 zeros padded
echo invoice_num(1, 10); // Output: 0000000001
// Returns input with prefixed F- along with 7 zeros padded
echo invoice_num(1, 7, "F-"); // Output: F-0000001
// Returns input with prefixed F- along with 10 zeros padded
echo invoice_num(1, 10, "F-"); // Output: F-0000000001
Когда вы закончите написание вспомогательной функции, вам не нужно использовать LPAD
или же CONCAT
MySQL работает каждый раз в вашем запросе, возвращая ID с нулями заполнения или нулями с префиксом. Если у вас есть глобальный доступ к вспомогательной функции во всем приложении, вам нужно вызывать ее только там, где вы хотите сгенерировать номер счета.
Ответ 1):
Вы можете сделать это с помощью PHP (напрямую concat
или использовать str-pad
) а также с MySQL ( LPAD
) также
Но, на мой взгляд, вы должны сделать это с помощью PHP, чтобы вы могли изменить его в соответствии с вашими требованиями, например, расширить нули в соответствии с числом идентификаторов в DB. Так, чтобы не изменять запросы SQL и сделать его тяжелым.
Ответ 2):
Вы можете использовать оба формата, но если вы хотите быть более конкретным в отношении конкретного пользователя или чего-либо еще, используйте второй формат.
Я думаю, что второй формат может дать вам больше информации о данных