PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : XAMP gehts, auf realer server nicht: Fehler: Cannot use object of type ... as array


mysteryxxx
02.08.2008, 16:35:06
Hallo Leute

ich arbeite zurzeit an einem Projekt und ist eigentlich sogut wie fertig. Naja auf meinem Virtuellen Server (XXAMP) läuft und funktioniert alles nur auf dem realen Server gibt es ein problem mit dem Warenkorb class bzw darin ist ein array mit dem hat der irgendwie probleme.

Ich hab es so gemacht wenn jemand ein Artikel kaufen will bestimmte Werte an die Class Warenkorb.php gesendet werden und dort die funktion checkOK starten. Um sicher zu gehen hab ich mal in der funktion CheckOK getestet ob er überhautp die Werte bekommt und test war erfolgreich.

Die fehlermeldung ist immer: Fatal error: Cannot use object of type Warenkorb as array in ...class/warenkorb.php on line 67

durch einige if abfragen mit is_array merkt man das meine Variable kein array ist und ich denk mal genau daswegen gibt de rmir ne fehlermeldung obwohl es eigentlich ein array ist. Was komnisch ist, ist das beim ersten Kauf wenn wenn mandie seite betritt alles funktioniert und aber dem zweiten kauf gibt es dann diese fehlermeldung.

Server Version ist aktuellste also PHP 5.3 oder sowas

Das ist hier mein Warenkorb class, wäre schön wenn man mir helfen könnte sitze schon seit gestern an diesem Problem
<?php

class Warenkorb{

public $waren;

public function getArtikelNr($param){
if(is_array($this->waren)){
return $this->waren[$param][0];
}Else{return "Warenkorb Leer";}
}

public function getOrdner($param){
if(is_array($this->waren)) {
return $this->waren[$param][1];
}Else{return "Ordner Leer";}
}

public function getRubrik($param){
if(is_array($this->waren)){
return $this->waren[$param][2];
}Else{return "Rubrik Leer";}
}

public function getPreis($param){
if(is_array($this->waren)) {
return $this->waren[$param][3];
}Else{return "Preis Leer";}
}

public function getMenge($param){
if(is_array($this->waren)) {
return $this->waren[$param][4];
}Else{return "Menge Leer";}
}

public function setArraySession(){
unset($_SESSION['warenkorb']);
$_SESSION['warenkorb'] = $this->waren;
}

public function getArraySession(){
return $this->waren = $_SESSION['warenkorb'];
}

public function check($artikelNr, $ordnerX, $rubrik, $preis){
$this->getArraySession();
if(count($this->waren) == 10)
$_SESSION['warenkorbStatus'] = 'warenrkorbVoll';
else
$this->checkOK($artikelNr, $ordnerX, $rubrik, $preis);
}

public function checkOK($artikelNr, $ordnerX, $rubrik, $preis){
$check = 'true';
$menge = 1;
for($i=0; $i < count($this->waren); $i++){
if($artikelNr == $this->getArtikelNr($i)){
$check = 'false';
$menge = $this->waren[$i][4];
$menge++;
$this->waren[$i][4] = $menge;
break;
}
}
if($check == 'true'){
$this->waren[] = array($artikelNr, $ordnerX, $rubrik, $preis, $menge); <-------Line 67
var_dump($this->waren);
}
$this->setArraySession();
$_SESSION['warenkorbStatus'] = 'einkaufOK';
}
}
?>

mysteryxxx
03.08.2008, 10:33:10
Kann hier niemand den fehler finden?

wenn ich $this->waren mal mit var_dump() ausgeben bekomme ich das hier gesagt:

object(Warenkorb)#2 (1) { ["waren"]=> object(Warenkorb)#2 (1) { ["waren"]=> *RECURSION* } }

Wie kann ich das machen das es funktioniert? Auf xxamp geht alles nur auf dem server nicht und ich blick nicht durch was da los ist. Der soltle mein array wie üblich zum array machen und nicht zum objekt.

DokuLeseHemmung
03.08.2008, 12:08:45
Kann hier niemand den fehler finden?
Doch, ich könnte, mag aber nicht!
Weil:
Das Sessiongedöns im Warenkorb würde ich bleiben lassen, sondern das Warenkorbobjekt selbst in $_SESSION speichern.
Evtl. sogar die ArrayAccess Schnittstelle implementieren.

mysteryxxx
03.08.2008, 12:34:35
Verstehe ehrlichgesagt nicht wie du das meinst, aber wäre klasse wenn du mir meinen Fehler hier zeigen würdest damit ich das korrigieren kann, da ich selbst es nicht sehe obwohl es über xxamp einbahnfrei läuft allerdings nicht auf mein server.

DokuLeseHemmung
03.08.2008, 15:33:04
Ich kann dir wohl einen Codefetzen posten.......


<?php
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', TRUE);


$vorrat = array();
$vorrat[] = 'hemd';
$vorrat[] = 'pulli';
$vorrat[] = 'nagel';


class Warenkorb implements Countable
{

private $inhalt = Array();

public function hinzufuegen($artikel)
{
if (isset($this->inhalt[$artikel]))
{
$this->inhalt[$artikel]++;
}
else
{
$this->inhalt[$artikel] = 1;
}
}
public function count()
{
return count($this->inhalt);
}

public function entfernen($artikel)
{
if (isset($this->inhalt[$artikel]))
{
if($this->inhalt[$artikel]<=1)
unset($this->inhalt[$artikel]);
else $this->inhalt[$artikel]--;
}

}

public function leeren()
{
$this->inhalt = Array();
}

public function gibkorb()
{
return $this->inhalt;
}
}

session_start();


if(!isset($_SESSION['korb']))
{
$_SESSION['korb'] = new Warenkorb;
}
elseif(!($_SESSION['korb'] instanceof Warenkorb))
{
throw new Exception('Warenkorb kaputt (schon mit was anderm belegt)');
}

if(isset($_GET['artikel']))
{
$_SESSION['korb']->hinzufuegen($_GET['artikel']);
}

if (isset($_GET['entf']))
{
$_SESSION['korb']->entfernen($_GET['entf']);
}

if (isset($_GET['loeschen']))
{
$_SESSION['korb']->leeren();
}
?>
<html>
<body>
<h1>Warenkorb</h1>
<a href="?loeschen=1">Warenkorb löschen</a> <br>
<?php
if(count($_SESSION['korb']))
{
print "Sie haben folgende Artikel ausgewählt:<br> ";
foreach ($_SESSION['korb']->gibkorb() as $artikel => $anzahl)
{
print "Artikel $artikel Anzahl: $anzahl ";
print "<a href='?entf=$artikel'>";
print "Artikel entfernen</a><br>";
}
}else
{
print "Bisher nichts ausgewählt";
}

print " <h1>Folgende Artikel können Sie bestellen</h1>";
foreach($vorrat as $ding)
print "<a href='?artikel=$ding'>$ding in Warenkorb legen</a><br>";
?>

</body>
</html>