Warenkorb programmieren?

4 Antworten

Naja, Du hast in deiner Datenbank bereits User und Artikel.

Du baust dann einfach eine Verknüpfungstabelle aus User, Artikel, Preis zum Zeitpunkt des "Reinlegens" und die Anzahl. Der Preis muss leider sein, weil sich Preise auch mal ändern können und Du willst dann nicht alle Warenkörbe invalidieren.

Ansonsten kannst Du den Warenkorb natürlich auch erst mal an eine Session-ID binden, da sich der User vielleicht noch gar nicht registriert hat, oder Du legst einen vorläufigen User in der DB an (dann musst Du den aber evtl mit einem vorhandenen User mergen).

Gruß

Woher ich das weiß:eigene Erfahrung

CrEdo85wiederDa  10.05.2020, 16:11

Der Preis muss sicher nicht sein.

Man nehme einen Artikel, der gestern 1€ gekostet hat und heute teurer geworden ist und heute 2€ kostet.

Mit hinterlegtem Preis würde man nur bezwecken, dass wen jemand gestern ein Artikel für 1€ in den Warenkorb gelegt hat, aber nicht gekauft, heute den Warenkorb erneut aufruft und ihn dann auch kauft, den Artikel zum alten Preis kauft.

----

In aller Regel hat man eine Datenbank mit Artikeln und deren Preisen, daher würde eine einfache Verknüpfung zum Artikel (ohne den Preis) ausreichend. Alles andere wären Fehlerquellen und Datenmüll.

0
AldoradoXYZ  10.05.2020, 16:17
@CrEdo85wiederDa

Ok, ich hab Warenkörbe schon im "realen Umfeld" entwickelt.

Der alte Preis "muss" einfach sein. Und wenn Du ihn benutzt um deinem Kunden mitzuteilen: "Hey, der Preis hat sich geändert, wie willst Du weiter damit umgehen?"

Einfach Preise im Warenkorb zu ändern wäre im freier Wildbahn ein Unding und nicht sehr kundenfreundlich.

Und klar, für ein Hobbyprobjekt ohne realen Bezug kann man solche Überlegungen natürlich lassen. Aber wenn schon, denn schon, oder?

Gruß

1
CrEdo85wiederDa  10.05.2020, 16:22
@AldoradoXYZ

Im realen Umfeld muss man noch einiges mehr beachten. Da es aber hier um ein Hobbyprojekt geht, bei dem es keine Rolle spielt, ob sich jemand darüber aufregt, dass der Preis sich still und leise geändert hat, sollte man die Kirche im Dorf lassen.

0
AldoradoXYZ  10.05.2020, 16:25
@CrEdo85wiederDa

Ich finde schon, dass man auch bei seinen Hobby-Projekten etwas darauf achten kann. Plötzlich macht man das doch mal im Job und da hilft das erworbene Wissen ungemein.

Ansonsten kann man auch ne Dreckslösung machen und alles einfach in die Session hauen. Führt dann dazu, dass die Hobby-Programmierer das in die Arbeitswelt tragen.

Wenn man nen Shop zum Spaß programmiert, kann man ja trotzdem was dabei lernen. Darum geht es doch auch, oder?

Außerdem hast Du deine Position versucht zu verteidigen mit:

Alles andere wären Fehlerquellen und Datenmüll.

Und das ist nun mal Quatsch.

Gruß

0
AldoradoXYZ  10.05.2020, 16:28
@AldoradoXYZ

Ansonsten kann ich nur empfehlen die Preise als Ganzzahlwerte von Euro-Cent zu speichern, sofern das die Wahl der Währung ist.

Allzuoft sieht man Gleitpunktzahlen und die sind völlig ungeignet um Geldbeträge zu speichern.

Falls es einen extra Datentyp für "currency" gibt, dann geht das natürlich auch.

Gruß

0
CrEdo85wiederDa  10.05.2020, 16:36
@AldoradoXYZ
Plötzlich macht man das doch mal im Job und da hilft das erworbene Wissen ungemein.

Und bis dahin haben sich die Bestimmungen geändert, und die Preisänderung muss mitsamt Änderungsdatum angezeigt werden.

Und plötzlich hilft einem das erworbene Wissen nicht mehr.

Oh, warte, hilft ja doch. Nennt sich Lerntransfer. Genauso kann man dann ein Hobbyprojekt um Punkte erweitern, die bei einem Hobbyprojekt unnötig waren/sind.

Aber man kann auch, wie du es wohl machen würdest, gleich im Rahmen der ersten Programmierversuche den Amazon-Nachfolger programmieren... 🤦‍♂️

.....

Du weißt schon, warum man z.B. in der Schule mit einfachen HTML-Seiten mit statischem Inhalt anfängt statt gleich ein Nachrichtenportal für eine Presseagentur zu bauen?...

0
AldoradoXYZ  10.05.2020, 16:52
@CrEdo85wiederDa

Beruhige dich, Du bist ja völlig daneben.

Mach doch einen schönen Beitrag statt hier sinnlos zu nerven. Was trägst Du denn bei? Nichts.

Gruß

0

Einfachste Variante:

Da mit dem Login sowieso ein PHP-Session-Cookie gesetzt und mit der aktuellen Session verknüpft wird:

Beim Login:

$_SESSION['warenkorb'] = array();

Um einen Artikel in den Warenkorb zu legen (z.B. mit AJAX):

array_push($_SESSION['warenkorb'], array('artikel_id'=>12345, 'menge'=>1));

wobei der Wert für die artikel_id z.B. die ID des Datenbankeintrages mit den Artikelinformationen ist.

Der Rest dürfte damit trivial sein.

Du brauchst erst einmal nur einen Ort, bei dem du die gewählten Produkte ablegen kannst. Das kann ein Cookie sein oder das Session-Objekt. Die Daten kannst du ja im JSON-Format halten. So wäre es auch einfach, den Warenkorb mit JavaScript zu erweitern, sobald der Nutzer auf Add für ein bestimmtes Produkt klickt.

Die Aktion könnte (mit JavaScript und Cookie) ungefähr so aussehen:

HTML:

<article class="product" data-product-id="12345">
  <!-- ... -->
  <button class="add-to-cart-button" type="button">Add</button>
</article>
<!-- further articles ... -->

JavaScript:

document.getElementsByClassName("add-to-cart-button").addEventListener("click", function() {
  const productId = this.parentElement.getAttribute("data-product-id");
  const shoppingCart = // get cookie data ...

  // if product id already exists, update quantity
  // otherwise add new object to products array

  // set cookie with new data ...
});

Das Objekt im Cookie sieht so aus:

{
  "products": [
    { "productId": String, "quantity": Number },
    { "productId": String, "quantity": Number }
    // ...
  ]
}

Anstatt String und Number werden natürlich konkrete Werte abgelegt.

Sobald der Nutzer den tatsächlichen Warenkorb betritt, werden die Daten an den Webserver geschickt und eine Liste der Produktdaten kann generiert werden, die tatsächlich abgerechnet werden sollen.

Ich würde die Daten sobald ein Produkt in den Warenkorb gelegt wird in der Datenbank speichern. Die Session-ID dient ggf. zur Verifizierung. Das hat den Vorteil, dass du die Daten aus dem Warenkorb auch später noch zur Verfügung hast, wenn die Session schon abgelaufen ist. Das ist zum Beispiel hilfreich fürs Remarketing und auch generell zu Analyse- und Marketing-Zwecken. Eine Session endet in der Regel, wenn der Browser geschlossen wurde.

Also eine Warenkorbtabelle erstellen mit User-/Session-ID, Produkt-ID, Menge, Preis, Date-Time etc. Hier wird pro Produkt im Warenkorb ein Datensatz geschrieben. Ausgelesen kann es dann über die ID werden. so kannst du du die Bestellungen mit den konkreten Produkten wieder "zusammenbauen".