mehrere Statments verknüpfen
PaSt
- datenbank
1 Vinzenz Mai0 PaSt
Hi Leute
Ich möchte eine Bestellung in eine Datenbank oder besser gesagt zwei Tabellen eintragen.
In der einten Tabelle werden die Kundendaten gespeichert und in der anderen die Bestellung.
Verknüpft sollen beide Tabellen über Kunden.ID = Bestellung.Kunden_ID.
Leider komme ich nicht weiter.
ich arbeite mit:
DB mySQL Version 5.0.45.
PHP Version > 5
So sehen die Tabellenlayouts aus
Tabelle Bestellen
ID int(5) auto_increment
Auftrags_Nr bigint(15)
Datum timestamp CURRENT_TIMESTAMP (on insert)
Kunden_ID int(5)
Artikel_Nr varchar(10) utf8_general_ci
Menge int(4)
Tabelle Kunden
ID int(5) auto_increment
Vorname varchar(40) utf8_general_ci
Name varchar(40) utf8_general_ci
Adresse varchar(100) utf8_general_ci
PLZ_Ort varchar(100) utf8_general_ci
eMail varchar(50) utf8_general_ci
Ich habe mir folgenden Programm-/Funktions-Ablauf überlegt 1.-4.
1\. Prüfen ob bereits Kunde vorhanden ist [ja gehe zu 3. | nein gehe zu 2.]
-- mMn sollten Vorname, Name, Adresse sowie PLZ_Ort verglichen werden eMail kann ja ändern ohne dass sich die Lieferadresse ändert.
-- Wie vergleiche ich hier am sinnvollsten? Einfach ein SELECT über die oben angegebenen Spalten?
-- Rückgabe der Kunden.ID (auto_increment)
2\. Erzeuge Kunde, sowie Rückgabe der Kunden.ID (auto_increment)
INSERT INTO
Kunden
SET
Vorname = $Vorname,
Name = $Name,
Adresse = $Adresse,
PLZ_Ort = $PLZ_Ort,
eMail = $eMail
-- Rückgabe der Kunden.ID (auto_increment)
-- in php wäre es mysql_insert_id() -> SQL?
3\. Bestellung eintragen, sowie Rückgabe der Bestellungen.ID (auto_increment)
-- muss evtl mehrmals, also in einer Schleife aufgerufen werden, da in einer Bestellung mehrere Artikel vorkommen können
INSERT INTO
Bestellungen
SET
Auftrags_Nr= --{Eindeutige ID, am besten YYYYMMDD###, sprich Datum und einer fortlaufenden Zahl falls an diesem Datum bereits eine Bestellung eingegangen sein sollte }
Kunden_ID = Kunden.ID, -- ID des Kunden aus 1. oder 2.
Artikel_Nr = $Artikelnummer,
Menge = $Menge
-- Rückgabe der Bestellungen.ID (auto_increment)
-- in php wäre es mysql_insert_id() -> SQL?
4\. Ausgabe der Auftrags_Nr welche in 3. vergeben wurde.
SELECT
Auftrags_Nr
FROM
Bestellungen
WHERE
ID = LAST_INSERT_ID()
Frage:
Soll ich alles in SQL, als 1 Statement (Wie sähe das dan in etwa aus?) oder als 4 einzelne Statements, welche mit PHP aufbereitet werden, abarbeiten?
Wenn mit PHP besteht da nicht die Gefahr, dass es passieren kann, dass wenn zum Beispiel zwei oder mehrere Personen gleichzeitig bestellen es zu einer Vermischung von Kunden-ID und Bestellung kommen könnte?
Oder dass der Kunde schlussendlich eine falsche Auftragsnummer bekommen kann?
Denn nach jedem mysql_query() besteht ja die Möglichkeit, dass ein anderes Query dazwischen funkt, oder ist das falsch?
Wie gehe ich am besten weiter vor oder ist alles Müll?
Bin für alle Tipps dankbar
Ich hoffe ich habe es einigermassen klar formuliert.
gruss
Hallo,
-- mMn sollten Vorname, Name, Adresse sowie PLZ_Ort verglichen werden eMail kann ja ändern ohne dass sich die Lieferadresse ändert.
so wie man Rechnungen über Rechnungsnummern identifiziert, so identifiziert man Kunden über ihre Kundennummer. Das ist üblich.
Freundliche Grüße
Vinzenz
Hallo Vinzenz
Besten Dank für deine Antwort.
-- mMn sollten Vorname, Name, Adresse sowie PLZ_Ort verglichen werden eMail kann ja ändern ohne dass sich die Lieferadresse ändert.
so wie man Rechnungen über Rechnungsnummern identifiziert, so identifiziert man Kunden über ihre Kundennummer. Das ist üblich.
Das identifizieren des Kunden ist ja auch kein Problem. Mein Hauptproblem besteht eigentlich darin, wie ich die einzelnen Statments miteinander verknüpfe respektive Variablen weitergeben kann.
Da die Auftragsnummer unique sein sollte, darf ja während dem Abfragen der letzten Nummer und dem Eintragen der Neuen keine weitere Nummer vergeben werden.
gruss
Hallo,
Das identifizieren des Kunden ist ja auch kein Problem. Mein Hauptproblem besteht eigentlich darin, wie ich die einzelnen Statments miteinander verknüpfe respektive Variablen weitergeben kann.
Du könntest alles in eine Stored Procedure packen.
Da die Auftragsnummer unique sein sollte, darf ja während dem Abfragen der letzten Nummer und dem Eintragen der Neuen keine weitere Nummer vergeben werden.
LAST_INSERT_ID ist verbindungsspezifisch. Du wirst nicht einen auto_increment-Wert bekommen, der in einer anderen Verbindung vergeben wurde.
Freundliche Grüße
Vinzenz