Antworten auf deine Fragen:
Neues Thema erstellen

Warenkorb funzt nicht

paddybee

Noch nicht viel geschrieben

Hallo Ihr da drausen,

muss gerade einen Warenkorb mit einigen Vorgaben realisieren, eigentlich funktioniert ja alles recht gut, aber wenn ich auf den Warenkorb gehe, ist da nur sie Anzahl und die Artikelnummer zu sehen nicht aber der Titel des Buches und auch nicht der Preis und somit auch keine Gesamtsumme.

Das Script besteht aus mehreren Teilen:

Warenkorb.inc, Artikel.inc, artikel.php, artikelliste.php, artikeldaten.xml, warenkorb.php und moch zwei für diese Frage nicht relevante Bestellskripts.


Warenkorb.inc lautet
PHP:
<?php
class Warenkorb {

var $inhalt = array();

// Hinzufügen eines Eintrags in den Warenkorb
function hinzufuegen($artikel) {
  if (isset($this->inhalt[$artikel])) {
    $this->inhalt[$artikel] = $this->inhalt[$artikel] + 1;
  } else {
    $this->inhalt[$artikel] = 1;
  }
}

// Entfernen eines Eintrags aus dem Warenkorb
function entfernen($artikel) {
  unset($this->inhalt[$artikel]);
}

// den Warenkorb komplett leeren
function leeren() {
  $this->inhalt = array();
}

}
?>
warenkorb.php:
PHP:
<?php
include_once("Artikel.inc");

  // Einstellen westeuropäischen Zeichensatz
header ("Content-type: text/html; charset=utf-8");

  // Einlesen der Klassendefinition
include("Warenkorb.inc");
include("artikelliste.php");

  // starte Session, falls nicht schon passiert
session_start();

  // hole Warenkorb-Objekt aus der Session, wenn vorhanden:
if (isset($_SESSION['korb'])) {
  $korb = $_SESSION['korb'];
}

if(!isset($korb) || !is_object($korb)) {
  $korb = new Warenkorb();
}

  // Parameter-Variable initialisieren (wird in XAMPP benötigt !)
if (isset($_GET['artikel']))   $artikel = $_GET['artikel'];
if (isset($_GET['entf']))      $entf = $_GET['entf'];
if (isset($_GET['loeschen']))  $loeschen = $_GET['loeschen'];

  // Artikel hinzufügen?
if (isset($artikel)) $korb->hinzufuegen($artikel);

  // Artikel entfernen?
if(isset($entf)) $korb->entfernen($entf);

  // Gesamten Warenkorb löschen?
if(isset($loeschen)) $korb->leeren();

  // Warenkorb zurück in die Session stellen, das bedeutet die  Warenkorb-Instanz
  // wird in das globale Array $_SESSION in das Index-Element 'korb'  gestellt.
$_SESSION['korb'] = $korb;

?>
<html>
<link rel="stylesheet" type="text/css" href="screen.css">
<title>Warenkorb</title>
<body>
<h1>Warenkorb</h1><hr><br>
<div id="warenkorb"><a  href="warenkorb.php?loeschen=1">Warenkorb l&ouml;schen</a>
<?php
  // Die if-Abfrage bewirkt, dass der Warenkorb-Inhalt nur dann  aufgelistet wird,
  // wenn auch ein Inhalt existiert:
if(!empty($korb->inhalt)) {
  print "<p>Sie haben bisher folgende Artikel  ausgew&auml;hlt:</p>";

  // die Variable für die Summe initialisieren:
  $summe = 0;

  // zeige alle bisher ausgewählten Artikel an. Hierfür wird ein sich  wiederholender Befehlsblock
  // mit der Anweisung 'foreach' erstellt:
 foreach ($korb->inhalt as $artikel=>$anzahl) {
  $gesamt =  $art[$artikel]->preis * $anzahl;
  $summe = $summe + $gesamt;
  print "<p>Artikelnummer: ".$artikel."   <br>".$art[$artikel]->name;
  print " <a href='warenkorb.php?entf=$artikel'>";
  print "Artikel entfernen</a><br />";
  print "Anzahl: ".$anzahl."<br> Einzel-Preis:  ".$art[$artikel]->preis."<br> Euro Gesamt: ".$gesamt."  Euro<br /></p>\n";
 }
  print "<hr><p>Summe im Warenkorb: ".$summe."  Euro</p>";
}
else {
  // Diese Ausgabe erfolgt nur, wenn der Warenkorb keinen Inhalt hat:
  print "<p>Sie haben nichts ausgew&auml;hlt.</p>";
}
?>

<p><form action="bestellung.php" method="post">
<input type="submit" value="Bestellung absenden">
</form></p>
<p><a href="artikel.php">Zur&uuml;ck zur  Artikel&uuml;bersicht</a></p></div>
</body>
</html>
Artikel.inc:

PHP:
<?php
class Artikel {
var $name;
var $anzahl;
var $preis;
function Artikel($name, $preis) {
$this->name = $name;
$this->anzahl = 1;
$this->preis = $preis;
}
}
?>
artikel.php:
PHP:
<?php
  // Einstellen westeuropäischen Zeichensatz
header ("Content-type: text/html; charset=UTF-8");

  // Aufbauen der Artikelliste. Hierbei ist zu beachten, dass das Skript "artikelliste.php"
  // nach Ausführung die Variable '$art', ein Array, zur Verfügung stellt.
  // Wird das Skript durch Verwendung der Klasse 'Artikelparser' geändert
  //steht die Variable '$art' so ohne Weiteres nicht zur Verfügung. Es sind dann
  // weitere Anweisungen notwendig, um '$art' verfügbar zu machen.
include("artikelliste.php");
?>
<html>
<link rel="stylesheet" type="text/css" href="screen.css">
<title>Artikelauswahl</title>
<body>
<h1>Folgende B&uuml;cher k&ouml;nnen Sie bestellen</h1>

<?php
print "<table cellspacing=5 cellpadding=6><tr><th>Art.-Nr.:</th><th>Bezeichnung</th><th>Preis</th></tr>\n "; 
  print "<hr><br>"; 
$datei = implode("", file("artikeldaten.xml"));
$artikelparser = new Artikelparser("artikeldaten.xml");
$art = $artikelparser->getArtikelArray();

foreach($artikelparser->art as $nummer=>$art_objekt) { 
print "<tr><td>".$art_objekt->nummer;     
print $nummer."</td>"; 
print 
" <td><a href='warenkorb.php?artikel=$nummer'>"; 
print $art_objekt->name; 
print "</a></td> <td class='preis'> ".$art_objekt->preis." Euro</td></tr>\n"; 
}
print"</table>";
?>

<br><br>
<p><a href="warenkorb.php">Warenkorb anzeigen</a></p><br><br>
artikelliste.php
PHP:
<?php
include_once("Artikel.inc");
$art = Array();

class Artikelparser{
var $akutell;
var $art;
var $nummer;
var $titel;
var $preis;

function Artikelparser($datei){
$this->art = Array();

$xmlFile = implode("", file("artikeldaten.xml"));
$parser = xml_parser_create();
xml_set_object($parser, $this);
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "cdata");
xml_parse($parser, $xmlFile);
xml_parser_free($parser);
}

function startElement($parser, $name, $atts){
$this->aktuell = $name;
if($name=="ARTIKEL"){
$this->nummer = $atts["NUMMER"];
}
}
function endElement($parser, $name){
if($name=="ARTIKEL"){
$this->art[$this->nummer] = new Artikel($this->titel, $this->preis);
}
$this->aktuell = "";
}
function cdata($parser, $text){
if($this->aktuell=="PREIS")$this->preis=$text;
if($this->aktuell=="NAME")$this->titel=$text;
}
function getArtikelArray(){
return $this->art;
}
}
?>
und zum Schluss noch die

artikeldaten.xml
PHP:
<?xml version="1.0" encoding="utf-8"?>
<artikeldaten>
        <artikel nummer="1001">
            <name>Die Bibel</name>
            <preis>39.90</preis>
        </artikel>
        <artikel nummer="2002">
            <name>Der kleine Prinz</name>
            <preis>19.90</preis>
        </artikel>
        <artikel nummer="3003">
            <name>HTML leicht gemacht</name>
            <preis>25.95</preis>
        </artikel>
        <artikel nummer="4004">
            <name>Flash CS4</name>
            <preis>29.90</preis>
        </artikel>
        <artikel nummer="5005">
            <name>Der Brockhaus</name>
            <preis>200.95</preis>
        </artikel>
        <artikel nummer="6006">
            <name>PHP Einstieg</name>
            <preis>34.85</preis>
        </artikel>        
</artikeldaten>

Ich denke der Knackpunkt ist der Kommentar in der warenkorb.php
Hierbei ist zu beachten, dass das Skript "artikelliste.php"
nach Ausführung die Variable '$art', steht ein Array, zur Verfügung stellt.
Für den warenkorb sind dannweitere Anweisungen notwendig, um '$art' verfügbar zu machen

Aber ich stehe irgendwie total auf dem Schlauch, wei ich das umsetzen soll kann mir bitte da jemand helfen?!? Bin total verzweifelt und eigentlich blutiger Anfänger auf dem Gebiet!

B.G.
Paddy
 
Zuletzt bearbeitet:

Christian

verpeilt & verschallert

AW: Warenkorb funzt nicht

Also das Problem, was Du hast ist, dass die Artikeldaten zum Zeitpunkt des Aufrufs nicht verfügbar sind, da sie erst über das Artikelparser Objekt instantiiert hätten sein müssen.
Das bewerkstelligen wir wie folgt:
PHP:
    if(!is_array($art) || (sizeof($art)<1)){
        $artikelparser = new Artikelparser("artikeldaten.xml");
        $art = $artikelparser->getArtikelArray();
    }

Und im Gesamten sähe Deine warenkorb.php so aus:
PHP:
<?php

include_once ("Artikel.inc");

// Einstellen westeuropäischen Zeichensatz
header("Content-type: text/html; charset=utf-8");
// Einlesen der Klassendefinition
include ("Warenkorb.inc");
// Aufbauen der Artikelliste. Hierbei ist zu beachten, dass das Skript  "artikelliste.php"
// nach Ausführung die Variable '$art', ein Array, zur Verfügung  stellt.
// Wird das Skript für die ESA-Aufgabe 3 abgeändert, dass dieses nun  eine Klasse 'Artikelparser'
// enthält, steht die Variable '$art' so ohne Weiteres nicht zur  Verfügung. Es sind dann
// weitere Anweisungen notwendig, um '$art' verfügbar zu machen.
include ("artikelliste.php");
// starte Session, falls nicht schon passiert
session_start();
// hole Warenkorb-Objekt aus der Session, wenn vorhanden:
if (isset($_SESSION['korb'])) {
    $korb = $_SESSION['korb'];
}
// Falls es der erste Aufruf ist, muß zuerst ein neuer Warenkorb  angelegt werden.
// Hierfür wird mit der Klassenbeschreibung "Warenkorb" eine neue  Instanz mit 'new' erstellt.
// Die Klassenbeschreibung "Warenkorb" wird im Skript 'Warenkorb.inc'  erstellt.
if (! isset($korb) || ! is_object($korb)) {
    $korb = new Warenkorb();
}
// Parameter-Variable initialisieren (wird in XAMPP benötigt !)
if (isset($_GET['artikel']))
    $artikel = $_GET['artikel'];
if (isset($_GET['entf']))
    $entf = $_GET['entf'];
if (isset($_GET['loeschen']))
    $loeschen = $_GET['loeschen'];
    // Artikel hinzufügen?
if (isset($artikel))
    $korb->hinzufuegen($artikel);
    // Artikel entfernen?
if (isset($entf))
    $korb->entfernen($entf);
    // Gesamten Warenkorb löschen?
if (isset($loeschen))
    $korb->leeren();
    // Warenkorb zurück in die Session stellen, das bedeutet die  Warenkorb-Instanz
// wird in das globale Array $_SESSION in das Index-Element 'korb'  gestellt.
$_SESSION['korb'] = $korb;
?>
<html>
<link rel="stylesheet" type="text/css" href="screen.css">
<title>Warenkorb</title>
<body>
<h1>Warenkorb</h1>
<hr>
<br>
<div id="warenkorb"><a href="warenkorb.php?loeschen=1">Warenkorb
l&ouml;schen</a>
<?php
// Die if-Abfrage bewirkt, dass der Warenkorb-Inhalt nur dann  aufgelistet wird,
// wenn auch ein Inhalt existiert:
if (! empty($korb->inhalt)) {
    //Überprüfung, ob es die Artikeldaten schon gibt, wenn nicht
    //muss die XML Datei  aufbereitet und die Artikeldaten als 
    //Array geparsed und zur Verfügung gestellt werden
    if(!is_array($art) || (sizeof($art)<1)){
        $artikelparser = new Artikelparser("artikeldaten.xml");
        $art = $artikelparser->getArtikelArray();
    }
    print "<p>Sie haben bisher folgende Artikel  ausgew&auml;hlt:</p>";
    // die Variable für die Summe initialisieren:
    $summe = 0;
    // zeige alle bisher ausgewählten Artikel an. Hierfür wird ein sich  wiederholender Befehlsblock
    // mit der Anweisung 'foreach' erstellt:
    foreach ($korb->inhalt as $artikel => $anzahl) {
        $gesamt = $art[$artikel]->preis * $anzahl;
        $summe = $summe + $gesamt;
        print "<p>Artikelnummer: " . $artikel . "   <br>" . $art[$artikel]->name;
        print " <a href='warenkorb.php?entf=$artikel'>";
        print "Artikel entfernen</a><br />";
        print "Anzahl: " . $anzahl . "<br> Einzel-Preis:  " . $art[$artikel]->preis . "<br> Euro Gesamt: " . $gesamt . "  Euro<br /></p>\n";
    }
    print "<hr><p>Summe im Warenkorb: " . $summe . "  Euro</p>";
} else {
    // Diese Ausgabe erfolgt nur, wenn der Warenkorb keinen Inhalt hat:
    print "<p>Sie haben nichts ausgew&auml;hlt.</p>";
}
?>

<p>


<form action="bestellung.php" method="post"><input type="submit"
	value="Bestellung absenden"></form>
</p>
<p><a href="artikel.php">Zur&uuml;ck zur Artikel&uuml;bersicht</a></p>
</div>
</body>
</html>

Eigentlich muss man ja sowas als Aufgabe selber bewerkstelligen, aber aus eigener Erfahrung weiß ich, dass das eben nicht mal eben so zu verstehen geht.
 

ChrisvA

Aktives Mitglied

AW: Warenkorb funzt nicht

Der Fehler liegt soweit ich das sehen kann, in der Datei warenkorb.php. Die Variable $art, die eigentlich die Produktinformationen bereitstellen sollte, bekommt soweit ich das sehen kann nie einen Wert zugewiesen.
Allgemein würde ich empfehlen, zumindest während der Entwicklung error_reporting(E_ALL); in die Skripte rein zuschreiben. Dann meckert PHP, etwas mehr und weißt auf mehr Fehler hin.

Edit: Jetzt habe ich mir zu viel Zeit gelassen.

PS:
// Parameter-Variable initialisieren (wird in XAMPP benötigt !)

Man sollte sich nie darauf verlassen, dass register_globals aktiviert ist.
 
Zuletzt bearbeitet:

Christian

verpeilt & verschallert

AW: Warenkorb funzt nicht

@ChrisvA
Nein das Problem liegt ganz klar daran, dass $art nur als Array deklariert wurde - aber als ein leeres ohne jeglichen Inhalt. Wenn man sich parallel dazu die Artikel.php anschaut stellt man fest, dass $art erst Werte nach der Zuweisung von $art = $artikelparser->getArtikelArray(); bekommt. Und um an das Artikelparser Objekt zu kommen, sollte man es natürlich auch instantiieren.


Edit:
Allerdings ohne Flax, es würde mich interessieren um was für eine Aufgabe es sich hier handelt, da ich den Quelltext heute nicht das erste Mal hier im Forum sehe ;-)
 
Zuletzt bearbeitet:

paddybee

Noch nicht viel geschrieben

AW: Warenkorb funzt nicht

Danke Euch die Version von Christian hat prima geklappt! Jetzt funktioniert es plöttzlich alles wie gewünscht. Und ich verstehe jetzt sogar weshalb das funktioniert!

error_reporting(E_ALL); werde ich mir merken muss vermutlich immer ganz an den Anfang des Skripts gell?!

B.G.
paddy
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.067
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben