OOP: Problem mit Shopsystem; Inhalt wird im Objekt nicht abgespeichert

Kamephis

Mitglied
Guten Tag!

Ich versuche mich momentan an einem Shopsystem und möchte mich gleichzeitig an OOP heranwagen; habe hier ein schönes Buch neben mir liegen, was mein Problem auch soweit getroffen hat, alles schien gut zu gehen, bis der Warenkorb auf einmal nicht wie erwartet angezeigt wurde, weil im Objekt nichts abgespeichert wird (anscheinend, soweit bin ich bei der 'Fehleranalyse' gekommen).

Hänge jetzt hier schön längere Zeit fest, habe versucht in anderen Themen was zu finden, konnte aber leider nichts passendes auftreiben.

Der Code der Klasse:
PHP:
<?php 

class warenkorb

{

    var $art_anzahl=0;// Enthaelt die Anzahl der Artikel

    var $artikel=array();//assoz. Array fuer die Artikel

    var $datum=-1;  // enthaelt das aktuelle Datum

   

    function warenkorb() // Konstruktor initialisiert 

    {                            // die Eigenschaften

      $this->datum=date("Y-m-d-H"); // Fragt das Datum ab

    }

    function additem($id,$name,$size,$preis)  // Fuegt dem Warenkorb 

    {                                  

         $this->artikel[]=array($id,$name,$size,$preis); // einen Artikel hinzu
		 
		 $this->art_anzahl+=1;  // Anzahl Artikel korrigieren
		
      return true;

    }

     

    function removeItem($id) //Entfernt Artikel aus

    {                                    // dem Korb 

		if (true===isset($this->artikel[$art_nr])) // Artikel im

		{                                          // Warenkorb?

            unset($this->artikel[$art_nr]); //Artikel loeschen

            $this->art_anzahl-=$menge; //Artikelanzahl reduz. 

         return true; //Artikel entfernt od. Menge reduziert 

		}

      return false; // Artikelnummer nicht im Warenkorb

    }

  function showcart()  // Gibt den Warenkorb aus

   {

      if (0<count($this->artikel))  // Sind Artikel im Korb?

      {
		echo "
	<table border=0 width=85% cellspacing=0>
		<tr>
		  <td colspan=5 class=tpc><p style=\"margin-left:5\">WARENKORB<font size=2> - ($this->art_anzahl) Artikel enthalten</td>
		</tr>
		";
		$gesamtpreis = '0';
         foreach ($this->artikel as $artnr=>$menge) // Alle Artikel auslesen

         {                                

            echo "
			<tr>
			  <td width=1%></td>
			  <td width=40% class=con5a><p style=\"margin-left:5\">$menge[1]</td>
			  <td width=15% class=con5 align=center>$menge[2]</td>
			  <td width=15% class=con5 align=center>$menge[3]</td>
			  <td width=10% class=con5 align=center><a href=\"index.php?page=warenkorb&del=$artnr\">löschen</a></td>
			</tr>
			";
		$gesamtpreis+=$menge['3'];
         }   

        echo "
		<tr height=25>
		  <td width=1%></td>
		  <td width=40% colspan=4 class=con><br><br><br></td>
		</tr>
		<tr height=25>
		  <td width=1%></td>
		  <td width=15%  align=center class=con4 bgcolor=#CC6600><font color=white><b>Gesamtbetrag: <font size=3>$gesamtpreis Euros</td>
		  <td width=10% class=con4 align=center>&nbsp;&nbsp;<a href=\"index6.html\" onmouseover=\"Bildwechsel(navi6, navi6Pressed);\" onmouseout=\"Bildwechsel(navi6, navi6Out);\"><img name=navi6 border=0 src=img/bestellen.jpg></a>&nbsp;&nbsp;</td>
		</tr>
	</table>
		";

         return true; // Ausgabe erfolgreich

      }

      else

      {
		  echo "Warenkorb leer.";

         return false; // Warenkorb leer

      }

   }

}
?>

So hoffe das war gekürzt genug.

Beim Aufruf der showcart() Methode wird die elseschleife durchlaufen; die if-Schleife nur, wenn ich 0<= schreibe anstelle 0<; dann wird allesdings nur der HTML-Code ohne die erwarteten Daten angezeigt.

Der Code, wo eigentlich ein Artikel abgespeichert werden sollte:
PHP:
<?php
.
.
.
case "add":
$wahl = $korb->additem($id,$name,$size,$preis);
		if($wahl)
		{
			echo "Der Artikel $name wurde Ihrem Warenkorb erfolgreich hinzugefügt.<br>";
			echo "$id<br>$name<br>$size<br>$preis";
		}
		if(!$wahl)
		{
			echo 'Fehler aufgetreten.';
		}
break;
}

Ich bekomme keinen Fehler ausgegeben.
Bei dem 2. Codeteil wird mir die Erfolgsmeldung ausgegeben und die übergebenen Variablen $id, $name usw. werden ebenfalls korrekt angezeigt.

Deshalb meine Frage zu meinem Hauptproblem:
Warum wird anscheinend nichts abgespeichert?
Ich bin leider ratlos. :rolleyes:

Danke im Voraus,
Sven
 
Zuletzt bearbeitet:
oh ;)
Naja, halt einfach die Methode aufrufen:

PHP:
<?php
$korb->showcart();
?>

Ich poste vielleicht der Verständlichkeit zu liebe die komplette Methode showcard:
(btw ich editiere sie oben komplett rein, ist übersichtlicher denke ich.)
 
Wenn so dein Script zur Ausgabe aussieht, ist es klar, warum das nicht funktioniert. Das Objekt wird nirgends instanziert, und es werden auch keine Artikel hinzugefügt.
 
habe die sachen gegliedert in eine index.php, inder z.B. die config und die klasse eingebunden wird sowie das objekt instanziert mit:
PHP:
if(!isset($korb))
{
$korb = new warenkorb;
}

Alles weitere wird dann per include eingebunden; wie gesagt auf der Seite, wo ein Artikel hinzugefügt werden soll, da werden mir die übergebenen Variablen noch korrekt angezeigt, 'nur' nicht hinzugefügt...
Die Meldung, dass der Korb leer ist bzw wenn ich die Abfrage, ob der Korb leer ist weglasse die Rohfassung des Korbes werden ja auch korrekt ausgegeben; liegt also mit ziemlicher Sicherheit am hinzufügen.
 
Das "Artikel einfügen" und "Artikel ausgeben" muss schon im selben Script passieren oder du musst das Objekt z.B. in einer Session speichern, sonst kann auch nix ausgegeben werden.
Poste mal das ganze Ausgabe-Script (nur den relevanten Teil).
 
Ok, das war mein Fehler :/ habe das Objekt nirgends abgespeichert;
Ich dachte (denke?!), dass Kopien des Objekts automatisch abgespeichert werden?!

Falls dem wirklich nicht so ist: was empfielst du mir zur Speicherung? Wirklich sessions?
 
Wenn du ein Objekt instanzierst, dann liegt es im Speicher, aber sonst nirgends. Wenn du mit anderen Scripten darauf zugreifen willst, musst du die Objektdaten irgendwo abspeichern (Session, File, Datenbank, etc.)

Ich empfele dir, für einen Warenkorb keine Klasse zu schreiben. Das ist einfach Overkill. Wenn du nicht darauf verzichten kannst/willst, solltest du dein Warenkorb-Objekt in einer Session abspeichern.
 
Ok dankeschön!
Darauf, dass das nicht abgespeichert wird wäre ich so schnell nicht gekommen (auch wenn das gegenteilige anzunehmen ja eigentlich unlogisch ist... naja ^^).

Ist eigentlich auch nur eine OOP Übung für mich; dass ich das auch einfach mit einem normalen Array lösen könnte hat mir schon jemand anderes gesagt; aber langsamer wird es dadurch ja nicht merklich, also werde ich das nicht nochmal alles umschreiben ;) .

Bei was für Gelegenheiten hälst du denn OOP für sinnvoll? Scheinst dich damit wesentlich mehr auszukennen als ich ;). Bei nem Cup mit loginsystem und Ergebnisse/Datum etc eintragen?
 
In PHP gibt es wohl sehr wenige Anwendungen für OOP, mal abgesehen, das man bei PHP4 wohl nicht wirklich von OOP sprechen kann.
Anwenden würde ich es nur bei sehr komplexen Systemen, wie Template-Systemen o.a. Für "normale" Anwendungen, sprich Scripte, die im Endeffekt nur Daten aus einer DB holen und abspeichern, ist es meiner Meinung nach überflüssig bzw. bringt keinen wirklichen Vorteil.

Wenn du wirklich OOP lernen willst, dann schlag ich dir vor, dich mit Java zu beschäftigen. Ist recht einfach zu erlernen, aber man lernt schnell den Grundgedanken von OOP, was bei PHP meiner Meinung nach nicht der Fall ist.
 
Zurück