Warenkorb für ein bestehendes Layout

Hallo!
Es tut mir Leid, dass ich erst so spät schreibe, ich war ein paar Tage offline.
Dort verstehe ich den Code: "$_SESSION['artikel'][] = $_GET['aid'];" leider nicht.
Dass die Artikel in der Variable _SESSION gespeichert werden ist mir klar. Dass dort ein 2-dim Array erzeugt wird, seh ich auch. Nur die Frage ist was genau speichert er nun hinein?
Meine Theorie
Da die erste Ebene mit dem Begriff "artikel" bereits << belegt >> ist, geht er automatisch in die 2-te Ebene und schreibt dort die aid rein. Beginnt er mit dem 0-ten Element in der 2-ten Ebene. Wenn ich z.B. schon 3 Artikel gespeichert hab und einen weitern speichern möchte, füllt er das Array weiter auf und schreibt die 4-ten aid in das 3-te Element.
Stimmt das so?
Ja, genau! Stimmt alles was in deiner Theorie steht.
Ich muss gestehen du hast mich durchschaut *loool* ;-] :)
lg Andulus
 
Ja, genau! Stimmt alles was in deiner Theorie steht.

Hi Andulus,

hab noch eine Frage zu deinem Skript. Mit welchem Sinn (Hintergrund) hast du ein 2-dim Array angelegt? Um die Artikel zu speichern reicht natürlich auch ein 1-dim Feld.

Oder muss man aus rechtlichen Gründen vom User noch etwas anderes speichern, z.B. die IP. Die man auch in die _SESSION speichert und bei einer Bestellung "dauerhaft" in die Datenbank schreibt.

Oder was es nur zum Zweck der Übersichtlichkeit?

Grüsse,
Rexo
 
Hi!
@Rexo: Bezüglich deiner Frage: Ich habe es deshalb gemacht, weil ich es am einfachsten gefunden habe die Artikel-id in ein 2-dim. Array zu packen und es später mit der Funktion count() nachzuprüfen ob etwas im Warenkorb ist.
Und da der die for() - Schleife ja das mit dem $i++ ausnützt kann man nachher anhand des Arrays $_SESSION['artikel'][1] in unserem Fall, den wir natürlich klar als Vorteil erkennen, als $_SESION['artikel'][$i] darstellen und das PHP Script tut nichts anderes, als diese Nummern durchzulaufen bis es keine mehr gibt (sie wurden vorher per function count() gezaehlt) und später kann man für jede $_SESSION Anfrage die eindeutige Artikel-ID auslesen und diese dann z.b. mit Hilfe von Mysql-Anfragen weiterverarbeiten und Schlussendlich die gewuenschten Infos über diesen Artikel herauszufiltern.
Der zweite Vorteil bei dieser Array- bzw. Session- Methode liegt darin, dass man die Session später ganz einfach über $_GET und den Arrayparameter (sprich $_SESION['artikel'][2] oder was weiß ich....) die Session destroyen (Deutsch: zerstören bzw. löschen).
Ich hoffe es hat dir ein bisschen weitergeholfen und dich nicht noch mehr verwirrt als es bis vorhin schon getan hat ;)!
Lg Andulus
 
Hi Rexo!
Ich hab hier auch noch die modifizierte Version meines Scriptes.
Ansich eigentlich ganz gleich, ausser dass es in eine Klasse geordnet ist und es, wie ich
finde übersichtlicher gestaltet ist.
PHP:
<?

//______________________________________________________________________
//
//	OOP Warenkorb || [ c] 2006 Andulus
//______________________________________________________________________

class cart 
{
	var $aid;
	var $anzahl;
	function insert($id, $zahl) {
		session_start();
		$this->aid = $id;
		$this->anzahl = $zahl;
		$_SESSION['cart'][] = $this->aid;
		$_SESSION['anzahl'][] = $this->anzahl;
		header("LOCATION: ".$_SERVER['PHP_SELF']."?aktion=show&sid=".session_id()."");
	}
	function show() {
		session_start();
		$count = count($_SESSION['cart']);
		if($count > 0) {
		for($i = 0; $i < $count; $i++) {
			echo "AID: ".$_SESSION['cart'][$i]." | ";
			echo "ANZAHL: ".$_SESSION['anzahl'][$i]." | ";
			echo "<a href='?aktion=loeschen&arraynr=".$i."&sid=".session_id()."'>";
			echo "loeschen</a> | ";
			echo "<a href='?aktion=edit&arraynr=".$i."&ok=false&sid=".session_id()."'>";
			echo "aendern</a><br></n>";
		} 
		echo "<a href='?aktion=leeren&sid=".session_id()."'>Warenkorb leeren</a><br>\n";
		echo "<a href='?aktion=artikel&sid=".session_id()."'>Weiter Shoppen</a><br>\n";
		} else {
			echo "Ihr Warenkorb ist leer!";
		} }
	
	function delete($count) {
		session_start();
		unset($_SESSION['cart'][$count]);
		unset($_SESSION['anzahl'][$count]);
		header("LOCATION: ".$_SERVER['PHP_SELF']."?aktion=show&sid=".session_id()."");
	}
	function destroy() {
		session_start();
		session_unset($_SESSION['cart']);
		session_destroy();
		header("LOCATION: ".$_SERVER['PHP_SELF']."?aktion=show&sid=".session_id()."");
	}
	function artikel() {
		$i = 0;
		while($i < 3) {
			$i++;
			echo "AID: ".$i."<br><form action='?aktion=insert&aid=".$i."&sid=".session_id()."' method='post'>";
			echo "<input type='text' name='zahl' value='1'>";
			echo "<input type=submit value='in den warenkorb legen!'></form><br>\n";
			}
	}
	function aendern() {
		session_start();
		$nr = $_GET['arraynr'];
		$aid = $_SESSION['cart'][$nr];
		echo "AID: ".$aid."<br><form action='?aktion=edit&arraynr=".$nr."&ok=true&sid=".session_id()."' method='post'>";
		echo "<input type='text' name='zahl'><input type=submit value='aendern!'></form><br>\n";
		if($_GET['ok']=='true') {
			$_SESSION['anzahl'][$nr] = $_POST['zahl'];
			header("LOCATION: ".$_SERVER['PHP_SELF']."?aktion=show&sid=".session_id()."");
		}
	}		
}

$cart = new cart;
$action = $_GET['aktion'];

switch($action) {
	
	//______________________________________________________________________
	//
	//	aktion = artikel
	//______________________________________________________________________
	
	case '': $cart->artikel(); break;
	
	case 'artikel': $cart->artikel(); break;
	
	//______________________________________________________________________
	//
	//	aktion = show
	//______________________________________________________________________
	
	case 'show': $cart->show(); break;
	
	//______________________________________________________________________
	//
	//	aktion = insert
	//______________________________________________________________________
	
	case 'insert': $cart->insert($_GET['aid'], $_POST['zahl']); break;
	
	//______________________________________________________________________
	//
	//	aktion = loeschen
	//______________________________________________________________________
	
	case 'loeschen': $cart->delete($_GET['arraynr']); break;
	
	//______________________________________________________________________
	//
	//	aktion = leeren
	//______________________________________________________________________
	
	case 'leeren': $cart->destroy(); break;
	
	//______________________________________________________________________
	//
	//	aktion = edit
	//______________________________________________________________________
	
	case 'edit': $cart->aendern(); break;

}

?>
lg Andulus
 
Und da der die for() - Schleife ja das mit dem $i++ ausnützt kann man nachher anhand des Arrays $_SESSION['artikel'][1] in unserem Fall, den wir natürlich klar als Vorteil erkennen, als $_SESION['artikel'][$i] darstellen und das PHP Script tut nichts anderes, als diese Nummern durchzulaufen bis es keine mehr gibt (sie wurden vorher per function count() gezaehlt) und später kann man für jede $_SESSION Anfrage die eindeutige Artikel-ID auslesen und diese dann z.b. mit Hilfe von Mysql-Anfragen weiterverarbeiten und Schlussendlich die gewuenschten Infos über diesen Artikel herauszufiltern.

Das ganze würde aber auch mit nem 1-dim Array funktionieren :)

Danke für dein Skript als objektorientierte Version. Nachdem ich das erste nun verstanden hab, werd ich mir die veränderte Fassung auch anschauen und dann entsprechend verändern bzw. ergänzen. :)

Grüsse,
Rexo
 
Kein Problem!
Nur so zur Info: Bei dem "modifizierten" ;) Script ist an der Funktionsweise
eigentlich alles gleich.
Viel Spaß beim weiteren programmieren!
lg Andulus
 
Hallo!

Ich habe diesen Thread gefunden als ich die Forensuche gequält habe und mir das Script für meine Zwecke angepasst. Leider gibt es ein kleines Prolem:

Wählt man mehrere Artikel aus und löscht dann nicht den letzten sondern den ersten oder einen in der Mitte, bleibt der nachfolgende Artikel stehen. Allerdings ohne AID und lässt sich nicht mehr löschen ausser man zerstört den Warenkorb.

Unsicher ob es an meinen Änderungen liegt habe ich nochmal die originalversion ausprobiert (die OOP-Variante) und auch hier tritt der Fehler auf. Leider schaffe ich es nicht ihn zu beheben. Weiss jemand woran das liegen könnte? (der fehler, nicht daß ich ihn nicht beheben kann ;))

edit: Löscht man die Artikel vom letzten zum ersten geht alles problemlos und kann den Warenkorb komplett leeren.
 
Zuletzt bearbeitet:
Wählt man mehrere Artikel aus und löscht dann nicht den letzten sondern den ersten oder einen in der Mitte, bleibt der nachfolgende Artikel stehen. Allerdings ohne AID und lässt sich nicht mehr löschen ausser man zerstört den Warenkorb.

Wenn du dir den Array vorstellst, ist es relativ klar, dass der Fehler auftritt.

0 Nummer AID
1 Nummer AID
2 Nummer AID
3 Nummer AID

Nun löscht du die Zeile mit der Nummer 2:

Ergebnis_
0 Nummer AID
1 Nummer AID
2
3 Nummer AID

Diesen Fehler hast du oben beschrieben.

Abhilfe:
Code:
    function loeschen($delcount) {
session_start();
        $count = count($_SESSION['cart']);
		  for ($k=$delcount; $k < $count ; $k++) {
		  			$_SESSION['cart'][$k] = $_SESSION['cart'][$k+1];
		  			$_SESSION['anzahl'][$k] = $_SESSION['anzahl'][$k+1];

					}
         unset($_SESSION['cart'][$count-1]);
         unset($_SESSION['anzahl'][$count-1]);

        header("LOCATION: ".$_SERVER['PHP_SELF']."?aktion=show&sid=".session_id().""); 
    }
Dort wird der Inhalt von der letzten Zeile "zeilenweise" bis zu der zu löschenden Zeile kopiert und die letzte Zeile gelöscht.

Grüsse
 
Es passiert leider immer noch dasselbe. Naja da ich etwas Zeitdruck habe mache ich es jetzt einfach mit Datenbank. Trotzdem danke für die Hilfe!
 
Zurück