mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Mi 24.04.2024 12:45 Benutzername: Passwort: Auto-Login

Thema: [PHP,MySQL] Warenkorb/Bestellung ID-Problem vom 14.08.2007


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> [PHP,MySQL] Warenkorb/Bestellung ID-Problem
Seite: 1, 2  Weiter
Autor Nachricht
LioGetz
Threadersteller

Dabei seit: 24.03.2003
Ort: Aachen
Alter: 44
Geschlecht: Männlich
Verfasst Di 14.08.2007 19:34
Titel

[PHP,MySQL] Warenkorb/Bestellung ID-Problem

Antworten mit Zitat Zum Seitenanfang

Hi @ all,

ich stehe gerade auf dem Schlauch und finde partout keinen Lösungsansatz * Keine Ahnung... *

Folgendes Problem:
Wir sollen für die Uni nen Webshop programmieren. Soweit - so gut...klappt auch alles, nur am Schluss hab ich irgendwie noch nen Denkfehler. Neben den "normalen" Tables für User und Waren gibts nen Warenkorb-Table, der die Waren (+Anzahl) im Korb anhand der SessionID speichert bzw. zuweist.

Bei der eigentlich Bestellung muss sich der User anmelden, dann soll der bestehende Korb in eine Bestell-Table übertragen werden, die dann nicht mehr nach SessionID abfragt, sondern die Bestellung dem User zuweist. Dieser "Umweg" ist m.E. sinnvoll bzw. nötig, da man sich ja auch als nichteingeloggter User nen Korb füllen kann, und erst beim Bestellen der User "erkannt" wird...ok, bis dahin klappts noch.
Beim Übertrag in die Bestell-Tabelle soll aber nur jede Bestellung ne ID bekommen, so das man später noch Auflistungen über komplette Bestellungen etc. bekommen kann. Wenn ich das aber per Schleife oder per Auto-Increment mache, bekommt ja jede Zeile ne neue ID, und das wäre Falsch...

Wie schaffe ich es das verschiedene Zeilen eingetragen werden, die aber nur 1 Bestell-ID haben sollen (die dann natürlich auch erhöht werden soll, aber nicht bei jedem Artikel, sondern nur bei jeder Bestellung ?! ).

Hier mal mein bisheriger Code beim Abschicken der Bestellung

Code:

<?php
if ($_SESSION['authorized']) {


// Warenkorb auslesen
dbstart();
$query = "SELECT * FROM warenkorb, artikel WHERE '$_SESSION[id]' = warenkorb.session_ID AND warenkorb.artikel = artikel.artikel_ID";   // Befehl an Datenbank 
$result = mysql_query($query); // Befehl an DB senden

   // Entgültige Bestellung eintragen und Waren mit User verknüpfen
   while($data = mysql_fetch_array($result)){
      $query = "INSERT INTO bestellung (bestell_ID, user, artikel, anzahl) VALUES ('1','$_SESSION[userid]','$data[artikel]', '$data[anzahl]')";   // Befehl an Datenbank 
      $result2 = mysql_query($query) or die(mysql_error()); // Befehl an DB senden
   }
      
      if($result2 == TRUE) {
         echo "<div id='content'>";
         echo "<h1>Vielen Dank f&uuml;r Ihren Einkauf!</h1><br />";
         echo "<p>Sie bekommen eine Auftragsbest&auml;tigung per E-Mail zugeschickt.</p>";
         echo "</div>";

         // mail() verschicken...
         
      } else {
         echo "<div id='content'>";   
            echo "Ihr Bestellvorgang war nicht erfolgreich.<br />";
         echo "</div>";
      }


An der Stelle wo im Moment VALUES '1' steht ist mein Problem (bzw. muss dann irgendwas hin um die Bestellung zu identifizieren)...

Versteht ihr das Problem?
Danke im Voraus

CU
Lio Grins

P.S. Bevor wieder irgendwelche Kommentare zum Thema Sicherheit oder richtigen Anführungszeichen kommen...jaja, ich weiß, das ist aber alles im Moment nebensache, ich hab nicht mehr so viel Zeit *zwinker*
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
dastef

Dabei seit: 03.11.2003
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst Di 14.08.2007 23:18
Titel

Antworten mit Zitat Zum Seitenanfang

spontan würde ich sagen, müsstest du erst mal deine tabellen
normalisieren ..

eine tabelle für die bestellung an sich .. bestell-datum, benutzer,
ip adresse etc. und eine tabelle für die artikel passend zu einer
bestellung.

wenn's bei einer tabelle bleiben soll, würde ich evtl noch ne weitere
spalte einführen .. einmal id mit auto_increment und eine spalte
für bestellung .. für den ersten artikel der bestellung überträgst
du die vergebene id (zB per mysql_insert_id()) in das feld bestellung,
und speicherst es für nachfolgende artikel ..

da ist sicher ne lösung für dich bei? ansonsten einfach nochmal
nachfragen .. is schon was spät *zwinker*
  View user's profile Private Nachricht senden
Anzeige
Anzeige
Backware

Dabei seit: 09.12.2004
Ort: bei Köln
Alter: 38
Geschlecht: Männlich
Verfasst Di 14.08.2007 23:30
Titel

Antworten mit Zitat Zum Seitenanfang

hmmmm mein spontaner ... "ich war den ganzen tag wach und komm nicht ins bett"-gedanke würde sagen, dass du nicht drum herum kommst

die tabelle soweit zu editieren, dass die primärschlüssel die jeweilige id mit der sessionid wäre.

somit dürfen 2 vermeitliche bestellungen auch die gleiche id haben haben sie ja ne verschiedene sessionid.

wenn die bestellung nun durch geht.. wird die session-id auf 0 gesetzt bzw. NULL und damit muss die id eindeutig sein.

dann solltest du dafür sorgen, dass alle einträge die nächste zahl bekommen. Lächel
  View user's profile Private Nachricht senden
Zeithase

Dabei seit: 09.05.2005
Ort: Erfurt
Alter: 39
Geschlecht: Männlich
Verfasst Di 14.08.2007 23:44
Titel

Antworten mit Zitat Zum Seitenanfang

Noch ein Tipp: niemals "SELECT *"-Abfragen konstruiieren.
  View user's profile Private Nachricht senden
remote

Dabei seit: 10.11.2006
Ort: /var/www/
Alter: 110
Geschlecht: Männlich
Verfasst Mi 15.08.2007 09:18
Titel

Antworten mit Zitat Zum Seitenanfang

Zeithase hat geschrieben:
Noch ein Tipp: niemals "SELECT *"-Abfragen konstruiieren.


Kannst du das mal knapp ausführen bzw. entsprechende Begründung verlinken?
  View user's profile Private Nachricht senden
LioGetz
Threadersteller

Dabei seit: 24.03.2003
Ort: Aachen
Alter: 44
Geschlecht: Männlich
Verfasst Mi 15.08.2007 13:11
Titel

Antworten mit Zitat Zum Seitenanfang

hi,

danke für die tipps. habe mit meinem assistenten drüber gesprochen, er meinte das man der einfachheit halber eine zeile pro bestellung machen kann, und die bestellten waren einfach als String in 1 Feld packt (also waren_ID : Anzahl oder sowas)...dann muss man später den quatsch wieder auseinander nehmen...und "feddich" *zwinker*...
Ich werd mich mal dran setzen und gucken was bei rauskommt.

@dastef:
Zitat:

für den ersten artikel der bestellung überträgst
du die vergebene id (zB per mysql_insert_id()) in das feld bestellung,
und speicherst es für nachfolgende artikel ..

Fand ich irgendwie interessant, aber wie soll das denn in ner While-Schleife gehen, den ersten Wert zu setzen und für die nachfolgenden Zeilen zu speichern/übernehmen ?!


@remote:
Ne Quelle hab ich jetzt auch nicht, aber schon häufiger auf php.net & Co. gelesen. Man soll nicht * schreiben, weil es mehr DB Traffic erzeugt und ggf. als unsicherer ist. Außerdem hat man überflüssige Daten. Deshalb immer nur explizit die Felder ansprechen die man auhc haben will und nicht per *.

Thx,
CU
Lio Grins
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
remote

Dabei seit: 10.11.2006
Ort: /var/www/
Alter: 110
Geschlecht: Männlich
Verfasst Mi 15.08.2007 13:34
Titel

Antworten mit Zitat Zum Seitenanfang

LioGetz hat geschrieben:

@remote:
Ne Quelle hab ich jetzt auch nicht, aber schon häufiger auf php.net & Co. gelesen. Man soll nicht * schreiben, weil es mehr DB Traffic erzeugt und ggf. als unsicherer ist. Außerdem hat man überflüssige Daten. Deshalb immer nur explizit die Felder ansprechen die man auhc haben will und nicht per *.


... das man nur ausliest was man auch braucht versteht sich von selbst, aber Zeithase schrieb ja "niemals machen!!11" und es gibt ja durchaus mal die Situation, dass man alle Felder auslesen möchte/muss - da frage ich mich, was prinzipiell gegen n wildcard spricht. Hmm...?!
Was ist an der Verwendung von * unsicher?
  View user's profile Private Nachricht senden
Account gelöscht


Ort: -
Alter: -
Verfasst Mi 15.08.2007 14:08
Titel

Antworten mit Zitat Zum Seitenanfang

Is doch janz einfach. Der größte Nachteil sind (wenn man den Overhead außer acht lässt), sich eventuell ändernde Metadaten. Hier spielt nämlich dann nicht nur die Benennung eine Rolle, sondern ebenfalls die Reihenfolge der Spalten. Und gerade die sollte in keiner Weise ein Integritätskrititerium sein. Bsp.:

Id Nachname Vorname => Id Vorname Nachname

Schon bekommst du über einen indizierten Zugriff Probleme.

Dennoch gibt es in manchen Dbms optimierte Operationen mit "*", so zB der SELECT COUNT(*) Befehl in mysql, der eine performanceoptimierte Zählung aller Tupel ermöglicht (funktioniert aber dann nicht im Zusammenhang mit Aggregation).


Zuletzt bearbeitet von am Mi 15.08.2007 14:10, insgesamt 3-mal bearbeitet
 
 
Ähnliche Themen warenkorb programmierung mit jsp
[PHP] Anfänger will Warenkorb programmieren
Lösung Warenkorb für Netlabel
shop/warenkorb/PHP/und mehr...
mysql-problem
[php] mysql-problem?
Neues Thema eröffnen   Neue Antwort erstellen Seite: 1, 2  Weiter
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.