Onlineshop / $_SESSION und index Problem

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Onlineshop / $_SESSION und index Problem

    Guten Abend,

    Habe mich mal an einen kleinen Onlineshop gewagt der zunächst einmal Produkte aus einem Array anbietet, später werd ich diese mit einer Datenbank natürlich erweitern.
    Das Array sieht folgendermaßen aus:
    PHP-Code:
    ini_set("session.use_cookies""0");
    ini_set("url_rewriter.tags","");

    session_start();

    $waren = array(
    '1' => array(
    'name' => 'Äpfel',
    'titel' => '<img src = "Bilder/apfel.jpg" title="Apfel" width="200" height="200"',
    'preis' => 3.00
    'text' => 'Das hier sind hochwertige Äpfel',
    'nr' => 'Obst-01'
    ),
    '2' => array(
    'name' => 'Birnen',
    'titel' => '<img src = "Bilder/birnen.jpg" title="Birne" width="200" height="200"',
    'preis' => 3.50
    'text' => 'Das hier sind hochwertige Birnen',
    'nr' => 'Obst-02'
    ),
    '3' => array(
    'name' => 'Bananen',
    'titel' => '<img src = "Bilder/banane.jpg" title="Birne" width="200" height="200"',
    'preis' => 2.50
    'text' => 'Das hier sind hochwertige Bananen',
    'nr' => 'Obst-03'
    )
    ); 
    Hier starte ich auch die Session. Diese Datei include ich dann in meine index.php
    PHP-Code:
    include ('oben.php');
    ?>
    <h2>Produkte</h2><hr>
    <?php 

    foreach ($waren as $id => $produkt) {
        
    printf('
        <fieldset><legend><h3>%s</h3></legend>
        <table>
        <tr>
        <td>
        %s
        </td>
        <td>
        <ul type ="square">
            <li>Preis:</li>
            <ul>
            <li>Euro %01.2f</li>
            </ul>
            <li>Genaue Beschreibung:</li>
            <ul>
            <li>%s</li>
            </ul>
            </ul>
            </td>
            </tr>
            </table>
            <a href="setkorb.php?id=%d&%s">In den Warenkorb</a>
            <br>
            </fieldset>
            <br>
            <br>
            '
    ,
       
    $produkt['name'],
       
    $produkt['titel'],
       
    $produkt['preis'],
       
    $produkt['text'],
       
    $id,
       
    SID       
        
    );
    }
    wo die Werte im array aufbereitet werden mit eienr foreach schleife und ausgegeben werden. so nun zu meinem ersten Problem. ich habe zusätzlich ein loesch.php erstellt die einzelne Werte die ich in den Warenkorb lege wieder heruasslöscht. die Datei sieht so aus:
    PHP-Code:
    include ('oben.php');

    // Wenn kein Produkt ausgewählt wurde, oder
    // das Produkt nicht im warenkorb ist...
    if(!isset($_GET['id']) || 
        !
    in_array($_GET['id'], $_SESSION['warenkorb'])) {
        
            print(
    "Sie haben dieses Produkt noch nicht bestellt
                oder kein Produkt ausgew&auml;hlt."
    );
    }else{
        foreach (
    $_SESSION['warenkorb'] as $id => $produkt) {
            if( 
    $produkt == $_GET['id']) {
                unset(
    $_SESSION['warenkorb'][$id]);
            }
        }
        print 
    "<p>Das Produkt wurde aus dem Warenkorb gel&ouml;scht.</p>";

    die inkludierte oben.php datei is die Datei wo das Array sich befindet.Nun bekomme ich wenn ich einen Eintrag lösche eine Fehlermeldung "Undefined index: warenkorb" ich kann mir das nich erklären die $_SESSION['warenkorb'] müsste aber existieren, als Folgefehler kommt noch "in_array() parameters 2 to be array.." dieser Fehler is mir klar da er mit der $_SESSION nix anfangen kann. Nun gibt er die erste Bedingung aus das kein Produkt ausgewählt ist, und löscht nicht nur den ausgewählten Eintrag sondern alle Einträge. Habt ihr dazu vielleicht eine Idee?Weil ich werd dazu nich schlau der code sollte richtig sein.

    mfg

    AzoZ

  • #2
    Zitat von AzoZ Beitrag anzeigen
    PHP-Code:
    ini_set("session.use_cookies""0");
    ini_set("url_rewriter.tags",""); 
    So besonders kenne ich mich mit Shops und Warenkörben zwar nicht aus, doch warum soll die Session nicht in Cookies gespeichert werden? Bisher verwende ich nur diese Zeile, damit keine PHPSESSID sichtbar wird und speichere Sessions in Cookies:

    PHP-Code:
    ini_set("session.use_trans_sid""0"); 
    Nun Gut, so genau kenne ich mich halt nicht aus, vielleicht lerne ich jetzt noch etwas dazu. Doch wo übergibst Du id an Session und wo und wie speicherst Du die dann? Also so etwas ähnliches wie:

    PHP-Code:
    if (isset($_GET["id"]) and !empty($_GET["id"])) {

        
    $bestellung $_GET["id"];
        
    $bestellung preg_replace("/[^0-9]/",""$bestellung);

        
    $_SESSION["warenkorb"] = $bestellung;

    Edit: Muss aber dazu bemerken, dass ich mich "url_rewriter.tags" noch nie beschäftigte und wenn ich nun die Beschreibung lese, mir nicht so sicher bin, was ich davon halten soll.

    Wobei dieser Abschnitt dann ja noch irgendwie ausgebaut werden müsste, um die Werte von der Bestellung aufzunehmen.

    PHP-Code:
     $_SESSION["warenkorb"]["id"] = $bestellung;  // oder so ähnlich 
    Braucht jetzt nicht alles richtig zu sein, was ich so schrieb, wird auch nicht richtig sein, doch irgendwie muss ja da schon etwas gespeichert werden. Am Ende könnte es dann etwas in der Art ergeben, was Du da in $_SESSION["warenkorb"] speichern könntest, nehme ich zumindest mal an.

    PHP-Code:
    $_SESSION["warenkorb"]["id"]["artikel"]  = $bestellung;
    $_SESSION["warenkorb"]["id"]["name"]     = $name;
    $_SESSION["warenkorb"]["id"]["titel"]    = $titel
    Zuletzt geändert von Melewo; 05.06.2013, 12:20.

    Kommentar


    • #3
      Habe mal den Code ausprobiert:


      PHP-Code:
      <?php
      ini_set
      ("session.use_cookies""0");
      ini_set("url_rewriter.tags","");

      session_start();

      // Notice: Undefined index: id in ... (auch nach dem Neuladen einer Seite)
      // url_rewriter.tags, wofür ist das gut?
      // Wie soll da was in welcher Session wo gespeichert werden, Da habe ich eine Lücke?

      echo $_SESSION["id"]; 


      // Doch so geht es halt. Warenkorb ist nach Klick auf Bestellung und nach dem Neuladen einer Seite gefüllt.

      if (isset($_GET["id"]) and !empty($_GET["id"])) {

          
      $warenkorb $_GET["id"];
          
      $warenkorb preg_replace("/[^0-9]/",""$warenkorb);
          
      $_SESSION["warenkorb"] = $warenkorb;  
      }

      // Kontrolle warenkorb: 3 

      if (isset($_SESSION["warenkorb"]) and !empty($_SESSION["warenkorb"])) {

          
      $warenkorb $_SESSION["warenkorb"];
          
      $warenkorb preg_replace("/[^0-9]/",""$warenkorb);
          echo 
      "Kontrolle warenkorb: ".$warenkorb."\n";
      }


      $waren = array(
          
      '1' => array(
              
      'name' => 'Äpfel',
              
      'titel' => 'Bild',
              
      'preis' => 3.00,
              
      'text' => 'Das hier sind hochwertige Äpfel',
              
      'nr' => 'Obst-01'
          
      ),
          
      '2' => array(
              
      'name' => 'Birnen',
              
      'titel' => 'Bild',
              
      'preis' => 3.50,
              
      'text' => 'Das hier sind hochwertige Birnen',
              
      'nr' => 'Obst-02'
          
      ),
          
      '3' => array(
              
      'name' => 'Bananen',
              
      'titel' => 'Bild',
              
      'preis' => 2.50,
              
      'text' => 'Das hier sind hochwertige Bananen',
              
      'nr' => 'Obst-03'
          
      )
      );
      ?>
      <h2>Produkte</h2><hr>
      <?php

      foreach ($waren as $id => $produkt) {
          
      printf('
          <fieldset><legend><h3>%s</h3></legend>
          <table>
          <tr>
          <td>
          %s
          </td>
          <td>
          <ul type ="square">
              <li>Preis:</li>
              <ul>
              <li>Euro %01.2f</li>
              </ul>
              <li>Genaue Beschreibung:</li>
              <ul>
              <li>%s</li>
              </ul>
              </ul>
              </td>
              </tr>
              </table>
              <a href="setkorb.php?id=%d&%s">In den Warenkorb</a>
              <br>
              </fieldset>
              <br>
              <br>
              '
      ,
         
      $produkt['name'],
         
      $produkt['titel'],
         
      $produkt['preis'],
         
      $produkt['text'],
         
      $id,
         
      SID
          
      );
      }

      ?>
      Und mal das Listing etwas umgeschrieben:

      PHP-Code:
      <?php
      ini_set
      ("session.use_trans_sid""0");  

      session_start();

      // Kontrolle ob Warenkorb gefüllt ist:

      if (isset($_SESSION["warenkorb"]) and !empty($_SESSION["warenkorb"])) {

          echo 
      "Kontrolle Warenkorb: <pre>\n";
          
      print_r($_SESSION["warenkorb"]);
          echo 
      "</pre>\n";
      }

      /* Ausgabe von $_SESSION["warenkorb"] nach Klick auf Link zum Bestellen

      Kontrolle warenkorb:

      Array
      (
          [id] => 2
          [name] => Birnen
          [titel] => Bild mit Birnen
          [preis] => 3.50
          [text] => Das hier sind hochwertige Birnen
      )
      */

      // Warenkorb füllen

      if (isset($_GET["id"]) and !empty($_GET["name"])) {

          
      $id_wk trim($_GET["id"]);
          
      $name  trim($_GET["name"]);    
          
      $titel trim($_GET["titel"]);
          
      $preis trim($_GET["preis"]);
          
      $text  trim($_GET["text"]);    
          
          
      $_SESSION["warenkorb"]["id"]    = preg_replace("/[^0-9]/",""$id_wk);
          
      $_SESSION["warenkorb"]["name"]  = preg_replace("/[^a-zA-ZäöüÄÖÜß0-9\s]/",""$name);
          
      $_SESSION["warenkorb"]["titel"] = preg_replace("/[^a-zA-ZäöüÄÖÜß0-9\s]/",""$titel);
          
      $_SESSION["warenkorb"]["preis"] = preg_replace("/[^0-9.]/",""$preis);
          
      $_SESSION["warenkorb"]["text"]  = preg_replace("/[^a-zA-ZäöüÄÖÜß0-9\s._-]/",""$text);
           
      }

      // Hier wie gehabt, weiter unten einige Punkte verändert.

      $waren = array(
          
      '1' => array(
              
      'name' => 'Äpfel',
              
      'titel' => 'Bild mit Äpfeln',
              
      'preis' => 3.00,
              
      'text' => 'Das hier sind hochwertige Äpfel',
              
      'nr' => 'Obst-01'
          
      ),
          
      '2' => array(
              
      'name' => 'Birnen',
              
      'titel' => 'Bild mit Birnen',
              
      'preis' => 3.50,
              
      'text' => 'Das hier sind hochwertige Birnen',
              
      'nr' => 'Obst-02'
          
      ),
          
      '3' => array(
              
      'name' => 'Bananen',
              
      'titel' => 'Bild mit Bananen',
              
      'preis' => 2.50,
              
      'text' => 'Das hier sind hochwertige Bananen',
              
      'nr' => 'Obst-03'
          
      )
      );
      ?>
      <h2>Produkte</h2><hr>
      <?php

      // Im Listing einige Punkte umgeschrieben:

      foreach ($waren as $id => $produkt) {
          
      printf('
          <fieldset><legend><h3>%s</h3></legend>
          <table>
          <tr>
          <td>
          %s
          </td>
          <td>
          <ul type ="square">
              <li>Preis:</li>
              <ul>
              <li>Euro %01.2f</li>
              </ul>
              <li>Genaue Beschreibung:</li>
              <ul>
              <li>%s</li>
              </ul>
              </ul>
              </td>
              </tr>
              </table>
              <a href="setkorb.php?id=%d&name=%s&titel=%s&preis=%01.2f&text=%s">In den Warenkorb</a>
              <br>
              </fieldset>
              <br>
              <br>
              '
      ,
         
      $produkt['name'],
         
      $produkt['titel'],
         
      $produkt['preis'],
         
      $produkt['text'],
         
      $id,
         
      $produkt['name'],
         
      $produkt['titel'],
         
      $produkt['preis'],
         
      $produkt['text']
          );
      }

      ?>
      Zuletzt geändert von Melewo; 05.06.2013, 15:13.

      Kommentar


      • #4
        Der Array müsste dann wohl noch mehrdimensional aufgebaut werden, um da mehr als ein Produkt pro Kunden speichern zu können. Doch so als Test sollte es erst einmal genügen.

        PHP-Code:
        <?php
        ini_set
        ("session.use_trans_sid""0");  

        session_start();

        // Kontrolle ob Warenkorb in gefüllt ist:

        if (isset($_SESSION["warenkorb"]) and !empty($_SESSION["warenkorb"])) {

            echo 
        "Kontrolle Warenkorb: <pre>\n";
            
        print_r($_SESSION["warenkorb"]);
            echo 
        "</pre>\n";
        }

        /* Ausgabe von $_SESSION["warenkorb"] nach Klick auf Link zum Bestellen

        Kontrolle Warenkorb:

        Array
        (
            [Kunde-01] => Array
                (
                    [id] => 2
                    [name] => Birnen
                    [titel] => Bild mit Birnen
                    [preis] => 3.50
                    [text] => Das hier sind hochwertige Birnen
                )

        )

        */

        // Warenkorb füllen

        $kunde "Kunde-01";

        if (isset(
        $_GET["id"]) and !empty($_GET["name"])) {

            
        $id_wk trim($_GET["id"]);
            
        $name  trim($_GET["name"]);    
            
        $titel trim($_GET["titel"]);
            
        $preis trim($_GET["preis"]);
            
        $text  trim($_GET["text"]);    
            
        $kunde preg_replace("/[^a-zA-Z0-9\s-]/",""$kunde);
            
            
        $_SESSION["warenkorb"][$kunde]["id"]    = preg_replace("/[^0-9]/",""$id_wk);
            
        $_SESSION["warenkorb"][$kunde]["name"]  = preg_replace("/[^a-zA-ZäöüÄÖÜß0-9\s]/",""$name);
            
        $_SESSION["warenkorb"][$kunde]["titel"] = preg_replace("/[^a-zA-ZäöüÄÖÜß0-9\s]/",""$titel);
            
        $_SESSION["warenkorb"][$kunde]["preis"] = preg_replace("/[^0-9.]/",""$preis);
            
        $_SESSION["warenkorb"][$kunde]["text"]  = preg_replace("/[^a-zA-ZäöüÄÖÜß0-9\s._-]/",""$text);
             
        }

        $waren = array(
            
        '1' => array(
                
        'name' => 'Äpfel',
                
        'titel' => 'Bild mit Äpfeln',
                
        'preis' => 3.00,
                
        'text' => 'Das hier sind hochwertige Äpfel',
                
        'nr' => 'Obst-01'
            
        ),
            
        '2' => array(
                
        'name' => 'Birnen',
                
        'titel' => 'Bild mit Birnen',
                
        'preis' => 3.50,
                
        'text' => 'Das hier sind hochwertige Birnen',
                
        'nr' => 'Obst-02'
            
        ),
            
        '3' => array(
                
        'name' => 'Bananen',
                
        'titel' => 'Bild mit Bananen',
                
        'preis' => 2.50,
                
        'text' => 'Das hier sind hochwertige Bananen',
                
        'nr' => 'Obst-03'
            
        )
        );
        ?>
        <h2>Produkte</h2><hr>
        <?php

        // Listing einige Punkte umgeschrieben:

        foreach ($waren as $id => $produkt) {
            
        printf('
            <fieldset><legend><h3>%s</h3></legend>
            <table>
            <tr>
            <td>
            %s
            </td>
            <td>
            <ul type ="square">
                <li>Preis:</li>
                <ul>
                <li>Euro %01.2f</li>
                </ul>
                <li>Genaue Beschreibung:</li>
                <ul>
                <li>%s</li>
                </ul>
                </ul>
                </td>
                </tr>
                </table>
                <a href="setkorb.php?id=%d&name=%s&titel=%s&preis=%01.2f&text=%s">In den Warenkorb</a>
                <br>
                </fieldset>
                <br>
                <br>
                '
        ,
           
        $produkt['name'],
           
        $produkt['titel'],
           
        $produkt['preis'],
           
        $produkt['text'],
           
        $id,
           
        $produkt['name'],
           
        $produkt['titel'],
           
        $produkt['preis'],
           
        $produkt['text']
            );
        }

        ?>
        Das ließ mir nun auch keine Ruhe, funktioniert sogar. Nach Klick auf 2 Links zum Bestellen
        und nach dem Neuladen der Seite befinden sich beide Artikel im Warenkorb
        vom Kunden ("Kunde-01").

        PHP-Code:
        <?php
        ini_set
        ("session.use_trans_sid""0");  
        session_start();

        // Kontrolle ob Warenkorb in gefüllt ist:

        if (isset($_SESSION["warenkorb"]) and !empty($_SESSION["warenkorb"])) {

            echo 
        "Kontrolle Warenkorb: <pre>\n";
            
        print_r($_SESSION["warenkorb"]);
            echo 
        "</pre>\n";
        }

        /* 
        Ausgabe von $_SESSION["warenkorb"] nach Klick auf 2 Links zum Bestellen 
        und nach dem Neuladen der Seite befinden sich beide Artikel im Warenkorb
        vom Kunden ("Kunde-01").

        Kontrolle Warenkorb:

        Array
        (
            [Kunde-01] => Array
                (
                    [2] => Array
                        (
                            [name] => Birnen
                            [titel] => Bild mit Birnen
                            [preis] => 3.50
                            [text] => Das hier sind hochwertige Birnen
                        )

                    [1] => Array
                        (
                            [name] => Äpfel
                            [titel] => Bild mit Äpfeln
                            [preis] => 3.00
                            [text] => Das hier sind hochwertige Äpfel
                        )

                )

        )
        */

        // Warenkorb füllen

        $kunde "Kunde-01";

        if (isset(
        $_GET["id"]) and !empty($_GET["name"])) {

            
        $id_wk trim($_GET["id"]);
            
        $name  trim($_GET["name"]);    
            
        $titel trim($_GET["titel"]);
            
        $preis trim($_GET["preis"]);
            
        $text  trim($_GET["text"]);    
            
        $kunde preg_replace("/[^a-zA-Z0-9\s-]/",""$kunde);
            
        $id_wk preg_replace("/[^0-9]/",""$id_wk);
            
            
        $_SESSION["warenkorb"][$kunde][$id_wk]["name"]  = preg_replace("/[^a-zA-ZäöüÄÖÜß0-9\s]/",""$name);
            
        $_SESSION["warenkorb"][$kunde][$id_wk]["titel"] = preg_replace("/[^a-zA-ZäöüÄÖÜß0-9\s]/",""$titel);
            
        $_SESSION["warenkorb"][$kunde][$id_wk]["preis"] = preg_replace("/[^0-9.]/",""$preis);
            
        $_SESSION["warenkorb"][$kunde][$id_wk]["text"]  = preg_replace("/[^a-zA-ZäöüÄÖÜß0-9\s._-]/",""$text);
             
        }
        Wenn ich nun bedenke, eigentlich sollte sich ja für die Kunden die Session ID mitverwenden lassen, dann würde es so aussehen.

        PHP-Code:
        <?php
        ini_set
        ("session.use_trans_sid""0");  
        session_start();
        $kunde session_id();

        // Kontrolle ob Warenkorb in gefüllt ist:

        if (isset($_SESSION["warenkorb"]) and !empty($_SESSION["warenkorb"])) {

            echo 
        "Kontrolle Warenkorb: <pre>\n";
            
        print_r($_SESSION["warenkorb"]);
            echo 
        "</pre>\n";
        }

        /* 
        Ausgabe von $_SESSION["warenkorb"] nach Klick auf 3 Links zum Bestellen 
        und nach dem Neuladen der Seite befinden sich beide Artikel im Warenkorb
        vom Kunden mit der Session ID414q4gc8gi1s9fqqrp301eg372.

        Kontrolle Warenkorb:

        Array
        (
            [414q4gc8gi1s9fqqrp301eg372] => Array
                (
                    [3] => Array
                        (
                            [name] => Bananen
                            [titel] => Bild mit Bananen
                            [preis] => 2.50
                            [text] => Das hier sind hochwertige Bananen
                        )

                    [1] => Array
                        (
                            [name] => Äpfel
                            [titel] => Bild mit Äpfeln
                            [preis] => 3.00
                            [text] => Das hier sind hochwertige Äpfel
                        )

                    [2] => Array
                        (
                            [name] => Birnen
                            [titel] => Bild mit Birnen
                            [preis] => 3.50
                            [text] => Das hier sind hochwertige Birnen
                        )

                )

        )

        */

        // Warenkorb füllen
        // $kunde = "Kunde-01" wurde durch $kunde = session_id() ersetzt

        if (isset($_GET["id"]) and !empty($_GET["id"])) {

            
        $id_wk trim($_GET["id"]);
            
        $name  trim($_GET["name"]);    
            
        $titel trim($_GET["titel"]);
            
        $preis trim($_GET["preis"]);
            
        $text  trim($_GET["text"]);    
            
        $id_wk preg_replace("/[^0-9]/",""$id_wk);
            
            
        $_SESSION["warenkorb"][$kunde][$id_wk]["name"]  = preg_replace("/[^a-zA-ZäöüÄÖÜß0-9\s]/",""$name);
            
        $_SESSION["warenkorb"][$kunde][$id_wk]["titel"] = preg_replace("/[^a-zA-ZäöüÄÖÜß0-9\s]/",""$titel);
            
        $_SESSION["warenkorb"][$kunde][$id_wk]["preis"] = preg_replace("/[^0-9.]/",""$preis);
            
        $_SESSION["warenkorb"][$kunde][$id_wk]["text"]  = preg_replace("/[^a-zA-ZäöüÄÖÜß0-9\s._-]/",""$text);
             
        }
        Zuletzt geändert von Melewo; 05.06.2013, 16:45.

        Kommentar


        • #5
          Dein Code stammt wohl mehr oder weniger aus diesem Beispiel von Sessions (reeg.junetz.de/DSP/node30.html) und wenn Du da noch die bestellen.php mit verwendest, dann sollte es wohl funktionieren.

          Bestellen

          Die Datei bestellen.php legt Produkte in den Warenkorb

          PHP-Code:
          // In den Warenkorb legen:
              
          $_SESSION['warenkorb'][] = $_GET['id']; 
          Leider kann ich kein Datum entdecken, doch in der Einleitung wird der Unterschied von PHP 3 zu PHP 4 erklärt, so dass auch der Umgang mit Session erklärlich wird. In der Zeit um die Jahrtausendwende war es noch mehr oder weniger schick, wie im Beispiel, die PHPSESSID sichtbar anzuhängen.

          PHP-Code:
          index.php?PHPSESSID=edb0e8zz5et4e9042fe0176a89cbde16 
          Doch die Zeiten haben sich ein wenig gewandelt.

          Kommentar

          Lädt...
          X