Ankündigung

Einklappen
Keine Ankündigung bisher.

SESSION Variable verschluckt?

Einklappen

Neue Werbung 2019

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

  • SESSION Variable verschluckt?

    Hallo,

    Ich habe eine Datenbankabfrage, die funktioniert.
    Sie stellt frei Variablen per SESSION zur Verfügung.
    Eine zweite PHP-Seite liest diese Variablen und wertet sie aus.

    Problem:
    Beim ERSTEN Aufruf der beiden Dateien hintereinander, wird keine variable übertragen.
    Rufe ich die aufrufende Datei NOCHMAL auf und übertrage ich die Variablen nochmal, geht alles.....bis der Browser wieder geschlossen wird (mit verschiedenen Browsern getestet).

    Die aufrufende Datei ist diese (Auszug):

    Code:
    <?php //Erzeugen der Variablen
    session_start();
    //...
    //...es wurden die Variablen ermittelt und
    //...hier in die SESSION geschickt:
    $_SESSION["finisher"]=$kname;
    $_SESSION["vorn"]=$kfirst;
    $_SESSION["nachn"]=$klast;
    //...Die echo Befehle, zeigen, dass die Variablen tatsächlich existieren
    echo $kname;
    echo kfirst;
    echo klast;
    ?>
    Die Variablen existieren IMMER, auch beim ersten Aufruf.

    Auslesende Datei:

    Code:
    <?php //Aufruf der Variablen
    session_start();
    //...hier werden die Variablen aus der SESSION geholt:
    $swimmer=$_SESSION["finisher"];
    $vn="'".$_SESSION["vorn"]."'";
    $nn="'".$_SESSION["nachn"]."'";
    //... und hier sehe ich, ob sie angekommen sind:
    echo $swimmer;
    echo $vn;
    echo $nn;
    ?>
    und hier erscheinen beim ersten Aufruf die Variablem leer. Erneuter Aufruf dieser Datei alleine ändert nichts.

    Bei jeder weiteren Übertragung der Variablen erfolgt die Übergabe sofort! .... wie gesagt.... bis der Browser geschlossen wurde.
    Was mache ich falsch?

    Gruss
    Michael




  • #2
    Hast du error_reporting voll offen? https://php-de.github.io/jumpto/faq/#debugging

    Ich habe eine Datenbankabfrage, die funktioniert.
    Sie stellt frei Variablen per SESSION zur Verfügung.
    Eine zweite PHP-Seite liest diese Variablen und wertet sie aus.
    Warum holst du die Daten eigentlich nicht gleich auf der zweiten Seite aus der DB?



    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Hallo hausl,
      Danke für die schnelle Antwort.
      1. Error Reporting ist offen und zeigt nur eine Warnung wegen ein paar nicht initialisierter indices etc, die aber alle im Programmablauf gesetzt werden. Die Variablen sind ja auch vorhanden und definiert. Die letztlich selectierten Abfragewerte werden effektiv in der zweiten Seite nochmals aus der Datenbank gelesen! Auch das klappt, wenn sie denn dort ankommen.
      2. Die Datenbankabfrage ist interaktiv und enthält einen Teil, der die vorausgewählten EInträge zur Bestätigung anzeigt. Die korrekten Werte werden dann in ein FPDF Script übertragen was prima funktioniert. FPDF erlaubt allerding keinerlei Browserausgabe, weshalb das ein separates PHP sein muss.

      Gruss
      Michael

      Kommentar


      • #4
        Hausl: Hier sichtbar:
        http://www.ecotec2000.de/ex.php
        Irgendwelche Buchstaben eingeben -> Show -> Print-out
        Die Printout-Seite zeigt derzeit NICHT das Print-out sondern die drei Variablen an...aber eben erst beim zweiten Mal wenn der Browser neu geöffnet ist! Bleibt der Browser offen, kann ich beide Seiten schliessen und neu aufrufen und alles funktioniert

        Die Punkte 1-7 aus Deiner Hilfe "Richtig Debuggen" habe ich abgearbeitet..... bin beim Punkt 8.


        Gruss
        Michael

        Kommentar


        • #5
          1. Error Reporting ist offen und zeigt nur eine Warnung wegen ein paar nicht initialisierter indices etc, die aber alle im Programmablauf gesetzt werden
          Das kann aber der Grund sein, das die Session nicht gestartet werden kann. Die Session muss ganz zu Beginn vor jeglicher Ausgabe gestartet werden, wenn davor was ausgegeben wird (auch wenn es nur ein Leerzeichen oder ein BOM ist) dann "krachts". Siehe dazu auch: https://php-de.github.io/jumpto/faq/...s-already-sent

          -> Repaier das mal und schau weiter.

          The string "()()" is not palindrom but the String "())(" is.

          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar


          • #6
            Wie Du aus meinen Code-Schnipseln siehst, ist SESSION_START der allererste Befehl Wie ich gelesen habe, muss SESSION_START in der sendenden Datei lediglich vor der zu übertragenden Variable geschickt werden. Werde dennoch nochmal testen, ALLES AUSNAHMSLOS zu definieren.
            Danke erst mal...klingt logisch nach nicht initialisiertem was-auch-immer.
            Gruss
            Michael

            PS.: Was ist ein BOM?

            Kommentar


            • #7
              Schaust du unter https://de.wikipedia.org/wiki/Byte_Order_Mark

              Kommentar


              • #8
                Die Session beienflusst den HTTP Header und muss daher vor jeglicher Ausgabe kommen.


                Das ist übrigens Mist, mach die Quotes weg:

                PHP-Code:
                $vn="'".$_SESSION["vorn"]."'";
                $nn="'".$_SESSION["nachn"]."'"

                Du kannst dir auch mal $_SESSION ganz einfach ausgeben lassen .. mit var_dump() zB.


                Da fehlen die $ Zeichen bei den letzten beiden.

                PHP-Code:
                  echo $kname;
                echo 
                kfirst;
                echo 
                klast

                PS.: Was ist ein BOM?
                https://de.wikipedia.org/wiki/Byte_Order_Mark
                The string "()()" is not palindrom but the String "())(" is.

                Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                PHP.de Wissenssammlung | Kein Support per PN

                Kommentar


                • #9
                  Warum ist "das Mist"?
                  Ich brauche die single quotes für die SQL-Abfrage!
                  Ohne die Quotes geht das eben nicht.

                  Danke für "var_dump()", das schau ich mir mal näher an!
                  Ich berichte morgen weiter

                  gruss
                  Michael

                  Kommentar


                  • #10
                    ch brauche die single quotes für die SQL-Abfrage!
                    Ohne die Quotes geht das eben nicht.
                    Dann behandelt dort(!) den Kontextwechsel zu SQL korrekt, nutze am besten Prepared Statments (zB für PDO https://php-de.github.io/jumpto/pdo/...red-statements ) und "verstümmle" nicht die Variable davor schon.


                    Und hier fehlen noch die $ Zeichen vor den Variablen, ist dir aufgefallen?
                    PHP-Code:
                    echo $kname;
                    echo 
                    kfirst;
                    echo 
                    klast
                    The string "()()" is not palindrom but the String "())(" is.

                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      Zitat von mexman Beitrag anzeigen
                      Ich brauche die single quotes für die SQL-Abfrage!
                      Dann mach sie bei der SQL-Abfrage und nicht irgendwo anders. Davon abgesehen hast du das SQL-Escaping vergessen.

                      Kommentar


                      • #12
                        >Dann behandelt dort(!)

                        Ich verstehe. Meine Strategie ist, viele Schritte in kleine Einzelschritte aufzuteilen, die meinem Wissenshorizont entsprechen und wenn alles mal funktioniert, optimiere ich.
                        Gruss
                        Michael

                        Kommentar


                        • #13
                          Da fehlt halt trotzem das SQL-Escaping. Das ist nichts, das man weglassen darf.

                          Kommentar


                          • #14
                            Hier mal die Varianten mit Mysql

                            Deine Version
                            PHP-Code:
                                $vn "'".$_SESSION["vorn"]."'";
                                
                            $SQL "SELECT `id`, `vorname` FROM `myTable` WHERE `vorname` LIKE '$vn'"
                            besser mit escape
                            PHP-Code:
                             $vorname $mysqli->real_escape_string($_SESSION["vorn"]);
                                
                            $SQL 'SELECT `id`, `vorname` FROM `myTable` WHERE `vorname` LIKE "'$vorname '"'
                            noch besser als prepared statement
                            PHP-Code:
                                $vorname $_SESSION["vorn"];
                                
                            $stmt $mysqli->prepare("SELECT id,Username FROM users WHERE Username LIKE ? ");
                                
                            $stmt->bind_param("s"$vorname);
                                
                            $stmt->execute(); 
                            LIKE ohne Platzhalter ist natürlich Unsinn, da man dann besser das Gleichheitszeichen verwendet.
                            Mit Platzhalter sähe das mit prepared statement so aus
                            PHP-Code:
                                $stmt $mysqli->prepare("SELECT id,Username FROM users WHERE Username LIKE CONCAT('%',?,'%') ");
                                
                            $stmt->bind_param("s"$_SESSION["vorn"];);
                                
                            $stmt->execute(); 
                            Geht natürllich auch ohne concat, dann
                            PHP-Code:
                                $stmt $mysqli->prepare("SELECT id,Username FROM users WHERE Username LIKE ? ");
                                
                            $vorname '%' $_SESSION["vorn"] . '%';
                                
                            $stmt->bind_param("s"$vorname);
                                
                            $stmt->execute(); 

                            Kommentar


                            • #15
                              So, ich bin jetzt etwas weiter:
                              Trotz nicht initialisierter Variablen werden die SESSION Werte in der aufrufenden Datei gesetzt.

                              Das habe ich durch
                              echo $_SESSION["finisher"];
                              echo $_SESSION["vorn"];
                              echo $_SESSION["nachn"];
                              am Ende der Datei gefunden.

                              Scheinbar werden diese Variablen beim ersten Aufruf aber nicht an die abfragende Datei geschickt obwohl dort nur dieses steht:

                              <?php
                              session_start();
                              echo $_SESSION["finisher"];
                              echo "'".$_SESSION["vorn"]."'";
                              echo "'".$_SESSION["nachn"]."'";
                              ?>
                              aber es ist kein Inhalt vorhanden.

                              Mit komplettem errorreporting bekomme ich nur eine
                              Notice: Undefined index: finisher
                              Notice: Undefined index: vorn
                              Notice: Undefined index: nachn
                              aber da dürfte eigentlich nicht s ausmachen.

                              Jetzt bin ich mit meinem Latein wohl am Ende.

                              Gruss
                              Michael




                              Kommentar

                              Lädt...
                              X