Hi.
Nein, du musst nicht den Warenkorb mit allen Artikeln vorbelegen und für die je einen
Mengen-Wert auf 0 setzen - das wäre ja krass! Lediglich die Artikel von denen mindestens ein
Stück im Warenkorb liegt erhalten eine Arrayfeld.
Beispiel mit einfachen Funktionen:
PHP-Code:
<?php
function basket_setAmount($sProductID, $iAmount)
{
$_SESSION['basket'][$sProductID] = $iAmount;
}
function basket_addProduct($sProductID, $iAmount2Add = 1)
{
if (!is_int($iAmount2Add) || $iAmount2Add < 1) return false;
if (!isset($_SESSION[$sProcuctID]))
$_SESSION[$sProductID] = 0;
$_SESSION['basket'][$sProductID] += $iAmount2Add
}
function basket_getAmount($sProductID)
{
return (isset($_SESSION['basket'][$sProductID])) ? $_SESSION['basket'][$sProductID] : 0;
}
?>
Und so weiter. Die Abfragen sindalso immer: Wenn ein Array-Feld für den Artikel nicht exisitiert,
dann betrachte die Menge als 0.
Übrigens ist es von da an nurnoch ein winziger Schritt zu einer Warenkrob-Klasse.
Und was das Rumgepfusche angeht (sorry für das harte Wort *g), so meinte ich folgendes:
Der Benutzer möchte den Warenkorb sehen. Er hat einen Taschenrechner drinnen, zwei Päckchen
Taschentücher und eine Taschenuhr. Das Array wird in deiner Schleife durchlaufen und die Links
zum Löschen der Artikel erhalten dann die einmal ID 0 für den Taschenrechner, einmal die ID 1 für
die Taschentücher und die 2 für die Taschenuhr.
Diese Zuordnung basiert auf einer momentanen Schau auf den Warenkorb und ist solange
stimmig, wie dieser unverändert bleibt.
Angenommen der Benutzer will jetzt den Taschenrechner (ID 0) löschen. Er klickt drauf und das
klappt auch. Klickt dann aber auf zurück und sieht, weil die Seite noch im Cache sei, nochmal seine
inzwischen vealtetet Liste in der auch der mitlerweile gelöschte Taschenrecher enthalten ist. Jetzt
will er auch noch die Taschentücher löschen und übergibt folglich, basierend auf einer veralteten
Indizierung die ID 1 als das zu löschende Objekt. Die Lösch-Routine löscht nun das
Array-Feld mit dem Index 1 aus dem Warenkorb-Array in der Session. Inzwischen sieht das
Warekorb-Array aber so aus, dass das erste Element (Index 0) die Taschentücher darstellt
und das zweite die Uhr (Index 1). Ein unset($_SESSION['basket'][1])) löscht also die Uhr anstatt
die Rotzfahnen, obwohl der Benutzer ja auf "Taschentücher löschen" geklickt hat!
Das mag ein absoluter Sonderfall sein, dass ein Benutzer derart auf die Nase fällt (auch wenn genau
diese Sonderfälle mit an Sicherheit grenzender Wahrscheinlichkeit eintreten! *g). Dahinter steckt
aber ein in verschiedenen Kontexten immer mal wieder zu beobachtender Fehler, dass die
Indizierungen/Identifikatoren oder wie auch immer man diese IDs nennt verändert werden, obwohl
noch Referenzen auf diese im Umlauf sind, die dann natürlich auf die falschen Objekte zeigen.
Klassisches Beispiel ist die Frage, wie man denn in einer Datenbank IDs inzwischen gelöschter
Datensätze neu vergeben kann. Die Antwort ensprechend: Man kann, man sollte es aber tunlichst
vermeiden.
Mach dir also keinen Kopf, wie du die Auswirkungen der Index-Veränderungen in den Griff
bekommst, sondern vermeide einfach von vorneherein jegliche Änderung in den Zuweisungen.
Basti