Antworten auf deine Fragen:
Neues Thema erstellen

Merkwürdiges und schwer erklärbares Problem mit einem Warenkorb

MrManko

Nicht mehr ganz neu hier

Hi @ all,

ich habe ein wirklich sehr merkwürdiges Problem mit meinem Warenkorb, da es sehr schlecht zu beschreiben ist ohne den Code einmal gesehn zu haben werde ich ihn hier auflisten.

PHP:
<?php
/* 15.01.2009 */
if(!isset($_SESSION['warenkorb'])) {
    $_SESSION['warenkorb'] = array();
}

function start($action) {

    if($action == "add") {
        //Hier wird der Artikel hinzugefügt
        addItemToCart($_GET['prod_id'],$_GET['quantity']);
    }

    else if($action == "edit") {
        //Hier wird der Artikel editiert
        editItemInCart($_GET['index'],$_GET['quantity']);
    }

    else if($action == "delete") {
        //Hier wird der Artikel gelöscht
         deleteItemFromCart($_GET['index']);
    }
        
    else if($action == "delete_all") {
        deleteAllItemsFromCart();
    }
        
    else {
         //Hier wird dann einfach der Warenkorb ohne Aktion aufgerufen
        calcCart();
    }

}

//Diese Funktion legt Artikel im Warenkorb ab
function addItemToCart($prod_id, $quantity) {

    //Argumente aufsplitten, falls es mehrere sind.
    $prod_input = explode("@", $prod_id);
    $quantity_input = explode("@", $quantity);
        
    //Durchläuft den Array $prod_input komplett
    for ($i=0; $i < count($prod_input); $i++) {
        //Liest den kompletten Inhalt des Warenkorbes ein
        foreach($_SESSION['warenkorb'] as $key => $value) {
            $inCart = false;
            //Überprüft, ob der Artikel schonmal im Warenkorb vorhanden ist.
            if (in_array($prod_input[$i], $value)) {
                $_SESSION['warenkorb'][$key][quantity] += $quantity_input[$i];
                $inCart = true;
            }
        }
        //Dieser if Zweig greift, falls der Artikel nicht im Warenkorb vorhanden war.
        if (!$inCart) {
           array_push($_SESSION['warenkorb'],array('prod_id' => $prod_input[$i], 'quantity' => $quantity_input[$i]));
        }
    }
    //Ruft den Warenkorb auf
    calcCart();
}
        
//Diese Funktion editiert die Anzahl eines Artikels
function editItemInCart($index, $quantity) {
        
    $index_input = explode("@", $index);
    $quantity_input = explode("@", $quantity);

    //Durchläuft den Array $prod_input komplett
    for ($i=0; $i < count($index_input); $i++) {
        //Liest den kompletten Inhalt des Warenkorbes ein
        $_SESSION['warenkorb'][$index_input[$i]]['quantity'] = $quantity_input[$i];
    }
        
    calcCart();
}
        
//Diese Funktion löscht Artikel aus dem Warenkorb
function deleteItemFromCart($index) {
        
    unset($_SESSION['warenkorb'][$index]);
        
    calcCart();

}

//Diese Funktion löscht alle Artikel aus dem Warenkorb
function deleteAllItemsFromCart() {
    unset($_SESSION['warenkorb']);

    $_SESSION['warenkorb'] = array();

    calcCart();
}

//Diese Funktion gibt den Inhalt des Warenkorbs aus
//Ausgabe kann alles sein: Direkte Ausgabe mit echo,
//Definition von Templatevariablen oder wie in diesem
//Fall eine XML Datei.
function calcCart() {

    header('Content-Type: application/xml');

    echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"; //<?

    echo "<cart>";

    $gesPreis = 0;
    foreach($_SESSION['warenkorb'] as $key => $value) { //foreach ist PHP 4 kompatibel

        $SQL = "SELECT * FROM products WHERE pID = '$value[prod_id]'";
        $RES = mysql_query($SQL);
        $ROW = mysql_fetch_assoc($RES);
        
        $prod_name = $ROW['pName'];
        //Rechnet den Artiklpreis mal die Anzahl
        $prod_price = $ROW['pPreis'] * $value['quantity'];

        // Hier dann die XML Ausgabe.
        echo "<prodIndex>$key</prodIndex>";
        echo "<prod>$prod_name</prod>";
        echo "<preis>$prod_price</preis>";
        echo "<anzahl>$value[quantity]</anzahl>";
        
        $gesPreis += $prod_price;
                

    }

    //Netto Wert in Brutto Wert umwandeln

    $gesPreisBrutto = NettoInBrutto($gesPreis);
    
    //Brutto Wert in Session speicher für PayPal API
    
    $_SESSION['gesPreis'] = $gesPreisBrutto;

    //Anzahl der abgelegten Produkte ermitteln

    $gesArtikel = count($_SESSION['warenkorb']);

    echo "<gesamtPreis>$gesPreis</gesamtPreis>";
    echo "<gesamtPreisBrutto>$gesPreisBrutto</gesamtPreisBrutto>";
    echo "<anzahlArtikel>$gesArtikel</anzahlArtikel>";
    echo "</cart>";
}

/*------------------------------------------------------------------------------------------------------------*/

function NettoInBrutto($arg) {
    $arg = 119*$arg/100;
    $arg = sprintf("%01.2f",$arg);
    return $arg;
}

?>
So und nun zum konkreten Problem. Bei einem bestimmten Aufruf von URL's tritt ein sehr merkwürdiger Fehler auf. Ich liste mal die Aufrufe der URL's und dann das Ergebnis auf.

Vorher gut zu wissen:

prod_id = 1 => Wundertüte aus dem Morgenland
prod_id = 2 => Jim Knopfs Knopf

Code:
1.) Aufruf: warenkorb.php?action=add&prod_id=2&quantity=1
   => 1x Jim Knopfs Knopf

2.) Aufruf: warenkorb.php?action=add&prod_id=1&quantity=1
   => 2x Jim Knopfs Knopf <-- (Das darf doch eig. gar nicht möglich sein)

3.) Aufruf: warenkorb.php?action=add&prod_id=1&quantity=1
   => 2x Jim Knopfs Knopf
   => 1x Wundertüte aus dem Morgenland
Wie ihr sehen könnt verhält sich mein Skript sehr merkwürdig oO und ich habe wirklich überhaupt keine Idee, wo das Problem liegen könnte. Ich denke es versteckt sich irgendwo in der function addItemToCart(), aber wo da oO ?

Ich hoffe ihr könnt mir bei diesem Problem helfen

LG

MrManko
 

netbandit

Aktives Mitglied

AW: Merkwürdiges und schwer erklärbares Problem mit einem Warenkorb

statt:
PHP:
$_SESSION['warenkorb'][$key][quantity] += $quantity_input[$i];
folgendes:
PHP:
$_SESSION['warenkorb'][$key][$quantity] += $quantity_input[$i];

evtl. ist das auch schon der Fehler, wenn nicht gucke ich noch mal drüber
 

MrManko

Nicht mehr ganz neu hier

AW: Merkwürdiges und schwer erklärbares Problem mit einem Warenkorb

Es war leider nur ein Schönheitsfehler, aber nicht DER Fehler. Trotzdem danke für den Hinweis, die Zeile muss eigentlich so lauten:

PHP:
$_SESSION['warenkorb'][$key]['quantity'] += $quantity_input[$i];

Da sieht man nun, das quantity eigentlich der Index eines assoziativen Arrays ist. Was mich so wunder ist, das er den Artikel mit der ID 2 zweimal einfügt, als wenn irgendetwas nicht richtig gelöscht wurde im Speicher...

Danke für das Angebot den Code nochmal anzuschauen :)

LG

MrManko
 

netbandit

Aktives Mitglied

AW: Merkwürdiges und schwer erklärbares Problem mit einem Warenkorb

Eigentlich brauchst Du doch als Array nur

$_SESSION['warenkorb']['produktid']=quantity;

Von daher verstehe ich nicht so ganz was Du mit der Anzahl als Key im folgenden noch willst:

$_SESSION['warenkorb'][$key]['quantity'] += $quantity_input[$i];
 

MrManko

Nicht mehr ganz neu hier

AW: Merkwürdiges und schwer erklärbares Problem mit einem Warenkorb

Ein Array von mir sieht wie folgt aus

Code:
Array (
   [0] => Array(
                 [prod_id] => 1
                 [quantity] => 5
            )
   [1] => Array(
                 [prod_id] => 2
                 [quantity] => 9
            )
)

Deswegen muss ich den Code so gestalten wie er ist, ich finde ich bin so flexibler.

LG

MrManko
 

Chickenshooter

Alter Mann

AW: Merkwürdiges und schwer erklärbares Problem mit einem Warenkorb

Moin,

@

Die Idee mit $_SESSION['warenkorb'][$produktid] = quantity;

ist super denn über die produktID ist das Prudukt ja schon

eindeutig identifiziert da brauchst Du keinen zusätzlichen Index

mehr siehe dein Array der hat 2 eindeutige Indizes.

PHP:
function addItemToCart($PID, $quant=0) {
    session_start();
    $_SESSION['warenkorb'][$PID] += $quant;
    calcCart();
}
 

MrManko

Nicht mehr ganz neu hier

AW: Merkwürdiges und schwer erklärbares Problem mit einem Warenkorb

Ich habe euren Ansatz mal verwirklicht und er funktioniert, tausend Dank, ich habe wohl bei einem Array mit 4 Dimensionen einfach den Überblick verloren ^^

Wenn jemand das snippet braucht, hier ist die Funktion addItemToCart in überarbeiteter Weise:

PHP:
function addItemToCart($prod_id, $quantity) {

    //Argumente aufsplitten, falls es mehrere sind.
    //$prod_input = explode("@", $prod_id);
    //$quantity_input = explode("@", $quantity);
    
    echo "Produkt ID: ".$prod_id."<br />";
    
    echo "Prod_input <br />";
    echo "<pre>";
    print_r($prod_input);
    echo "</pre>";
    
    $inCart = 0;
    //foreach($_SESSION['warenkorb'] as $key => $value) {
        //Überprüft, ob der Artikel schonmal im Warenkorb vorhanden ist.
        if (in_array($prod_id, $_SESSION['warenkorb'])) {
            $_SESSION['warenkorb'][$prod_id] += $quantity;
            $inCart = 1;
        }
    //}

    //Dieser if Zweig greift, falls der Artikel nicht im Warenkorb vorhanden war.
    if (!$inCart) {
        $_SESSION['warenkorb'][$prod_id] = $quantity;
    }
    
    echo "Session Warenkorb <br />";
    echo "<pre>";
    print_r($_SESSION['warenkorb']);
    echo "</pre>";
    
    //Ruft den Warenkorb auf
    calcCart();
}
 

netbandit

Aktives Mitglied

AW: Merkwürdiges und schwer erklärbares Problem mit einem Warenkorb

Und ich dachte schon ich wäre zu einfach gestrickt, konnte da beim besten Willen nichts flexibles finden :hmpf:
 

Chickenshooter

Alter Mann

AW: Merkwürdiges und schwer erklärbares Problem mit einem Warenkorb

Diese Überprüfung:
PHP:
$inCart = 0;
    //foreach($_SESSION['warenkorb'] as $key => $value) {
        //Überprüft, ob der Artikel schonmal im Warenkorb vorhanden ist.
        if (in_array($prod_id, $_SESSION['warenkorb'])) {
            $_SESSION['warenkorb'][$prod_id] += $quantity;
            $inCart = 1;
        }
    //}

    //Dieser if Zweig greift, falls der Artikel nicht im Warenkorb vorhanden war.
    if (!$inCart) {
        $_SESSION['warenkorb'][$prod_id] = $quantity;
    }

brauchst Du nicht, das ist das schöne an PHP

das Bsp was ich gepostet habe läuft so wie es da steht ohne

Prüfung ob $PID existiert.

Mach nich so kompliziert und wenn doch gut... sehr gut kommentieren,

denn sonst siehst Du nach 4 -6 Monaten nich mehr durch bei Dem was

Du heute "verzapfst".

MfG Chick
 
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

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