Ankündigung

Einklappen
Keine Ankündigung bisher.

$_SESSION Probleme

Einklappen

Neue Werbung 2019

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

  • $_SESSION Probleme

    Hallo!
    Ich habe leider erheblich Probleme mit einer Session. Ich möchte diese nutzen, um eine Bestellliste zu erstellen.
    Ich habe also das session_start(); direkt am anfang des Skriptes, die SessionId wird als Cookie gespeichert und meine PHP Version ist die 5.2.9 .

    Das Problem ist folgendes: Es soll die Möglichkeit geben, mehrere Artikel über die Sessionvariablen zu speichern. Ich habe mich dazu entschlossen, drei Arrays zu erstellen. Ein Array für die Artikel ID, ein Array für die Anzahl und ein weiteres für die Bestellnummer.
    Nun hänge ich bei jeden neuen Artikel den ich hinzufüge, die Daten am Array an und lese sie später über einen Index wieder aus. Das funktioniert auch alles ganz gut. Allerdings läuft es auf den Testserver beinahe ohne Probleme und auf dem Webserver sind die Arrays nach 4 - 5 Artikel schon zerschossen. Des Weiteren bekomme ich, wenn ich das Array mit Hilfe der implode Funktion in einen String speichern will folgende Fehlermeldung.

    Warning: implode() [function.implode]: Invalid arguments passed in /home/.../on line 42

    Dazu hier ein bisschen Code, um verschiedene Sachen zu realisieren. Ich hoffe mir schreibt jemand, das ich einen furchtbaren Denkfehler habe und alles gut wird

    PHP-Code:
    <?php
        
    //Titel zur Session hinzufügen
            //Wenn keiner der Übergebenen Werte leer ist
            
    if($_POST['id'] != '' && $_POST['quantity'] != ''){                            
                    
    $i sizeof($_SESSION[books]);
                    
    $_SESSION[books][$i] = $_POST[id];
                    
    $_SESSION[quantity][$i] = $_POST[quantity];
                    
    $_SESSION[orderNr][$i] = 0;
                    
        
                    }else if(
    $_POST['id'] != '' && $_POST['quantity'] == ''){                //Wenn keine Menge angegeben wurde
                    
    $status '<p style="color: red;">Es wurde keine Menge angegeben!</p>';
                    }
        
        
    //Best-Nr. hinzufügen
        
    if($_REQUEST['method'] == 'addOrderNr') {
            
    $_SESSION[orderNr][$_REQUEST[entry]] = $_POST[orderNr];
            
    $status '<p style="color: green;">Die Bestellnummer wurde aktualisiert!</p>';
            }
        
        
    //Titel aus der Session entfernen
        
    if($_REQUEST['del'] != ''){

            
    array_splice($_SESSION[books], $_REQUEST['del'], 1);
            
    array_splice($_SESSION[quantity], $_REQUEST['del'], 1);
            
    array_splice($_SESSION[orderNr], $_REQUEST['del'], 1);

            
    $deletedEntry $_REQUEST['del'] + 1;
            
    $status '<p style="color: green;">Der ' $deletedEntry '. Eintrag wurde entfernt!</p>';
            }
        
        
    //Komplette Titelliste löschen    
        
    if($_REQUEST['destroy'] == 1){
            unset(
    $_SESSION['books']);
            unset(
    $_SESSION['quantity']);
            unset(
    $_SESSION['orderNr']);
            
    $status '<p style="color: green;">Die Liste wurde gelöscht!</p>';
            }    

        if(
    $_REQUEST['method'] == 'addToOrder'){
            If(isset(
    $_SESSION['books'])){
            
    $books implode(' '$_SESSION['books']);
            
    $quantity implode(' '$_SESSION['quantity']);
            
    $orderNr implode(' '$_SESSION['orderNr']);
            
    $status $books;
            }else{
                
    $status 'Die Variable ist nicht gesetzt!';
                }
            
    //Datenbankabfrage formulieren
            
    $query 'UPDATE bestellungen SET books ="' $books '", quantity ="' $quantity '", orderNr="' $orderNr '" WHERE id ="' $_POST['orders'] . '"';
            include (
    'db_data.php');
            
    mysql_query($query);
            
    //$status = '<p style="color: green;">Die Liste wurde der Bestellung hinzugefügt!</p>';
            
    }    
        
    //Workflow aus Bestellung öffnen
        
    if($_REQUEST['method'] == 'reOpen') {
            
    //1. Alten Workflow löschen
            
    unset($_SESSION['books']);
            unset(
    $_SESSION['quantity']);
            unset(
    $_SESSION['orderNr']);
            
    //2. Bestellung aus der Datenbank laden
            
    $query 'SELECT * FROM bestellungen WHERE id = 59';
            include (
    'db_data.php');
            
    $result mysql_query($query);
            
    $row mysql_fetch_array($result);
            
    //3. Daten in die Arrays laden
            
    $_SESSION['books'] = explode(' '$row['books']);
            
    $_SESSION['quantity'] = explode(' '$row['quantity']);
            
    $_SESSION['orderNr'] = explode(' '$row['orderNr']);
            
    $status '<p style="color: green;">Die Bestellung wurde geladen!</p>';

            }
        
        
    //Verabreitung der Eingaben
            //Erstellen neuer Bestellungen
            
    if($_REQUEST['method'] == 'new'){
                
    $timestamp time();
                
    $orderNr date(ymdHi$timestamp);
                
    $orderDate date('d.m.Y'$timestamp);
                
                
    //Datenbankabfrage formulieren
                
    $query 'INSERT INTO bestellungen (rechnungsNr, Rechnungsdatum, customerId, shipping) VALUES ("' $orderNr '", "' $orderDate '", "' $_POST['customer'] . '", "' $_POST['shipping'] . '")';
            
                
    //Datenbankverbindung aufbauen    
                
    include ('db_data.php');
                
                
    //Verbindung ausführen
                
    mysql_query($query);
                
    $status '<p style="color: green;">Neue Bestellung erstellt!</p>';
                }
            
            
    //Löschen von Bestellungen
            
    if($_REQUEST['method'] == 'delOrder'){
                
                
    //Datenbankabfrage formulieren
                
    $query 'DELETE FROM bestellungen WHERE id =' $_REQUEST['id'];
            
                
    //Datenbankverbindung aufbauen    
                
    include ('db_data.php');
                
                
    //Verbindung ausführen
                
    mysql_query($query);
                
    $status '<p style="color: green;">Bestellung gelöscht!</p>';
                }
    ?>
    <h2>Rechnungsverwaltung</h2>
    <fieldset>
        <legend>Rechnung erstellen</legend>
            <table width="750" cellspacing="10" style="font-size: 10pt;">
                <tr>
                    <td>Empfänger: </td><td><form action="index.php?link=order&method=new" method="POST"><select size="1" name="customer" id="customer">
                            <?php     
                                            
    //Datenbankabfrage formulieren
                                            
    $query = ('SELECT id, name FROM customer ORDER BY name DESC');
                                            
    //Datenbankverbindung aufbauen    
                                            
    include ('db_data.php');
                                            
    //Verbindung ausführen
                                            
    $result mysql_query($query);
                                    while (
    $row mysql_fetch_array($result)) {
                                        echo 
    '<option value="' $row['id'] . '">' $row['name'] .'</option>';
                                            }
                            
    ?>
                        </select></td><td><select size="1" name="shipping" id="shipping"><option>BSV_Libri</option><option>BSV_Umbreit</option><option>BSV_KNV_K</option><option>BSV_KNV_ST</option><option>Parcel</option><option>ParcelExpress</option><option>BookPost</option><option>BookPost_Int</option><option>BookPost_Int_Air</option></select></td><td><input type="submit" name="submit" value="Neue Bestellung anlegen" /></form></td><td><a href="index.php?link=customer">Zur Kundenverwaltung</a></td>
                </tr>
            </table>
    </fieldset>
    <br />
    <fieldset>
        <legend>Titel hinzufügen</legend>
            <table width="790" cellspacing="10">
                <tr class="center">
                    <td>Nr.</td><td>id</td><td>ISBN/EAN</td><td>Preis</td><td>Menge</td><td>Best.-Nr.</td><td>Titel entfernen</td>
                </tr>        
                
                <?php 
                    
                                    
                        
    if($_SESSION['books'] != '') {
                    
                            for(
    $a $a sizeof($_SESSION[books]); $a++){
                                
    $a++;
                                echo 
    '<tr class="center"><td width="40">' $a  '</td>';
                                
    $a--;
                                echo 
    '<td width="40">' $_SESSION[books][$a] . '</td>';
                            
                                
    $query 'SELECT isbnean, price FROM books WHERE id ="' $_SESSION[books][$a] . '"';
                                
    $row mysql_fetch_array($result);
                                
    $result mysql_query($query);
                                
    $row mysql_fetch_array($result);
                                
                                echo 
    '<td width="130">' $row['isbnean'] . '</td>';
                                echo 
    '<td width="60">' $row['price'] . '</td>';
                                echo 
    '<td>' $_SESSION[quantity][$a] . '</td>';
                                echo 
    '<td><form action="index.php?link=order&method=addOrderNr&entry=' .  $a '" method="post"><input type="text" name="orderNr" size="15" value="' $_SESSION[orderNr][$a] . '" /><input type="submit" value="hinzufügen" /></form></td>';
                                echo 
    '<td width="50"><form action="index.php?link=order&del=' .  $a++ . '" method="post"><input type="submit" value="entfernen" /></form></td></tr>';
                                
    $a--;
                            }
                        }
                
    ?>
            
            </table>
            <table width="790" cellspacing="10">    
                <tr>    
                    <td>Liste zur Bestellung: </td>
                    <td><form action="index.php?link=order&method=addToOrder" method="POST">
                        <select size="1" name="orders" id="orders">
                            <?php     
                                            
    //Datenbankabfrage formulieren
                                            
    $query = ('SELECT * FROM bestellungen ORDER BY rechnungsNr DESC');
                                            
    //Datenbankverbindung aufbauen    
                                            
    include ('db_data.php');
                                            
    //Verbindung ausführen
                                            
    $result mysql_query($query);
                                    while (
    $row mysql_fetch_array($result)) {
                                        echo 
    '<option value="' $row['id'] . '">' $row['rechnungsNr'] .'</option>';
                                            }
                            
    ?>
                        </select></td>
                    <td><input type="submit" name="submit" value="hinzufügen" /></form></td><td>oder</td><td><form action="index.php?link=order" method="post"><input type="hidden" name="destroy" value="1" /><input type="submit" value="Liste löschen" /></form></td>
                </tr>
            </table>
    </fieldset>
    <br />
    <fieldset>
        <legend>Aktive Bestellungen</legend>
            <table width="790" cellspacing="10" class="center" style="font-size: 10pt;">
                <tr>
                    <td>Rechnung Nr./<br />Rechnungsdatum</td><td>Artikel</td><td>Menge</td><td>Empfänger / <br /> Versandart</td><td colspan="4">Aktionen</td>
                <tr>

                <?php
                    
    //Datenbankabfrage formulieren
                    
    $query = ('SELECT * FROM bestellungen ORDER BY rechnungsNr DESC ');
                    
    //Datenbankverbindung aufbauen    
                    
    include ('db_data.php');
                    
    //Verbindung ausführen
                    
    $result mysql_query($query);
                    while (
    $row mysql_fetch_array($result)) {
                        echo 
    '<tr><td colspan="8"><hr /></td></tr>';
                        
                        
    $books str_replace(' ','<br />'$row['books']);
                        
    $quantity str_replace(' ','<br />'$row['quantity']);
                        
                        echo 
    '<tr><td style="font-weight: bold; font-size: 12pt;">' $row['rechnungsNr'] . '</td><td rowspan="2">' $books '</td><td rowspan="2">' $quantity '</td><td>';
                        
    $query2 'SELECT name FROM customer WHERE id=' $row['customerId'];
                        
    $result2 mysql_query($query2);
                        
    $row2 mysql_fetch_array($result2);
                        echo  
    $row2['name'] . '</td><td rowspan="2" width="35"><a href="code/do_order.php?id=' $row['id'] . '" title="PDF erzeugen"><img src="system_image/pdf_icon.png" alt="Logo des PDF-Formats" width="32" /></a></td><td rowspan="2" width="35"><a href="code/drop_ship_order.php?id=' $row['id'] . '" title="XML erzeugen"><img src="system_image/xml_icon.png" alt="Logo des PDF-Formats" width="32" /></a></td><td rowspan="2" width="35"><a href="index.php?link=order&method=reOpen&id=' $row['id'] . '" title="Bestellung bearbeiten"><img src="system_image/edit_icon.png" alt="Logo zum bearbeiten einer Bestellung" width="32" /></a></td><td rowspan="2" width="35"><a href="index.php?link=order&method=delOrder&id=' $row['id'] . '" title="Bestellung löschen"><img src="system_image/trash_icon.png" alt="Logo zum löschen einer Bestellung" width="32" /></a></td></tr>';    
                        echo 
    '<tr><td>' $row['rechnungsDatum'] . '</td><td>' $row['shipping'] . '</td></tr>';
                    }
                
    ?>
            </table>
    </fieldset>


  • #2
    sind die Arrays nach 4 - 5 Artikel schon zerschossen
    Diese Beschreibnung mag vielleicht für ein Festplatte ausreichen, die man wegschmeißt, hier musst Du allerdings präziser werden.

    Was auf den ersten Blick auffällt:

    $_SESSION[books]
    $_SESSION['books']

    Das mag zwar funktionieren, egal ist es deshalb aber nicht.
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Tut mir leid, es fällt mir als Anfänger wirklich schwer mich präzise auszudrücken. Vielleicht hast Du einen Ansatz oder Fragen?

      Kommentar


      • #4
        Naja, was z.B. nach den 4, 5 malen im Array drin steht.
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Gerade habe ich es geschafft, über 12 Artikel anzulegen. Gut. Wenn ich allerdings dann einzelne Titel wieder lösche, wird der x-te Eintrag von Array 1 gelöscht, von Array 2 allerdings nicht. Ich denke das ich kann ich noch lösen.
          Was mich allerdings massiv beunruhigt ist halt diese Fehlermeldung:
          "Warning: implode() [function.implode]: Invalid arguments passed in /home/.../admin/order.php on line 44"
          Die immer dann kommt, wenn ich die Array-Variable in einen String umgewandelt werden soll, um diesen der Bestellung in der Database hinzuzufügen.
          das ist dann dieser Code hier :

          PHP-Code:
              if($_REQUEST['method'] == 'addToOrder'){
                  If(isset(
          $_SESSION['books'])){
                  
          $books implode(' '$_SESSION['books']);
                  
          $quantity implode(' '$_SESSION['quantity']);
                  
          $orderNr implode(' '$_SESSION['orderNr']);
                  
          $status $books;
                  }else{
                      
          $status 'Die Variable ist nicht gesetzt!';
                      }
                  
          //Datenbankabfrage formulieren
                  
          $query 'UPDATE bestellungen SET books ="' $books '", quantity ="' $quantity '", orderNr="' $orderNr '" WHERE id ="' $_POST['orders'] . '"';
                  include (
          'db_data.php');
                  
          mysql_query($query);
                  
          //$status = '<p style="color: green;">Die Liste wurde der Bestellung hinzugefügt!</p>';
                  

          Kommentar


          • #6
            Hallo,

            was mir beim überfliegen des Codes aufgefallen ist, ist dass du als Key für ein ein neues Buch sizeof($_SESSION[books]) benutzt. Wenn du nicht irgendwo im Code noch Tricks ist wahrscheinlich, dass das Array nach ein paar lösch/kauf-Vorgängen zerschossen ist...
            Kleines Beispiel:

            PHP-Code:
            // array Anlegen + befüllen
            $tmpArray = array();
            $tmpArray[] = 'test0';
            $tmpArray[] = 'test1';
            $tmpArray[] = 'test2';

            // Ausgabe des Arrays
            var_dump($tmpArray);
            // Ausgabe der Array-Elemente
            echo 'sizeof(): ' sizeof($tmpArray);

            // das zweite Element löschen
            unset($tmpArray[1]);

            // Ausgabe des Arrays
            var_dump($tmpArray);
            // Ausgabe der Array-Elemente
            echo 'sizeof(): ' sizeof($tmpArray);

            // Wert bei sizeof "einfügen"/überschreiben !!Hier geht 'was schief!!
            $tmpArray[sizeof($tmpArray)] = 'testX';
            // Ausgabe des Arrays
            var_dump($tmpArray);
            // Ausgabe der Array-Elemente
            echo 'sizeof(): ' sizeof($tmpArray); 
            Ausgabe im Browser:
            PHP-Code:
            array
              
            => string 'test0' (length=5)
              
            => string 'test1' (length=5)
              
            => string 'test2' (length=5)

            sizeof(): 3

            array
              
            => string 'test0' (length=5)
              
            => string 'test2' (length=5)

            sizeof(): 2

            array
              
            => string 'test0' (length=5)
              
            => string 'testX' (length=5)

            sizeof(): 
            Wenn ich die Zeilen jetzt richtig gezählt habe kommt die Fehlermeldung bei
            PHP-Code:
            $books implode(' '$_SESSION['books']); 
            Mach doch einfach mal ein
            PHP-Code:
            var_dump($_SESSION['books']); 
            davor und poste hier, was da ausgeben wird.

            Kommentar


            • #7
              PHP-Code:
              array(5) { [0]=> string(2"12" [1]=> string(2"13" [2]=> string(2"14" [3]=> string(2"15" [4]=> string(2"22" 
              Auf meinem Testserver hat jetzt alles geklappt. Ich versuche es jetzt mal auf dem Webserver
              PHP-Code:
              array(4) { [0]=> string(1"1" [1]=> string(1"5" [2]=> string(1"6" [3]=> string(2"18" 
              Warningimplode() [function.implode]: Invalid arguments passed in /home/web171/hopp02/ftproot/eh-verlag.de/admin/order.php on line 46 
              Da wieder das alte Bild. Allerding habe ich auch gerade festgestellt, dass mir das 3 Array mit den Bestellnummern zerschossen wird, wenn ich eine neuen Datenbankeintrag für Bestellungen erzeuge. Das wundert mich, da diese beiden eigentlich unabhängig von einander laufen sollten.

              Gibt es nicht andere Möglichkeiten das Ganze zu speichern. Ich sitze da jetzt schon fast zwei Tage dran.
              Vielleicht ist ein 3 dimensionales Array besser? Also in der Form
              PHP-Code:
               $Bestellungen = array( array( mit den ID's ), array ( mit den Mengen ), array( mit den Bestellnummern )); 

              Kommentar


              • #8
                Und "nach" dieser Ausgabe kam der Implode-Error!?
                Kommt/Kam dieser Implode-Error auch beim lokalen testen oder nur auf dem "Webserver"?
                //EDIT mh da dieser Fehler nur auf dem Webserver auftritt liegt das wohl da an der Konfiguration, da fällt mir aber auf Anhieb leider nichts ein, da musst du auf jemanden hoffen der da besser Bescheid weiß als ich ...

                Hast du das Problem verstanden was ich mit meinem Beispiel aufzeigen wollte?

                Kommentar


                • #9
                  Ja, habe ich. Vielen Dank dafür. Ich habe auch gerade gesehen, das ich Variablen mit der gleichen Bezeichnung für verschiedene Dinge benutze. Da sollte ich mal aufräumen.
                  Was sagst Du zu dem 3er Array? Das macht auch kein Unterschied oder?

                  Kommentar


                  • #10
                    Zitat von Thomasd82hb Beitrag anzeigen
                    Gibt es nicht andere Möglichkeiten das Ganze zu speichern. Ich sitze da jetzt schon fast zwei Tage dran.
                    Vielleicht ist ein 3 dimensionales Array besser? Also in der Form
                    PHP-Code:
                     $Bestellungen = array( array( mit den ID's ), array ( mit den Mengen ), array( mit den Bestellnummern )); 
                    Ja, man kann es aders machen, dann würde ich es aber direkt so machen:
                    PHP-Code:
                    $Bestellungen = array( book_id => array(quantity => 123orderNr=> 123)); 
                    //EDIT mein edit war ein wenig Blödsinn, es kommt drauf an, wie du den Array/die Array jetzt gena aufbaust, bzw. weiter verarbeitest ...

                    Kommentar


                    • #11
                      Was ich gerade noch bei mir entdeckt habe ist, das ich die Arrays nicht mit unset(); sondern mit array_splice(); gelöscht habe. Daher funktioniert das bei mir ganz gut. Meine Fehler liegen eher an einer Schlampigen Veriablenverwaltung. Aber es wird besser.

                      Danke noch einmal!

                      Kommentar


                      • #12
                        Viel geholfen habe ich ja nicht!
                        Aber noch ein paar Tipps:
                        1. Überarbeite noch mal deinen Code, statt der viele If-Abfragen, vll. eine Stwicht-Abfrage? Und besonders solche bei Zeilen
                        PHP-Code:
                        echo '<td><form action="index.php?link=order&method=addOrderNr&entry=' .  $a '" method="post"><input type="text" name="orderNr" size="15" value="' $_SESSION[orderNr][$a] . '" /><input type="submit" value="hinzufügen" /></form></td>'
                        will man nicht mehr weiter lesen. Richtig formatieren und Variablennamen sinnvoll nutzen!
                        2. Versuch das ein oder andere in Funktionen zu schreiben, dann steht im Code später nur noch del($bookId) oder ähnlich und damit wie gelöscht wird musst du dich an dieser Stelle nicht herumschlagen.
                        3. Wenn ich den Code richtig interpretiere steht in deiner Datenbank
                        id | books | quantity | orderNr |
                        1 | 1 2 3 | 3 5 6 | 9 8 7 |
                        Wenn das wirklich so ist, sollte man das normalisieren/verbessern!
                        4. Benutzt kein $_REQUEST entscheide dich für GET oder POST.
                        5. die db_data.php einmal direkt am Anfang includieren und nicht mehrmals über den Code verstreut.
                        6. Versuch den "Bestellt" Array anders aufzubauen (siehe meinen Vorschlag! ;P) dann ist das arbeiten damit aber auch das lesen/verstehen des Codes einfacher!
                        7. Wenn du auf einen Array zugreifst schreib den Key immer in "" oder '', das ist "einfach besser", verhindert Fehler und ist zu dem auch noch schneller! (Sonst gibt es nämlich ganz viele Notice!)
                        8. Wenn du UserDaten (POST/GET) auf die Datenbank los lässt _immer_ mysql_real_escape_string() benutzen!

                        Ich glaub das war's jetzt erstmal, viel Spaß noch!

                        Kommentar


                        • #13
                          Ich würd ggf. mal die Request Parameter prüfen.

                          Wenn ich das richtig verstanden habe wird nur der orderNr Array zerschossen? Du hast nur eine Operation die sich ausschließlich auf dieses Array auswirkt.

                          Mir wäre zwar schleierhaft wie an der Stelle das Array zerstört werden sollte aber es wird/muss so sein das mit dem Array etwas gemacht wir dwas zu gegebenem Zeitpunkt nicht gemacht werden soll was nur durch falsche Request Parameter ausgelöst werden kann.

                          var_dump($_REQUEST); sollte dir helfen können wenn da was falsch ankoimmt.
                          "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

                          Kommentar

                          Lädt...
                          X