Chris: Session + Array = Warenkorb?

Hallo!

Ich bin gerade am Versuch, einen Warenkorb zu programmieren.
Leider habe ich null Erfahrung mit Sessions...

Ich möchte in einem mehrdimensionalen Array "Produkt-ID" und "Produkt-Anzahl" speichern. Eben dieses Array soll in der Session-Variable gespeichert werden. Nur kriege ich das ganze nciht so recht auf die Reihe:

<script language="PHP">
//add, id + menge sind input

if (add==ok)
{
        $temp=$_SESSION["warenkorb"];

$temp[$id][$menge];

$_SESSION["warenkorb"] = $temp;
}
</script>

Ich weiß selbst, dass der Code hier nicht doll ist... Es soll auch viel mehr ein Ansatz sein.

Vielleicht kann mir ja jemand helfen und mir erklären, wie man das macht.

DANKE

  1. Hallo!

    <script language="PHP">

    oh, oh, oh, was ist denn das? Das ist doch kein Javascript! Aber die Datei heißt .php, oder?

    //add, id + menge sind input

    if (add==ok)
    {
            $temp=$_SESSION["warenkorb"];

    soweit so gut!

    $temp[$id][$menge];

    Du weißt was Du hier machst?
    Mal kurz zu Arrays:
    http://www.php.net/manual/de/language.types.array.php
    http://www.dclp-faq.de/q-arrays-mehrdimensional.html

    Du kannst nicht die elemente so hintereinander hängen. Das wäre auch nicht mehrdimensional!!! Was Du willst ist:

    $temp['id'] = $id;
    $temp['menge'] $menge;

    ich habe das mal so gelöst:

    // Session-Warenkorb in Variable schreiben
    $warenkorb = $_SESSION["warenkorb"];

    // Neuen Artikel in eigenen Array schreiben
    $neuer_artikel = array ('PID' => $PID,
                            'Beschreibung' => $beschr,
                            'Preis' => $preis,
                            'Anzahl' => $anzahl);

    // neuen Artikel an Warenkorb-Array anhängen, der Warenkorb enthält pro Artikel einen Array
    array_push($warenkorb,$neuer_artikel);

    // geänderten Warenkorb wieder in Session speichern
    $_SESSION["warenkorb"] = $warenkorb;

    Dann hast Du immer zugriff auf den Artikel:

    $warenkorb = $_SESSION["warenkorb"];

    // Preis des ersten Artikels im Warenkorb
    echo $warenkorb[1]['Preis'];

    // Beschreibung das 12. Artikels:
    echo $warenkorb[12]['Beschreibung'];

    OK?

    Den Warenkorb auflisten kannst Du dann z.B. so:

    foreach(warenkorb as $artikel){
        echo $artikel['PID'];
        echo " - ";
        echo $artikel['Beschreibung'];
        echo " - ";
        echo $artikel['Preis'];
        echo "<br>";
    }

    Grüße
    Andreas

    1. Hallo,

      <script language="PHP">
      oh, oh, oh, was ist denn das? Das ist doch kein Javascript!

      Nein, kein JavaScript. Es steht doch PHP da ...

      Wo ist Dein Problem mit dieser absolut gueltigen Schreibweise? Der PHP-Interpreter springt darauf genauso an wie bei <?php ... ?> und im Ausgabe-HTML-Code sind diese <script ...>-Zeilen natuerlich nicht mehr vorhanden.

      Das ist wohl die unueblichste Schreibweise, die aber bei bestimmten Editoren, die mit den "normalen" PHP-Tags nicht klar kommen, hilfreich sein kann.

      MfG, Thomas

      1. hallo!

        Nein, kein JavaScript. Es steht doch PHP da ...

        Wo ist Dein Problem mit dieser absolut gueltigen Schreibweise? Der PHP-Interpreter springt darauf genauso an wie bei <?php ... ?> und im Ausgabe-HTML-Code sind diese <script ...>-Zeilen natuerlich nicht mehr vorhanden.

        Ups, das wußte ich nicht, wieder was gelernt! Hatte ich aber wiklich noch nie gehört!

        Grüße
        Andreas

    2. Erstmal Danke für die Tipps!
      Nur das mit dem Array funktioniert noch immer nicht so recht. Ich habe den Quelltext soweit Deiner Antwort angepasst.

      Beim session_register merkt der Interpreter irgendwie nicht, dass warenkorb ein Array sein soll...

      Warning: First argument to array_push() needs to be an array in basket.php on line 31

      Warning: Invalid argument supplied for foreach() in basket.php on line 60

      Line 31: array_push( $warenkorb, $neuer_artikel );

      Line 60: foreach(warenkorb as $artikel)

      1. Das Array-Problem habe jetzt gelöst. Beim eachfor hat das $-Zeichen gefehlt...

        @Andreas

        Weißt Du wie ich einen Artikel wieder einfach entfernen kann?

        Ich dachte so:
        ------------------------------------------------------------
        foreach($warenkorb as $artikel){
            echo $artikel['PID'];
            echo " - ";
            echo $artikel['Anzahl'];
            echo " - ";
            echo $artikel['Rabatt'];
            echo " - ";

        echo "<form action='basket.php' method='post' target='_self'>";
        echo "<input type='hidden' name='id' value='";
        echo $artikel['PID'];
        echo "'>";
        echo "<input type='Text' name='menge' value='";
        echo $artikel['Anzahl'];
        echo "' size='2' maxlength='2'>";
        echo "<input type='Submit' name='minus' value='ok'>";
        echo "</form>";

        echo "<br>";
        }
        ------------------------------------------------------------

        Wie muss ich jetzt die Funktion hinter dem Minus-Button belegen?

        1. Hallo!

          Wie muss ich jetzt die Funktion hinter dem Minus-Button belegen?

          naja, ich mache das normalerweise mit Links, an die ich in der Schleife die jeweilige Nummer des Artikels hänge. Aber ich würde das evtl. etwas anders machen:

          die Produkt ID scheibe ich jetzt nicht in den Artikel-Array, sondern als key des Artikel array, dann kann man hinterher einfacher auf Artikel zugreifen/löschen:

          $neuer_artikel = array ('Beschreibung' => $beschr,
                                  'Preis' => $preis,
                                  'Anzahl' => $anzahl);

          // das geht so nicht mehr:
          array_push($warenkorb,$neuer_artikel);

          // sondern nur noch so:
          $warenkorb[$PID] = $neuer_artikel;

          //jetzt noch die Schleife anpassen:
          foreach($warenkorb as $id => $artikel){
              echo $id;
              echo " - ";
              echo $artikel['Beschreibung'];
              echo " - ";
              echo $artikel['Preis'];
              echo "<br>";

          // und jetzt der Link zum löschen:
              echo <a href="$PHP_SELF?delete=$id">entfernen</a>;
              echo "<br>";
          }

          So, jetzt hast Du einen Link auf dieselbe Seite, mit dem Parameter delete und dem Wert der jeweiligen Produknummer.

          Jetzt mußt Du am Anfang der Seite abfragen, ob "delete" übergeben wird, also

          if(isset($_GET['delete'])){
             // und jetzt nur das Element aus dem Array löschen:
             $del_id= $_GET['delete'];
             unset($warenkorb[$del_id]);
          }

          Vergiss nicht vorher

          $warenkorb = $_SESSION["warenkorb"];

          und nochwas:
          Du brauchst gar kein session_register(hattest Du doch verwendet, oder?) mit

          $_SESSION["warenkorb"] = $warenkorb ;

          Wird der Wert in der Session automatisch überschrieben!

          Nur dann darfst Du am Anfang nicht session_start() vergessen ;-)

          Habe das aber alles nicht getestet!

          Grüße
          Andreas

          PS: guck Dir mal folgende Seiten an uns bookmarke die:

          zu arrays allgemein:
          http://www.dclp-faq.de/ch-arrays.html
          http://www.schattenbaum.net/php/array.php
          http://www.php.net/manual/de/ref.array.php

          zu Sessions
          http://www.dclp-faq.de/ch-version4_session.html
          http://www.php.net/manual/de/ref.session.php
          (komme gerade nicht aufs php manual aber da ist auch noch ein sehr ausführliche Anleitung zu Arrays und wie das mit den Sessions funktioniert)