PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Warenkorb erstellen: Richtiger Aufbau/Struktur?


Onlinejunky
2007-01-17, 18:43:46
Hi Leute,

ich mache ja grad mit nem Kumpel eine Website. Jetzt will ich einen einfachen Warenkorb realisieren, d.h. wenn man auf den Artikel klickt wird dieser in den Warenkorb gelegt und man kann danach bestellen. Viele Artikel wird es noch nicht geben aber ich will von Anfang an das richtige Grundgerüst haben. Ich habe ein Anfänger Buch über PHP durch, z.b. haben wir schon ein eigenes Kontakformular.
Ich habe mir das so vorgestellt:

1.Sessions verwenden, dass der Besucher identifiziert wird
2. 2 Tabellen in mysql erzeugen (Artikel und Warenkorb)
3. Durch den klick werden die Artikel aus der Artikeltabelle geholt und in die Warenkorbtabelle geschrieben

Es ist irgendwie so ein riesen Berg vor mir und ich weiß nicht wo ich anfangen soll. Wie sollte das Grundgerüst aussehen und was muss ich unbedingt beachten?

Mfg

darph
2007-01-17, 19:42:27
Prinzipfrage: Soll der Warenkorb wirklich in der Datenbank stehen? Warenkörbe sind an sich ja meist recht kurzlebige "Datenmodelle". Reicht es vielleicht, das Ganze in einer Session zu speichern?

Wenn du gleich ein wenig in die objektorientierte Programmierung einsteigen möchtest, kannst du das relativ schön modellieren.

Du hast eine Klasse Article, diese hat die Attribute "id" und "name".
Du hast die Klasse BasketItem, diese hat ein Attribut "article" und "number"
article ist vom Typ int (id des Articles) oder direkt com Typ "Article".
Dann hast du noch eine Klasse "BasketCase", und die hat ein Array von BasketItems

und dann brauchst du nur noch ein Array als Sessionvariable $_SESSION["basketcase"] = new BasketCase();

$item = new Article(1, "Wischmop"); //id, name - wird aus der DB gezogen
$bcitem = new BasketItem($item, 23); //Artikel, Anzahl (etc...)

$_SESSION["basketcase"]->addItem($bcitem);

Onlinejunky
2007-01-17, 20:27:45
Prinzipfrage: Soll der Warenkorb wirklich in der Datenbank stehen? Warenkörbe sind an sich ja meist recht kurzlebige "Datenmodelle". Reicht es vielleicht, das Ganze in einer Session zu speichern?

Wenn du gleich ein wenig in die objektorientierte Programmierung einsteigen möchtest, kannst du das relativ schön modellieren.

Du hast eine Klasse Article, diese hat die Attribute "id" und "name".
Du hast die Klasse BasketItem, diese hat ein Attribut "article" und "number"
article ist vom Typ int (id des Articles) oder direkt com Typ "Article".
Dann hast du noch eine Klasse "BasketCase", und die hat ein Array von BasketItems

und dann brauchst du nur noch ein Array als Sessionvariable $_SESSION["basketcase"] = new BasketCase();

$item = new Article(1, "Wischmop"); //id, name - wird aus der DB gezogen
$bcitem = new BasketItem($item, 23); //Artikel, Anzahl (etc...)

$_SESSION["basketcase"]->addItem($bcitem);


Hi,

danke für die Antwort. Das hört sich sehr interessant an, nur habe ich leider das Problem es richtig zu verstehen. So brauche ich ja doch auch eine Datenbank. :| Hast du jetzt nur ein Beispiel für die Session gemacht oder war das jetzt der ganze aufbau? *gg* Kannst du mir bitte genau erklären was hinter dem Code steckt? Bin halt noch ein Checker. :redface:

Mfg

EcHo
2007-01-19, 11:24:23
Hi,

danke für die Antwort. Das hört sich sehr interessant an, nur habe ich leider das Problem es richtig zu verstehen. So brauche ich ja doch auch eine Datenbank. :| Hast du jetzt nur ein Beispiel für die Session gemacht oder war das jetzt der ganze aufbau? *gg* Kannst du mir bitte genau erklären was hinter dem Code steckt? Bin halt noch ein Checker. :redface:

Mfg
Eine DB brauchst du in jedem Fall für die Artikel.
Nur der Warenkorb wird nicht in die DB geschrieben, sondern einfach in der Session gespeichert/behalten.

Onlinejunky
2007-01-25, 02:47:27
Ich lese und lese und lese!

Sessions, OOP usw...............

mein Kopf raucht aber ich komme nicht weiter. Ich weiß einfach nicht wo ich anfangen soll. Kann mir keiner vielleicht mal einen einfach Denkansatz geben?

Ich sehe alles komplett und verstehe nur Bahnhof. Wann soll ich denn als erstes machen. Vielleicht die Daten von Artikeln in die DB schreiben, oder? Das wäre der erste Schritt. Was kommt dann als nächstes? Es bringt wohl nichts wenn ich versuche alles zu sehen, sonst ist es zu viel für den Anfang. Kann mich da jemand unterstützen? Es ist mir sehr wichtig, dass ich diesen Warenkorb hin bekomme und ohne Professionelle Hilfe schaffe ich das nicht als Anfänger.

Thx

Mfg

Onlinejunky

Tommes
2007-01-25, 08:03:09
Ist doch ganz einfach? MAchst dir ne Tabelle Artikel in etwa so:

artikel_id INT PKEY
bezeichnung VARCHAR 80
beschreibung TEXT
preis INT

Dann machst du ne Seite wo du die alle auflistest mit jeweils einem Link:

addbasket?id=X

Und in addbasket.php regitrierst du dann in der Session dass was hinzugefügt wurde:

$_SESSION['basket'][] = $_GET['id';

Auf der bezahlen Seite kannst du dann den $_SESSION['basket'] Array durchlaufen und hast alle hereingepackt Artikel ids, den Rest holst du wieder aus der Datenbank :-)

Onlinejunky
2007-01-25, 13:07:41
Naja, so einfach ist das für einen Anfänger nicht. ;-)

Ok, Daten in die DB schreiben und auf der Seite auflisten lassen. Aber dann steht dort doch nur Text. Ich verstehe das nicht mit dem Link. Wie werden die Daten über den Link an die addbasket übermittelt?

Kannst du das genauer erklären:

addbasket?id=X


Mfg

Tommes
2007-01-25, 17:59:05
Okay, also du hast dann da deine Liste:

- Produkt 1
Beschreibung
....
<a href="addbasket.php?id=$id">In den Warenkorb legen</a>


- Produkt 2
Beschreibung
....
<a href="addbasket.php?id=$id">In den Warenkorb legen</a>

usw. Wobei $id die ID des Datensatzes ist.

Wenn du nun auf den Link klickst und addbasket.php diesen code hat:

<? echo $_GET['id']; ?>

Wäre die Ausgabe die jeweils per ?id=X übergebene Produkt id. Anhand dieser kannst du nun das Produkt in den Warenkorb packen. Dazu reicht es, in in einem Array in der Session zu speichern:

$_SESSION['basket'][] = $_GET['id'];

Onlinejunky
2007-01-26, 11:50:42
Ok vielen Danke,

der Knackpunkt mit der ID hat mir gehehlt. Mir war nämlich nicht klar wie das gehen soll. Danke!!!


Ich probiers mal aus.


Mfg

Tommes
2007-01-26, 12:06:17
Hehe keine Ursache, wenn du noch fragen hast, poste einfach wieder hier.

Onlinejunky
2007-01-27, 15:59:04
Hi,

also die Liste habe ich auf der Seite, habe mal nur 2 Waren als Beispiel genommen.

Code von mysql.php

<?php
mysql_connect("rdbms.strato.de" , "test", "") or die("Verbindung gescheitert");
mysql_select_db("DB226386") or die("Datenbankzugriff gescheitert");
$sql = "SELECT * FROM produkte";
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)) {
echo "$row[Titel], $row[Beschreibung], $row[Preis] € <br> \n\n";
}
mysql_close();
?>




Hier der Code von Waren.php


session_start();
include ("mysql.php")
?>
<a href="basket.php?id=$id">ADS in den Warenkorb</a><br>


<a href="basket.php?id=$id">Abi in den Warenkorb</a><br>

Jetzt der Code von basket.php

session_start();
$_SESSION['basket'][] = $_GET['id'];
echo $_GET['id'];


Wenn ich jetzt auf den Link klicke steht in Basket.php einfach nur "$id" aber mehr nicht. Wo ist der Fehler?
Muss ich noch in der mysql.php etwas mit der ID angeben? Die wird dort gar nicht erwähnt.


Mfg

Tommes
2007-01-27, 16:07:16
while ($row = mysql_fetch_assoc($result)) {
echo "$row[Titel], $row[Beschreibung], $row[Preis] € <br> \n\n";
echo "
<a href=\"basket.php?id=$row[id]\">Abi in den Warenkorb</a><br>";
}


Probier das mal ;) $row[id] <- ggf. durch richtige Bezeichnung ersetzen.

Onlinejunky
2007-01-27, 16:22:04
while ($row = mysql_fetch_assoc($result)) {
echo "$row[Titel], $row[Beschreibung], $row[Preis] € <br> \n\n";
echo "
<a href=\"basket.php?id=$row[id]\">Abi in den Warenkorb</a><br>";
}


Probier das mal ;) $row[id] <- ggf. durch richtige Bezeichnung ersetzen.


Wenn ich es so mache, also id=$row[id] dann steht genau wieder das im Warenkorb
$row[id]

Ich habe erst gedacht jetzt muss es gehen aber irgendwie will es nicht. Vielleicht wegen "include" und ich muss es richtig reinschreiben?

Mfg

Onlinejunky
2007-01-27, 16:31:29
Ok also ich habs jetzt genau so eingefügt wie du gesagt hast

while ($row = mysql_fetch_assoc($result)) {
echo "$row[Titel], $row[Beschreibung], $row[Preis] € <br> \n\n";
echo "
<a href=\"basket.php?id=$row[id]\">Abi in den Warenkorb</a><br>";
}

Jetzt steht in der basekt.php entweder eine 1 oder eine 2 aber mehr nicht. Wo sind die anderen Informationen?

So ist es ja eigentlich logisch, es wird ja nur der Wert von der ID hinten dran gehängt. Also ne 1 oder ne 2. Aber will ja das ausgeben, was hinter der ID steckt.

Tommes
2007-01-27, 16:49:58
Warum? Anhand der ID kannst du doch eindeutig identifizieren, um welchen Artikel es sich handelt :)

Ach und mach das mal:

$_SESSION['basket'][] = $_GET['id'];
print_r($_SESSION['basket']);

in der basket.php :)

Onlinejunky
2007-01-27, 17:06:09
Wenn ich das mache steht in basket.php

Array ( [0] => [1] => [2] => 1 [3] => 2 [4] => 1 [5] => 2 [6] => 1 ) 1


Vielleicht muss ich in basket.php nochmal ne Verbindung zu Datenbank erstellen, dass es das zu ordnen kann?

Mfg

Tommes
2007-01-27, 17:13:01
Nö. basket.php registriert nur in der Session welche Artikel in den Warenkorb gepackt sind. Dazu hast du das Array $_SESSION['basket']. Wenn du den Inhalt des Korbs anzeigen lassen willst, läufst du das Array durch und kannst dann die einzelnen Artikel auflisten, die weiteren Daten kannst du ja ahnad der id aus der DB holen :)

Onlinejunky
2007-01-27, 17:18:37
Also zusammengefasst.

So wie es jetzt ist, wird im Warenkorb entweder die Zahl 1 oder 2 angezeigt aber mehr nicht. Kein Titel und Beschreibung. Du meinst wenn ich auch den Titel und die Beschreibung im Warenkorb sehen will, muss ich das Array durchlaufen lassen?

d.h. mit dieser foreach funktion?

Wie muss das dann ausehen?

foreach ($id as $produkte) {

echo "$produkte<br>\n" ;
}
????

Wie ist der Array namem den ich durchsuchen muss?

Mfg

Onlinejunky
2007-01-27, 17:59:50
Jetzt hab ich mal folgendes probiert:

session_start();
$_SESSION['basket'][] = $_GET['id'];
foreach ($_SESSION['basket'] as $produkte) {
echo "$produkte<br>\n";
}

Dann gibt er mir aus:

1
2
1
2
1
1
2
1
1
1
1
1
1


Ich durchsuche auch das falsche Array oder?

Mfg

Tommes
2007-01-27, 18:30:20
Nein nein, das sind alle Artikel die du in den Warenkorb gepackt hast. Du hast ja nur 2 Artikel, aber diese halt mehrfach reingepackt. Wo würde ich die Ausgabe machen (fast & dirty):

$articles = array_unique($_SESSION['basket']);

foreach ($articles as $key => $value) {
$row = mysql_fetch_assoc(mysql_query("SELECT * FROM produkte WHERE id = $value"));
$anzahl = 0;
foreach ($_SESSION['basket'] as $id) {
if ($if == $row[id]) ++$anzahl;
}
echo "$row[Titel], $row[Beschreibung], $row[Preis] € $anzahl<br> \n\n";}

Onlinejunky
2007-01-28, 15:01:58
Ok, aber dann brauche ich in der basekt.php auch eine mysql verbindung oder?

Wenn ich das von dir einfüge kommt:

Warning: mysql_query() [function.mysql-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /mnt/be1/02/241/00000030/htdocs/basket.php on line 7

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /mnt/be1/02/241/00000030/htdocs/basket.php on line 7

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /mnt/be1/02/241/00000030/htdocs/basket.php on line 7
, , € 2


Mfg

Tommes
2007-01-28, 15:05:31
Natürlich :)

Onlinejunky
2007-01-28, 15:16:24
Hi,

also nochmal vielen Dank, jetzt habe ich die beiden Produkte im Warenkorb. Das hätte ich nie ohne dich geschafft, aber es ist einfach schwierig wenn man ganz am Anfang von PHP steht, so etwas zu erschaffen. Wärst du so nett und erklärst mir deinen Code mit Kommentaren und was es mit der Anzahl auf sich sich hat, weil immer 0 hinter den Produkten steht. Dann kommt auch schon die nächste Frage, wie ich etwas aus dem Korb entfernen kann. :redface: Da kommen wohl noch ein paar seiten hinzu bis das Teil richtig geht.

$articles = array_unique($_SESSION['basket']);

foreach ($articles as $key => $value) {
$row = mysql_fetch_assoc(mysql_query("SELECT * FROM produkte WHERE id = $value"));
$anzahl = 0;
foreach ($_SESSION['basket'] as $id) {
if ($if == $row[id]) ++$anzahl;
}
echo "$row[Titel], $row[Beschreibung], $row[Preis] € $anzahl<br> \n\n";}

Thx

mfg

Tommes
2007-01-28, 15:21:50
Wie gesagt der Code war nun fast & dirty ;) Jedes mal wenn du auf den Hinzufügen link klickst, wird die ID ja in der Session registriert, d.h. das Produkt wird virtuell in den Warenkorb gelegt. Nun kann es ja sein, dass jemand 5x das gleiche Produkt in den Warenkorb legt. Das muss ja beachtet werden. D.h. dein Array $_SESSION['basket'] sieht dann zB so aus:

1,2,2,2,1,1...

$articles = array_unique($_SESSION['basket']);

Das kannst du im Manual auf php.net nachschlagen ;) Das ist das A-und-O.

Der Rest ist doch selbsterklärend. Das Array $articles wird durchgelaufen (foreach kennst du ja bereits?) und in $row werden dann Ahand der Produkt ID die anderen Daten aus der Datenbank geholt.

foreach ($_SESSION['basket'] as $id) {
if ($if == $row[id]) ++$anzahl;
}

Das soll eigentlich zählen, wie oft die ID im Warenkorb ist. Schein wohl noch etwas buggy zu sein ;)

Zum löschen müsstest du EINEN Eintrag mit der übergebenen ID aus $_SESSION['basket'] löschen.

Onlinejunky
2007-01-28, 15:28:09
Ok den Fehler mit der Anzahl habe ich selber gefunden.

if ($if == $row[id]) ++$anzahl;

Statt $id stand $if. :biggrin:



Zum löschen müsstest du EINEN Eintrag mit der übergebenen ID aus $_SESSION['basket'] löschen.

Da raucht wieder der Kopf. Das Problem ist, lesen kann ich PHP ganz gut (also ich vestehe schon ä bissel was) aber selber schreiben ohne Vorlage, das ist das schwierige. Das ist wie eine Instrument ohne Noten spielen.

Mfg

Abanon
2007-01-29, 01:07:15
Das ist wie eine Instrument ohne Noten spielen.

Jo und wie loest man das Problem?
Man setzt sich damit auseinander, dir fehlt momentan eigentlich so gut wie alles, es existiert kein Verständnis der Materie.

Mag sich zwar gemein anhören, aber du stehst noch nichtmal am Anfang der Programmierung, du probierst gerade nur etwas "zusammen zu frickeln". Wenn das ganze nur zum Verstehen und zum lernen sein soll, ist das voll und ganz ok, aber tu mir bitte den Gefallen und mach daraus keine "Professionelle" Webseite. Du bist gerade am Anfang eher noch weit vor einem Anfang, wenn ich deine Fragen sehe.

Wir haben alle mal angefangen, allerdings sollte man schon Manuals lesen und ein allgmeines Verständnis aufbauen.

Von CrossSiteScripting (XSS (http://de.wikipedia.org/wiki/XSS)) oder Cross-site request forgery (XSRF) (http://de.wikipedia.org/wiki/Cross-Site_Request_Forgery) hast du wahrscheinlich noch nie was gehoert.

Deswegen meine Wahrnung, bitte nur bisher private Entwicklung und Spassprogrammierung, aber bitte keine Webseite aufbauen, womit ihr Geld verdienen wollt!:upara:

The_Invisible
2007-01-29, 13:42:26
Jo und wie loest man das Problem?
Man setzt sich damit auseinander, dir fehlt momentan eigentlich so gut wie alles, es existiert kein Verständnis der Materie.

Mag sich zwar gemein anhören, aber du stehst noch nichtmal am Anfang der Programmierung, du probierst gerade nur etwas "zusammen zu frickeln". Wenn das ganze nur zum Verstehen und zum lernen sein soll, ist das voll und ganz ok, aber tu mir bitte den Gefallen und mach daraus keine "Professionelle" Webseite. Du bist gerade am Anfang eher noch weit vor einem Anfang, wenn ich deine Fragen sehe.

Wir haben alle mal angefangen, allerdings sollte man schon Manuals lesen und ein allgmeines Verständnis aufbauen.

Von CrossSiteScripting (XSS (http://de.wikipedia.org/wiki/XSS)) oder Cross-site request forgery (XSRF) (http://de.wikipedia.org/wiki/Cross-Site_Request_Forgery) hast du wahrscheinlich noch nie was gehoert.

Deswegen meine Wahrnung, bitte nur bisher private Entwicklung und Spassprogrammierung, aber bitte keine Webseite aufbauen, womit ihr Geld verdienen wollt!:upara:

hast schon recht, aber am anfang sieht man halt den wald vor lauter bäumen nicht. irgendwann muss man anfangen, aber ob da ein webshop dazu geeignet ist, vor allem wenn er auch sicher sein soll (und zahlungsdaten eingegeben werden), ich weiß nicht.

vielleicht mal üben mit gästebuch, forum, newssystem, usw

mfg

Onlinejunky
2007-01-29, 15:38:36
Ist ja gut! :wink:

Ich habe ja gesagt, dass ich ein Anfänger bin aber wollte halt trotzdem gerne wissen wie sowas geht. Auf dem Plan stand halt erst das Kontaktformular, das habe ich auch gut hinbekommen, dann kam der Warenkorb aber das war wohl ne Stufe zu hoch. Ich will ja kein professioneller PHP Coder werden. Dann komme ich ja gar nimmer weg vom PC. ;) Man muss ja bestimmt auch net alles wissen in PHP, wenn ich da die ganzen Funktionen sehe.......:eek:

Von CrossSiteScripting (XSS) oder Cross-site request forgery (XSRF) hast du wahrscheinlich noch nie was gehoert.

Doch habe ich schon, ich weiß das es was mit Sicherheit zu tun hat. Werde ich mir auch anschauen.


Mfg