php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 09.07.2007, 10:55  
Benutzer
 
Registriert seit: 26.07.2005
Beiträge: 33
Scarabeus
Standard Generierung von Bestellnummern

Hallo,

ich bin gerade dabei eine Shop-System zu implementieren, was meinen Anforderungen genügt. Dabei bin ich auch das Problem bzw. die Herausforderung gestossen Bestellnummern bzw. Rechnungsnummern zu generieren.
Der Punkt ist, dass ich nicht nur eine laufende Nummer als Bestellnummer haben möchte, weil das ja irgendwie doof aussieht, wenn der erste Kunde eine Bestellnummer '1' hat. Wirkt vielleicht nicht sehr proffesionell.

Somit wollte ich mal Fragen ob ihr Vorschläge habt, für die Umsetzung dieser Funktionalität bzw. wie die Struktur einer Bestellnummer ausgebaut sein sollte.

Vielen Dank schon einmal für eure Ideen.
S.
Scarabeus ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 09.07.2007, 11:47  
Erfahrener Benutzer
 
Registriert seit: 02.08.2004
Beiträge: 472
duderino
Standard

Du kannst du Bestell-ID (z.B. die 1) einfach mit base64_encode() kodieren. So kann das System intern noch mit der normalen ID weiter arbeiten und du kodierst du ID einfach nur wenn sie dem Kunden angezeigt werden soll.

Habe diese Möglichkeit auch so genutzt. Ist unkompiziert und die meisten Kunden können damit auch nicht anfangen.

Hier ein Beispiel wie du die unschönen =-Zeichen rausbekommst:

PHP-Code:
function b64encode($string) {
    
$data base64_encode($string);
    
$data str_replace(array('+','/','='),array('-','_',''),$data);
    return 
$data;
}

function 
b64decode($string) {
    
$data str_replace(array('-','_'),array('+','/'),$string);
    
$mod4 strlen($data) % 4;
    if (
$mod4) {
        
$data .= substr('===='$mod4);
    }
    return 
base64_decode($data);

duderino ist offline  
Alt 09.07.2007, 12:26  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hallo,
setz den auto_increment-Wert doch einfach beim Erstellen der Tabelle auf eine Rechnungsnummer die dir passt. Das hatte unseren Ansprüchen damals genügt.
Zergling-new ist offline  
Alt 09.07.2007, 12:41  
Benutzer
 
Registriert seit: 26.07.2005
Beiträge: 33
Scarabeus
Standard

@duderino
Zitat:
Du kannst du Bestell-ID (z.B. die 1) einfach mit base64_encode() kodieren.
Wenn ich die base64 codierung einsetze dann bekomme ich für die ID '1' die codierte ID 'MQ'. Und ob das ein vorteil ist. Außerdem habe ich eine Bestellnummer die nur aus Buchstaben besteht noch nie gesehen.


@Zergling
Zitat:
setz den auto_increment-Wert doch einfach beim Erstellen der Tabelle auf eine Rechnungsnummer die dir passt.
Prinzipiell schon mal ne schöne Idee wie mal die laufende ID ein wenig faken kann! Wodurch dem ersten Kunden nicht gleich klar ist, dass er das erste Testkaninchen ist für den Shop...

Vielleicht macht es ja noch Sinn das laufende Jahr, KundenID oder ähnliches einzubauen oder ist das alles nur redundant und bringt nix?

PHP-Code:
function GenerateOrderNumber ($idUser$idDeliveryAddress$idOrder) {
    
//$prefix     = '';
    //$suffix     = '';
    //$fillLength = '';
    
$year        date('Y');
    
$orderNumber$year.$idUser.$idUser.$idOrder;
    return 
$orderNumber;

Scarabeus ist offline  
Alt 09.07.2007, 13:20  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Wie der Name schon sagt, handelt es sich um eine Bestell-/Rechnungs-Nummer, daher ist die Idee mit base64_encode() zwar ganz gut, ich würde allerdings trotzdem darauf verzichten und numerische Werte verwenden.

Die Idee das Jahr und die Kunden-ID einzubauen (warum aber die $idUser doppelt reinbraten?) ist auch ganz gut, aber du musst aufpassen:
year = 2007, userid = 12, orderid = 3 -> 2007123
year = 2007, userid 1, orderid = 23 -> 2007123
Das ist also auch keine sichere Variante. Entweder du reservierst eine bestimmte Zeichenanzahl für jede Information und füllst den Rest mit Nullen auf, oder aber du verwendest ein Trennzeichen
200700120003, 200700010023
2007-12-3, 2007-1-23
Hierbei kommt jetzt aber nicht nur eine unnötig lange Nummer heraus und bei letzterem Beispiel sogar ein nicht durchgehend numerischer Wert, du schränkst auch die Anzahl möglicher User auf eine vierstellige Zahl ein und die Anzahl der Bestellungen sogar auch (das heißt 9999 User können maximal 9999 Bestellungen aufgeben). Selbst wenn du das ganze 5- oder 6-stellig machst, deine Nummer wächst rasant in die Länge, die Anzahl möglicher User und Bestellungen wird beschränkt*. Vielleicht läuft dein Shop ja jahrelang, da kann man mit der Zeit schnell an abertausende von Bestellungen kommen (hoffentlich sogar). Das ist alles in allem unflexibel.

Ohne Eigenlob, finde ich meine Variante die beste im Ergebnis und die einfachste in der Umsetzung. Was will man mehr?!

* = natürlich ist die Anzahl immer beschränkt, auch bei fortlaufenden Zahlen ab 1, aber INT oder BIGINT reicht in der Regel.
Zergling-new ist offline  
Alt 09.07.2007, 13:33  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Man kann ja fixe und dynamische Zeichzahl kombinieren, dass man erst Datum (oder sowas) voransetzt und alles, was danach kommt ist ... irgendwas anderes ^^ Ne laufende Nummer zB. Das kann dann aber beliebige Länge haben. Userid und Rechnungsid kombinieren wird trotzdem schwierig.
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 09.07.2007, 13:34  
Benutzer
 
Registriert seit: 26.07.2005
Beiträge: 33
Scarabeus
Standard

Zitat:
Zitat von Zergling
(warum aber die $idUser doppelt reinbraten?)
War nen Copy-Paste-Fehler und sollte eigentlich die ID der Lieferadresse enthalten.

Ansonsten hast Du natürlich Recht. Deine Variante ist am einfachsten und beschränkt die Nummer keines Wegs.

Zitat:
Zitat von Zergling
Das ist also auch keine sichere Variante. Entweder du reservierst eine bestimmte Zeichenanzahl für jede Information und füllst den Rest mit Nullen auf, oder aber du verwendest ein Trennzeichen
Dem könnte man entgegenwirken indem mal die 3 Variablen wie folgt zusammensetzt:
year = 2007, userid = 12, orderid = 3 -> 1220073
year = 2007, userid 1, orderid = 23 -> 1200723

Naja. Egal ich werde das wohl einfach lösen. Also die auto-inc Lösung.
Bei welche Id habt ihr denn begonnen, um nicht zu klein zu sein aber auch nicht zu groß.

Ansonsten danke für die Beiträge!
Scarabeus ist offline  
Alt 09.07.2007, 13:38  
Benutzer
 
Registriert seit: 26.07.2005
Beiträge: 33
Scarabeus
Standard

Zitat:
Zitat von KingCrunch
Man kann ja fixe und dynamische Zeichzahl kombinieren, dass man erst Datum (oder sowas) voransetzt und alles, was danach kommt ist ... irgendwas anderes ^^ Ne laufende Nummer zB. Das kann dann aber beliebige Länge haben. Userid und Rechnungsid kombinieren wird trotzdem schwierig.
Stimmt mit der Kombination aus mehreren dynamischen Variablen wird es schwierig ohne die Nutzung von Trennungszeichen.

Ich werde wohl einfach vor die BestellungsID (die durch die auto-inc künstlich erhöht wird) die Jahreszahl als Präfix hängen.
Scarabeus ist offline  
Alt 09.07.2007, 13:47  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Die Idee, die Jahreszahl in die Mitte zu setzen ist auch ganz gut, aber bei näherer Betrachtung wieder fehlerhaft.
Was ist denn wenn plötzlich ein Benutzer/Bestellung mit der ID 2006 oder 2007 oder 2008 auftaucht, oder noch schlimmer, 120079.

12007200756. Ja welches ist denn nun die Jahreszahl? Niemals darfst du aufs Raten angewiesen sein.

Ist doch letztlich sch* egal wie die Rechnungsnummer aussieht, solang sie aus Zahlen besteht und nicht zu lange ist. Von mir aus auch noch ein paar Kontrollbuchstaben oder wenn du mal ganz ausgeflippt bist, nur Buchstaben. Letztlich ist eine Rechnungsnummer ausschließlich dazu da, eine Rechnung und ihre zugehörigen Bestellungen und den Kunden zu identifizieren. Das geht mit einer fortlaufenden Zahl am Besten.

Wir haben einen Wert um 180.000 genommen, aber eine krumme Zahl. 182265. Sowas in der Richtung, ist ja auch bims. Verplemper nur nicht zuviel Zeit für so eine Nichtigkeit =)
Zergling-new ist offline  
Alt 09.07.2007, 13:50  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Und wenn scho: Da bekommt halt irgendwer ne Rechnungsnummer "1" oder "00001". Irgendwann muss nen Shop ja anfangen, das weiß der Besucher auch. Insofern wird ne Rechnungsnummer "1" auch nicht sooo ungewöhnlich sein

Alternativ ganz freakig: Nimm Unix-Timestamp
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP eigene Session ID Generierung nikosch PHP-Fortgeschrittene 18 18.07.2006 14:53
Spielplan Generierung PHP Tipps 2006 18 21.05.2006 21:59
Datei generierung aus MYSQL DB silverghost PHP Tipps 2006 4 15.05.2006 10:00
Problem mit Formular und Generierung einer Seite PHP Tipps 2006 12 08.02.2006 18:51
Problem bei der PDF Generierung HTML2PDF von rustyparts.com joni1980 PHP-Fortgeschrittene 2 23.09.2005 16:15
Typen-Problem bei Generierung einer Alias-Spalte winfo_cologne PHP Tipps 2005-2 1 12.09.2005 14:26
Dynamische Generierung von Variablen Datenbanken 0 09.06.2005 15:13
Generierung eines eindeutigen Schlüsselwertes ajo_silent PHP-Fortgeschrittene 6 03.06.2005 22:47
E-Mail generierung nach 3 Tagen PHP Tipps 2005 6 21.03.2005 12:35
[Erledigt] html - Generierung über mehrere Seiten PHP Tipps 2005 1 08.02.2005 17:53
Schlüssel Generierung Paulo PHP-Fortgeschrittene 11 01.09.2004 16:46
Explorerstatus abfrage... PDF Generierung PHP Tipps 2004 8 21.07.2004 15:48
[Erledigt] PDF generierung PHP-Fortgeschrittene 4 08.07.2004 16:41

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
bestellnummer generieren, php bestellnummer generieren, bestellnummern generieren, bestellnummer generieren php, bestellnummer php, powermail fortlaufende nummer, php bestellnummer erzeugen, powermail bestellnummer, php bestellnummer, php nummer generieren, php bestellnummer erstellen, http://www.php.de/php-tipps-2007/44322-generierung-von-bestellnummern.html, bestellnummern erzeugen, php bestellnummern generieren, fortlaufende bestellnummern php, php bestellnummer geenrieren, php fortlaufende nummer datenbank erzeugen, bestellnummern generieren php, generierung bestellnummer, bestellnummer generieren in php

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:39 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.