AW: PHP - Problem bei Session
So nun Antworten und Lösungen:
Du hast die Session immer wieder überschrieben
ich habe die warenkorb.php angepasst:
PHP:
<?php
include("Warenkorb.inc");
session_start();
/* checken ob $_SESSION['korb'] vom Typ Warenkorb ist */
if(is_a($_SESSION['korb'],"Warenkorb"))
$korb = new Warenkorb($_SESSION['korb']);
else
/* wenn nicht vom Typ Warenlorb dann neue Instanz */
$korb = new Warenkorb();
/* Testausgabe des Objektes $korb */
echo "<div style=\"border: 1px solid red; margin:20px; padding:5px;\"><h3>Testausgabe des Objects:</h3>". print_r($korb,true)."</div>";
// Artikel hinzufügen?
//if (isset($artikel)) $korb->hinzufuegen($artikel);
if (isset($_GET['artikel'])) $korb->hinzufuegen($_GET['artikel']);
// Artikel entfernen?
//if (isset($entf)) $korb->entfernen($entf);
if (isset($_GET['entf'])) $korb->entfernen($_GET['entf']);
// Gesamten Warnkorb löschen?
//if (isset($loeschen)) $korb->leeren();
if (isset($_GET['loeschen']) && intval($_GET['loeschen'])==1)
$korb->leeren();
/* das ist neu siehe Warenkorb.inc */
$korb->writeInSession();
?>
<html>
<body>
<h1>Warenkorb</h1>
<a href="warenkorb.php?loeschen=1">Warenkorb löschen</a>
<p>Sie haben bisher folgende Artikel ausgewählt: <p>
<?php
/* das ist neu siehe Warenkorb.inc */
$korb->printCart(false);
?>
<br /><a href="bestellung.php">Zur Bestellung</a>
<br /><a href="artikel.php">Artikelliste</a>
</body>
</html>
so und nu die Klassendefinition Warenkorb.inc
PHP:
<?php
class Warenkorb {
var $inhalt = Array();
/**
* Hier mal ein Konstruktor
*
* @param Warenkorb $warenkorb
* @return Warenkorb
*/
function Warenkorb($warenkorb=null)
{
if (is_a($warenkorb,"Warenkorb"))
{
$this->inhalt = $warenkorb->inhalt;
}
}
/**
* schreib den Warenkorb als komplettes Object in die Session
*
*/
function writeInSession()
{
session_start();
$_SESSION['korb'] = $this;
}
/**
* Liest die Session aus
*
*/
function readSession()
{
session_start();
$_SESSION['korb'] = $this;
}
/**
* Listet den Warenkorb auf wahlweise als return oder als Direktausgabe
*
* @param Boolean $return
* @return Strring
*/
function printCart($return=true)
{
$r="Nichts im Warenkorb!";
if ( is_array($this->inhalt) && count($this->inhalt)>0 )
{
$r="";
foreach ($this->inhalt as $artikel=>$anzahl)
{
$r.="Artikelnummer: $artikel ";
$r.="<a href='warenkorb.php?entf=$artikel'>Artikel entfernen</a><br/ >";
$r.="Anzahl: $anzahl<br>";
/* Das folgende Gebilde kannst Du dir weg sparen wenn Du dann mit Deiner Artikelklasse arbeitest
if ($artikel == 1001)
print "Der Herr der Ringe<p>";
if ($artikel == 2002)
print "Der kleine Hobbit<p>";
if ($artikel == 3003)
print "Grimms Märchen<p>";
if ($artikel == 4004)
print "Elric von Melnibonee <p>";
*/
}
}
if ($return)
return $r;
else
echo $r;
}
/**
* Schreibt den Warenkorb in eine XML-Datei
*
* @param Srring $fileName
* @return Integer or false
*/
function writeOrder($fileName="bestellung.xml")
{
$inhalt = '<?xml version="1.0" encoding="iso-8859-1"?>';
$inhalt .= "<bestellung>";
foreach ($this->inhalt as $id => $anz)
{
$inhalt .= '<artikel nummer="'.$id.'" anzahl = "'.$anz.'" />';
}
$inhalt .= "</bestellung>";
return file_put_contents($fileName,$inhalt);
}
/**
* Menge fuer eine bestimmte Position hochzählen
*
* @param Integer $artikel
*/
function hinzufuegen($artikel) {
$this->inhalt[$artikel]++;
}
/**
* Menge fuer eine bestimmte Position runterzählen
* wenn menge 0 dann Position aus Array entfernen
*
* @param Integer $artikel
*/
function entfernen($artikel) {
//unset($this->inhalt[$artikel]);
$this->inhalt[$artikel]--;
if ($this->inhalt[$artikel]<=0) {
unset($this->inhalt[$artikel]);
}
}
/**
* Array $inhalt löschen
*
*/
function leeren() {
$this->inhalt = Array();
}
}
?>
bei mir funzt der Code richtig gut und auch das Listing in der bestellung.php
sieht gut aus hier der Code der bestellung.php
PHP:
<?php include("Warenkorb.inc");
session_start();
$korb = new Warenkorb();
$korb->readSession();
echo '<pre>'; print_r($korb);echo '</pre>';
$file = "bestellung.xml";
/* das ist neu siehe Warenkorb.inc */
if ($korb->writeOrder($file))
echo '<div style="border:3px solid green; margin:30px; padding:20px;">Bestellung in die Datei '.$file.' geschrieben.</div>';
else
echo '<div style="border:3px solid red; margin:30px; padding:20px;">Bestellung <b>NICHT</b> in die Datei '.$file.' geschrieben.</div>';
?>
MfG