J'ai besoin de générer un numéro de facture à partir d'un entier d'une table avec un identifiant d'incrémentation automatique de la base de données où l'utilisateur effectue ses achats.
Exemple de base de données de factures sous forme de table:
Le format de numéro de facture étage effectue l’une des deux manières suivantes.
Exemple 1: du nombre de factures sans préfixe:
0000001 | 0000002 | 0000003 | 0000004 | 0000005
Exemple 2: le nombre de factures avec préfixes:
F-0000001 | F-0000002 | F-0000003 | F-0000004 | F-0000005
Question:
1) ¿Quel est le meilleur moyen de le faire, directement depuis MySQL ou PHP?
2) ¿Quel est le format le plus approprié, exemple 1 ou exemple 2?
_ {J'apprécie votre soutien, comme toujours! _
Grâce à Gordon Linoff , je pourrais trouver un moyen de résoudre ce problème.
Je vais partager un exemple, peut-être que quelqu'un pourrait être intéressé.
SQL - Facture sans préfixe: SELECT id, LPAD(id,7,'0') FROM invoice WHERE id = 1;
Résultat: 0000001
SQL - Facture avec préfixe: SELECT id, CONCAT( 'F-', LPAD(id,7,'0') ) FROM invoice;
Résultat: F-0000001
1 - 0000001 | 0000002 | 0000003 | 0000004 | 0000005
$ dbValue = 1; echo $ dbValue = str_pad ($ dbValue, 7, "0", STR_PAD_LEFT); // il donnera 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); // cela produira F-0000001;
Vous pouvez écrire une bonne fonction d'assistance dans PHP pour l'utiliser où vous le souhaitez dans votre application afin de renvoyer un numéro de facture. La fonction d'assistance suivante peut simplifier votre processus.
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
Une fois que vous avez terminé d'écrire la fonction d'assistance, vous n'avez pas besoin d'utiliser LPAD
ou CONCAT
fonctions MySQL à chaque fois dans votre requête pour renvoyer un ID avec des zéros de remplissage ou des préfixes. Si vous disposez d'un accès global à la fonction d'assistance dans l'ensemble de l'application, il vous suffit de l'invoquer où vous souhaitez générer un numéro de facture.
Récupère le dernier ID de la base de données et le stocke dans une variable PHP.
Par exemple, si le dernier enregistrement est 100
, incrémentez-le de 1
.
$last = 100; // This is fetched from database
$last++;
$invoice_number = sprintf('%07d', $last);
Enfin, la réponse à la deuxième question est,
$number = "F-". $number;
Ans 1):
Vous pouvez le faire avec PHP (directement par concat
ou utiliser str-pad
) ainsi qu'avec MySQL (LPAD
) également
Mais, à mon avis, vous devriez le faire en PHP, afin de pouvoir le modifier en fonction de vos besoins, par exemple. étendre les zéros en fonction du nombre d'identifiants dans DB.Afin de ne pas modifier les requêtes SQL et de les alourdir.
Réponse 2): Vous pouvez utiliser les deux formats, mais si vous souhaitez être plus précis concernant un utilisateur particulier ou toute autre chose, utilisez un deuxième format.
Je pense que le second format peut vous donner plus d'informations sur les données