Hilfe beim Session-Management

Die Frage ist eine Meta-Frage, auf die man so gut wie jede Antwort geben könnte ;)

Kannst du evtl. mal ein bisschen mehr Code posten oder zumindest beschreiben, wie den Warenkorb programmiert hast? Arbeitest du mit Sessions? Mit Cookies? Komplett andere Technik?
 
Hi,

im Prinzip geht es immernoch um das gleiche Script, siehe deine ea.zip. Hier der Code von class_artikel

Vielen Dank
PHP:
<?php
require_once ("class_sitzungsSeite.php");

class artikel extends sitzungsSeite
{
  protected $artikelArray = array();

  public function __construct($dateiname)
  {
    parent::__construct();
    $data = simplexml_load_file($dateiname);
    foreach($data as $k => $v)
    {
      $artNr = intval($v->attributes());
      foreach($v as $k1 => $v2)
      {
        $this->artikelArray[$artNr][$k1] = (string)$v2;
      }
    }
  }

  public function anzeigen()
  {
    foreach($this->artikelArray as $key => $value)
    {
      foreach($value as $subKey => $subVal)
      {
        if ($subKey == "name")
        {
          print "<a href=\"".$_SERVER['PHP_SELF']."?id=".$key."\">".$subVal."</a>\n";
        }
        else
          print $subVal." Euro\n";
      }
      print "<br />\n";
    }
  }

  public function waehlen($artikelnummer)
{
  if(isset($this->korb[$artikelnummer]))
    $this->korb[$artikelnummer]++;
  else
    $this->korb[$artikelnummer] = 1;
}

  public function bestellen($kunde, $datei = "bestellung.xml")
  {
    if(!is_integer($kunde))  # Gültigen Kundennummer?
      throw new Exception('Keine Kundennummer'); # Fehler ausgeben
    else
    {
      if(count($this->korb) > 0)
      {
        $xml = new SimpleXMLElement("<bestellung></bestellung>");
        # Attribut "kunde" schreiben
        $xml->addAttribute("kunde", $kunde); 
        foreach($this->korb as $key => $value) # Artikel bearbeiten
        {
          $art = $xml->addChild("artikel"); # Neues <artikel>-Element
          $art->addAttribute("name", $key);
          $art->addAttribute("anzahl", $value);
        }
        $error = $xml->asXML($datei);  # Datei schreiben.
        $this->korb = array();    # Auswahl löschen.
        return $error;
      }
      return false; # keine Artikel ausgewählt
    }
  }
}
?>
 
Zuletzt bearbeitet von einem Moderator:
Habe den Fehler gefunden. Er befindet sich im Konstruktor der sitzungsSeite-Klasse:

Hier erstmal das Original:
PHP:
  public function __construct()
  {
    session_start();
	
    if (!is_array(isset($_SESSION['korb']))) // Hier ist der Bug!
    {
      $_SESSION['korb'] = array();
    }
    $this->korb = $_SESSION['korb'];
  }

Das Problem ist, das die if-Prüfung immer wahr zurück liefern wird, denn

- is_array() prüft, ob eine Variable bzw. ein Wert ein Array ist
- isset() gibt ein "true" zurück, wenn eine Variable nicht leer bzw. gesetzt ist, oder "false" wenn die Variable nicht exisiert oder leer ist
- demzufolge prüft laut dem Code, die is_array-Funktion, ob entweder true oder false ein Array ist, was beides mal falsch ist.
- Dadurch, das für dem is_array() ein Ausrufe-Zeichen steht, wird die Prüfung negiert, sprich man geht vom Gegenteil aus.

Wir schreiben jetzt mal in unserer Sprache, was da geprüft würde:

"Prüfe, ob der Wert von $_SESSION['korb'] nicht leer ist. Übergib das Ergebnis an 'Prüfe, ob der Wert kein Array ist'" => Das ist immer wahr!

Folglich wird der Code im Anweisungsblock immer ausgeführt, die Session-Variable wird also immer überschrieben, und damit das, was eine Seite zuvor in die Session geschrieben wurde, wieder gelöscht. Daher ist dein Warenkorb immer leer.


Die korrekte Prüfung dürfte lauten:

PHP:
  public function __construct()
  {
    session_start();
	
    if (!is_array($_SESSION['korb']))
    {
      $_SESSION['korb'] = array();
    }
    $this->korb = $_SESSION['korb'];
  }
 
Zurück