Auftragnummer bzw. eMail-Ticket

Jakob

Jakob

Aktives Mitglied
Thread Starter
Dabei seit
05.01.2004
Beiträge
1.070
Reaktionspunkte
21
Hallo,

hier programmiere ich ein eMail-Ticket, also eine Bearbeitungsnummer. Hab mich für einen Buchstaben, der was bedeutet, gefolgt von 6 Zufallszahlen entschieden. Werd aber vielleicht noch auf 7 hochgehen.

Meine Frage, wie Programmiere ich eine Funktion, die den unwahrscheinlichen Fall einer Doppelbelegung abfängt? Die DB macht das ja automatisch, aber ich möchte natürlich das der Eintrag trotzdem eben mit ner anderen Zufallszahl abgespeichert wird. Die Funktion soll so lange laufen, bis sie eine nicht belegte Zahl findet.

Den Buchstaben vernachlässige ich mal:
PHP:
function zufall(){
$nummer=mt_rand(100000,999999);
// EDIT: ! hat gefehlt
if(!mysql_query("SELECT nummer FROM tabelle WHERE nummer='$nummer'")){
 return $nummer;
}
else zufall();
}

Kann ich sowas machen?
Danke!
 
Zuletzt bearbeitet:
Mir fehlt der Ablauf um das zu verstehen! Was genau willst Du tun? Unabhängig von DB oder anderen Werkzeugen. Schlicht: was hast Du vor? In dem Beispiel oben erzeugst Du ne Zufallszahl gibt es die in der DB, gibst Du die zurück, wenn nicht, dann probierst Du es weiter, bis Du einen Treffer hast.

Mal abgesehen von der unbekannten Laufzeit und dem DB-/NEtztraffic den Du generierst, wird der Sinn nicht klar. Was hast Du überhaupt vor?
 
Hallo,

erstmal danke für Deine schnellen und konkreten Beiträge.

Also es ist ein Kontaktformular, das schickt vereinfacht eine Mail an den Eigentümer, eine an den der das Formular ausgefüllt hat und die Daten an die DB.

Die Zufallszahl soll einfach ein Schlüssel sein, der alle 3 verbindet.

Z.B. ruft ein Kunde an, und mittels der Nummer wissen die auf der anderen Seite gleich um welche Nachricht und welchen Kunden es geht.

Die Wahrscheinlichkeit, dass 2 Kunden die selbe Nummer bekommen ist sehr gering. Ich schätze, dass das System 50.000 Anfragen aushalten muss, bis es erneuert wird.

Das Skript soll nur das Unwahrscheinliche abfangen. Es wird also seltenst noch mal ne DB-Verbindung aufgebaut.

Ich hoffe das ist klarer.
Schonmal danke!
 
Trotzdem würd ich das nicht so lösen wollen, einfach weil die Zahl der (unnötigen) DB-Verbindungen mit zunehmender Nutzung steigt und der Punkt der "Unnutzbarkeit" absehbar ist. Vor so etwas kann ich nur warnen. Ich hab ein System übernommen in dem solche Barierren enthalten waren a la "mehr als 32768 Kunden werden wir eh nie haben, also reicht ein smallint als kdNr.". Die 2 gesparten Bytes je Kunde haben mir dann am Anfang viel Arbeit gemacht, bevor Kunde 32769 kam ;)

Ich würd eine Tabelle counter erstellen und darin eine Spalte mailreferer, beginnend bei 100000. Damit hast Du bei unsigned int 4.1 Mrd. mögliche mails, das ist schonmal erheblich mehr als 50.000. Der Zugriff auf diesen counter darf exklusiv nur über eine stored procedure möglich sein oder durch manuelles locking. Somit kann eine Nummer auch bei konkurierenden Anfragen nur genau einmal vergeben werden. Du brauchst die DB nur zweimal behelligen ( 1. aktuelle Nummer liefern, 2. counter für nächste Anfrage erhöhen) und hast somit einen konstanten Aufwand, der auch nach 100000 mails nicht steigt! Auf eine solche Art und Weise verteile ich mehrere Nummernkreise (Kunden, ArtikelNummern, RechnungsNr,...).
 
Zuletzt bearbeitet:
Ja, da hast Du Recht…

Wobei da das locking wirklich wichtig wird. Wollte ich umgehen, da ich damit keine Erfahrung habe. Kannst Du (oder auch jemand anderes hier :) ) einen Wink geben, wie ich das am kundenfreundlichsten gestalten kann?

Optimum wäre: Falls zwei Kunden gleichzeitig Kontakt aufnehmen, werden beide Anfragen angenommen und nacheinander abgearbeitet.

Wie gesagt hab ich leider überhaupt keine Ahnung, wie das gehen soll. Oder wo ich anfangen soll zu suchen.
Danke!
 
Ich nehme mal an, daß da die mysql-Anleitung (die ja sehr ausführlich ist) einiges dazu sagen kann. Ich bin bei mysql's nicht auf dem neuesten Stand (ob z.B. stored procedures schon gehen?), da ich meist mit Microsoft SQL-Server arbeite.

Prinzipiell kannst Du locking aber auch manuell über eine locked_by oder locked-Spalte selbst nachbilden!
 
Was mir gerade eingefallen ist:

Ich hab ja sowieso eine ID mit auto increment. Was spricht dagegen, die bei 100.000 starten zu lassen und diese ID als Auftragsnummer zu nehmen? Bräuchte kein locking, keine DB-Abfragen, nix.

Hört sich für mich gerade ziemlich gut an. Mal drüber schlafen…
 
Zurück
Oben Unten