PHP und MySQL Probleme - brauche einen kleinen Denkanstoß

t.bakr

unregistriert
Thread Starter
Dabei seit
26.01.2006
Beiträge
593
Reaktionspunkte
2
nabend

Ich möchte nicht sagen, dass ich ein Problem habe, nur brauch ich vielleicht einen kleinen Denkanstoß, damit ich weiß, wie ich weiter machen soll.
Folgendes: Ich will eine Art Skript für eine "Einkaufsliste" oder so machen (kann man natürlich für alles mögliche andere noch nehmen). Jetzt weiß ich nur nicht, wie ich die einzelnen Daten speichern soll, am liebsten in einer Datenbank, das hab ich auch alles soweit fertig, nur bin ich unsicher, ob das nicht ein bisschen unklug ist für jeden Wert (also je den Titel und die Anzahl) einzelne Spalten in der Datenbank anzulegen. Wie macht man das am besten?

Und dann noch ne andere Sache:
Wie kann ich das realisieren, dass ich die Anzahlen "live" ändern kann. Also dass ich zum Beispiel bei "Äpfel" die Anzahl von 5 in 10 ändere, ohne die Seite neu laden zu müssen und dass das dann auch in der Datenbank geändert ist.

Ich hoffe ihr könnt mir ein bisschen helfen
Grüße
 
hi

wahrscheinlich musst du deine Datenbank so planen, dass pro Artikel ein Eintrag erstellt wird:

id | name | anzahl
1 | orangen | 3
2 | äpfel | 10

so sollte das am besten klappen.

und für das ändern der anzahl ohne einen reload der seite brauchst du wohl einen kleinen AJAX-Schnippsel. Suche nach XMLHttpRequest, damit ist das relativ einfach zu lösen:

Klick auf einen Link, z.b. <1 Orange mehr> -> XMLHttpRequest -> im Hintergrund wird eine PHP-Datei aufgerufen, die die aktuelle Anzahl aus der Datenbank abfragt, sie um 1 erhöht und den neuen Wert in die Datenbank schreibt und dann ausgibt -> Antwort wird von JavaScript verarbeitet und auf deiner Seite aktualisiert.

Simu
 
Die Tabelle

ID - Artikel - Preis - Anzahl

Das mit dem Live ändern ohne Aktualliseren wird(nur mit php/sql) nicht gehen, am Besten machst du das so
Code:
<?php

if(isset($_POST[SPEICHERN]){
#Scrheibe in db
}

#Lese aus DB, gebe Aus
?>

<html>
<form>
 # Button mit dem Namen speichern
</form>

</html>
 
Ich gehe jetzt mal davon aus, dass diese Einkaufswagen von mehreren genutzt werden können.

Das heißt wir haben eine n:m Beziehung. Jeder Bestellung sind mehrere Artikel zugeordnet und jeder Artikel kann Teil mehrerer Bestellungen sein.

In dem Fall brauchst du drei Tabellen.

1. Artikel (Spalten: artikel_id, name, , preis, etc.)

2. Einkaufswagen (Spalten: einkaufswagen_id, E-Mail-Adresse des Benutzers, etc.)

3. Verknüpfungstabelle der beiden vorangegangenen für die Produkte in Einkauswagen (Spalten: artikel_id, einkaufswagen_id, anzahl)


Für jeden Artikel gibt es einen Eintrag und damit eine eindeutige artikel_id in der 1. Tabelle
Für jeden Einkaufswagen gibt es einen Eintrag und damit eine eindeutige einkaufswagen_id in der 2. Tabelle.
Für jede Position in jedem Einkaufswagen gibt es einen Eintrag in der 3. Tabelle. (ID des Artikels und ID des Einkaufswagens)

Edit:
Da man ja auch mehrere Einheiten eines Artikels bestellen können muss, braucht die 3. Tabelle natürlich noch eine Angabe darüber wieviele Einheiten von dem jeweiligen Artikel in dem jeweiligen Einkaufswagen liegen. (» Spalte Anzahl)
 
Danke schonmal für die Hilfe beim Code.

Bei der Datenbank wird das wohl noch was schwieriger, weil ich das ganze eigentlich dynamischer machen will, also dass man mehrere "Listen" erstellen kann, auch von mehreren Leuten. Quasi ein echter Dienst (für ausgewählte Leute ;) ). Da wär es glaub ich unpraktisch, wenn man das so lösen würde, wie du vorgeschlagen hast. Ich hab es im Moment so, dass man als erstes Einen Namen und die Anzahl der einzelnen Optionen festlegt und im nächsten Schritt die einzelnen Optionen "beschriftet". Name, Anzahl und ein zufällig generierter code werden dann in eine Zeile der DB gespeichert, also:

id | code | name | anzahlgesamt | option1 | anzahl1 uswusf
1 | g56Ft | einkauf | 5 | äpfel | 10 usw...
2 | hT54F | kabel | 3 | hdmi | 1
...



vielleicht nochmal ganz blöd, falls das unverständlich ist:
seite 1:
feld 1: namen für die liste
feld 2: anzahl der "artikel" insgesamt

seite 2:
man hat soviele eingabefelder, wie man vorher bei eins bei der anzahl eingetippt hat und gibt ihnen titel

seite 3:
man bekommt einen code, mit der man auf seine liste zugreifen kann

seite 4:
die liste. die titel stehen untereinander und man kann in je einem feld daneben die anzahl eintragen oder diese mit "+" und "-" regeln


eigentlich ganz simpel, nur weiß ich momentan eben nciht, wie ich die datenbankstruktur aufbauen soll... ;)
 
Zuletzt bearbeitet:
so wirst du garantiert ein grausames Chaos erhalten ;)

mach es wie von scope geschrieben, das ist die optimale variante um später auch mal was anzupassen...

z.b. eine neue Tabelle mit "Kunde", dann brauchst du in der 3. Tabelle nur die Verknüpfung mit den Kundendaten herzustellen.

Ich hab' am Anfang auch ähnlich wie du Tabellen erstellt, mit dem Resultat, dass ich die ganzen Seiten neu machen durfte bei Änderungen :(

Simu

Edit: Das mit den mehreren Listen klappt eben in der 3-Tabellen-Variante besonders gut. Einfach für eine neue Liste in der 3. Tabelle einen Eintrag einfügen.
Und wenn du z.B. mal einen Artikel umbenennen willst (von Apfel nach Äpfel) musst du das nur an einem Ort tun.
 
so wirst du garantiert ein grausames Chaos erhalten ;)

mach es wie von scope geschrieben, das ist die optimale variante um später auch mal was anzupassen...

z.b. eine neue Tabelle mit "Kunde", dann brauchst du in der 3. Tabelle nur die Verknüpfung mit den Kundendaten herzustellen.

Ich hab' am Anfang auch ähnlich wie du Tabellen erstellt, mit dem Resultat, dass ich die ganzen Seiten neu machen durfte bei Änderungen :(

Simu

Edit: Das mit den mehreren Listen klappt eben in der 3-Tabellen-Variante besonders gut. Einfach für eine neue Liste in der 3. Tabelle einen Eintrag einfügen.
Und wenn du z.B. mal einen Artikel umbenennen willst (von Apfel nach Äpfel) musst du das nur an einem Ort tun.

hab #5 nochmal editiert. das problem ist einfach, dass ich keine festen artikel habe. es soll ja keine art einkaufswagen oder so sein
 
hab #5 nochmal editiert. das problem ist einfach, dass ich keine festen artikel habe. es soll ja keine art einkaufswagen oder so sein

Dann hängt es jetzt davon ab, ob Artikel überhaupt 2x auftauchen können. Kann Benutzer 1 (vielleicht auch zufällig) den gleichen Artikel (vom Typ, nicht der Anzahl) in seinem Wagen haben?

Kann das wirklich NIE passieren, kommst du wirklich mit 2 Tabellen aus.

Aber sobald nur die theoretische Möglichkeit existiert, dass das passieren kann, ist es sehr zu empfehlen, mit der beschriebenen Lösung mit 3 Tabellen zu arbeiten.
 
Natürlich kann das passieren, aber ich verstehe jetzt nciht ganz, wie ich das mit 3 Tabellen lösen soll :eek:
 
Ich hab' am Anfang auch ähnlich wie du Tabellen erstellt, mit dem Resultat, dass ich die ganzen Seiten neu machen durfte bei Änderungen

So haben wir wahrscheinlich alle angefangen. Ich erinner mich noch gut an meine ersten Gehversuche: ein Schachspiel. Ich hab tatsächlich eine Tabelle mit 36 Feldern angelegt, für jede Figur eins. :D Für jedes Spiel wurde eine neue Tabelle angelegt. :rotfl:

So viel dazu. :rolleyes: Hör auf die Jungs, Du ersparst dir viel Ärger und Zeit und lernst gleich wie man es richtig macht. :)
 
Natürlich kann das passieren, aber ich verstehe jetzt nciht ganz, wie ich das mit 3 Tabellen lösen soll :eek:

Aktion nach Seite 1:

Neuer Eintrag in der Tabelle Einkaufswagen, die ID wird an die nächste Seite übergeben.
(Wieso muss man hier schon angeben, wie viele Produkte man haben möchte? Das könntest du dynamisch auf der folgenden Seite lösen, indem man per Javascript neue Zeilen für Produkte hinzufügen kann. Ansonsten nutzt du eben den Zahlenwert zu Erstellung der Felder.)

Aktion nach Seite 2:

Für jeden Artikel in den Feldern passiert folgendes:

Es wird überprüft ob das Produkt schon in der Datenbank liegt. Wenn nicht, kommt ein neuer Eintrag in die Tabelle Produkte und merkt sich die ID dieses neuen Eintrags. Wenn ja, dann holt man sich die ID für den existierenden Eintrag. In beiden Fällen kommt nun ein neuer Eintrag in die Tabelle Nummer 3 (aus meiner Skizze oben) mit einkaufswagen_id = dem Wert, der von der letzten Seite, wo der Wagen erstellt wurde, mitgegeben wurde und produkt_id = die ID die wir gerade ermittelt haben. Für die Anzahl setzt du den Wert, der eben standardmäßig da stehen soll (z.B. 0 oder 1) Der "Code" (Wie du es nennst, vielleicht einfach die URL zum Korb?) für die Seite wird nun etwas in Richtung einkaufswagen.php?id=x, wobei x dann der Wert von der letzten Seite ist, wo der Einkaufswagen erstellt wurde.

Auf Seite 4:
Mithilfe von AJAX kannst du die Anzahl der jeweiligen Produkte verändern. Das Script bekommt produkt_id, einkaufswagen_id mitgeteilt und die neue Anzahl oder ob erhöht oder verringert werden soll. Dann wird in der Datenbank die Spalte anzahl in der 3. Tabelle entsprechend verändert.
 
Aktion nach Seite 2:

Für jeden Artikel in den Feldern passiert folgendes:

Es wird überprüft ob das Produkt schon in der Datenbank liegt. Wenn nicht, kommt ein neuer Eintrag in die Tabelle Produkte und merkt sich die ID dieses neuen Eintrags. Wenn ja, dann holt man sich die ID für den existierenden Eintrag. In beiden Fällen kommt nun ein neuer Eintrag in die Tabelle Nummer 3 (aus meiner Skizze oben) mit einkaufswagen_id = dem Wert, der von der letzten Seite, wo der Wagen erstellt wurde, mitgegeben wurde und produkt_id = die ID die wir gerade ermittelt haben. Für die Anzahl setzt du den Wert, der eben standardmäßig da stehen soll (z.B. 0 oder 1) Der "Code" (Wie du es nennst, vielleicht einfach die URL zum Korb?) für die Seite wird nun etwas in Richtung einkaufswagen.php?id=x, wobei x dann der Wert von der letzten Seite ist, wo der Einkaufswagen erstellt wurde.
Die Struktur der letzten Tabelle versteh' ich nicht so ganz. Meinst du das so?

id | listenname_id | produkt_id
1 | 1 | bspw. 15


edit: oder besser nochmal komplett ausführlich, damit ich sicher gehe, dass ich das nciht falsch verstanden habe:

tabelle 1:
id | listenname
1 | gemüse
...

tabelle 2:
id | produktname
1 | kartoffeln
...

tabelle 3:
id | listen_id | produkt_id
1 | 1 | 1
 
Die Struktur der letzten Tabelle versteh' ich nicht so ganz. Meinst du das so?

id | listenname_id | produkt_id
1 | 1 | bspw. 15

Fast.

Die ID kannst du bei dieser Tabelle weglassen und listenname_id und produkt_id zusammen als Primärschlüssel setzen. Eventuell eben noch eine dritte Spalte anzahl, wie ich sie oben angedeutet habe, um zu speichern wie viele Produkte eines Typs in einer bestimmten Liste gewählt wurden.

listenname_id | produkt_id
1 | 15
1 | 134
2 | 15
3 | 23
3 | 134

Edit:

Die anderen Tabellen passen so.
 
Die Produkt_ID sollte ja eigentlich eindeutig sein, also reicht es, wenn diese alleine Primärschlüssel ist. Eine Kombination mit dem Listennamen sollte überflüssig sein.
 
Gut, dann ist mir aber nicht klar, wie ich einer Liste mehrere Produkte zuordnen kann
 
Gut, dann ist mir aber nicht klar, wie ich einer Liste mehrere Produkte zuordnen kann

Wie in meinem Beispiel (das ich aber erst nachträglich hinzugefügt habe ;) )

listenname_id | produkt_id
1 | 15
1 | 134
2 | 15
3 | 23
3 | 134

In diesem Fall liegen in Liste 1 die Artikel mit der ID 15 und 134.


Mit einer zusätzlichen Spalte anzahl könnte es so aussehen:

listenname_id | produkt_id | anzahl
1 | 15 | 3
1 | 134 | 10
2 | 15 | 1
3 | 23 | 3
3 | 134 | 5

Jetzt wird dort definiert, dass in Liste 1 der Artikel 15 dreimal und der Artikel 134 zehnmal liegt. Gleichzeitig kann der Artikel 15 auch noch in Liste 2 einmal liegen (Zeile 3)
 
aaaaah, jetzt wird mir einiges klar :D mir war nciht klar, dass das so funktioniert.
vielen dank schonmal, vor allem an scope ;) ich werd mich mal an die arbeit machen
 
ganz kurze frage: ich möchte es gerne so machen, dass man die anzahl der optionsfelder nciht direkt am anfang angeben muss, sondern so hinzufügen kann. ist es sinnvoll das mit style="display:none;" zu machen und die dann mit ein paar ajax befehlen sichtbar zu machen oder gibt's da noch was "eleganteres"?
 
ganz kurze frage: ich möchte es gerne so machen, dass man die anzahl der optionsfelder nciht direkt am anfang angeben muss, sondern so hinzufügen kann. ist es sinnvoll das mit style="display:none;" zu machen und die dann mit ein paar ajax befehlen sichtbar zu machen oder gibt's da noch was "eleganteres"?

Und wenn dann keine mehr übrig sind, die man noch sichtbar machen kann?

Natürlich geht das eleganter!

Da es sonst sehr kompliziert wird, würde ich mir mal jQuery ansehen.

Damit könntest du dann Sachen machen wie

Code:
function addProductRow()
{
$('#listencontainer').html( $('#listencontainer') + "code für eine neue reihe" );
}

Jeder Klick auf den Link "Neue Zeile hinzufügen" ruft dann diese JavaScript-Funktion auf und es wird eine neue Zeile unter den aktuellen Inhalt des Elements, in dem die Reihen liegen, hinzugefügt (Habe das Element, in dem deine Zeilen liegen, einfach mal mit id="listencontainer" versehen)
 
Zurück
Oben Unten