Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Probleme mit $_SESSION

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Probleme mit $_SESSION

    Hallo zusammen,

    ich bin neu im Forum, deswegen erstmal ein Hallo an alle !

    Zu meinem Problem:

    Ich habe ein Captcha im PHP gebaut, das einen Zufallsstring in ein Bild schreibt. Das geschieht in der bildgenerierung.php . In selbiger Datei wird der Zufallstr. in die $_SESSION['captcha'] geschrieben.
    Code:
    PHP-Code:
     # Header ändern um Bildausgabe zu garantieren
    header("content-Type:image/png");

    # Session aufmachen;
    session_start();

    # Bild zufällig aus vorgegebener Datei erzeugen (Captcha 1-5) size 140*40px
    $nr        rand(1,4);
    $bild     imagecreatefrompng("captcha/Captcha".$nr.".png");
    $nr        "";

    # Farben und Schriftgröße festlegen
    $schriftfarbe         imagecolorallocate($bild,105,105,105);

    $font "fonts/AnkeCall.ttf";
    $fontsize 25
    $winkel rand(-5,5);

    // Zufallsstr erzeugen
    $Kette "ABCDEFGH2345689";

    $randstr1 substr(str_shuffle($Kette),0,2);
    $randstr2 substr(str_shuffle($Kette),0,2);
    $randstr3 substr(str_shuffle($Kette),0,2);

    $zufallstring $randstr1.$randstr2.$randstr3

    # Zufallsstr in SESSION speichern
    if (isset($_SESSION['captcha']))
        {
        unset (
    $_SESSION['captcha']);
        
    $_SESSION['captcha'] = $zufallstring;        
        }
    else 
        {
        
    $_SESSION['captcha'] = $zufallstring;
        }

    #Text in Grafik zentrieren
    $str_x = (60 - (imagefontwidth($fontsize) * strlen($zufallstring))) / 2;
    $str_y = (80 imagefontheight($fontsize)) / 2;

    #Grafik erzeugen Parameter: Grafik, Schriftgröße, Winkel, Start_Links, Start_Oben, Textfarbe, Schriftart, Text)
    imagettftext($bild$fontsize$winkel$str_x$str_y$schriftfarbe$font$zufallstring);
    imagepng($bild);
    imagedestroy($bild); // Speicher freigeben 
    Das Bild binde ich mittels "img src=..." in ein Formular ein (Formlob.php).

    Wenn ich im Formular die Session['captcha'] ausgeben lasse (also aufrufen und immer wieder F5), dann hängt die Ausgabe immer hinterher.

    Also wenn der Zufallstr. beim 1. Aufruf "1234" lautet und beim 2. 2345, dann steht in dem Bild "2345" und in der Ausgabe der Session "1234".
    Damit ist der Vergleich zwischen Usereingabe und dem Bildcode auch irgendwie fürn Eimer -.-!

    Und ich verstehe offen gestanden nicht wieso.

    Ich will jetzt nicht den gesamten Code posten, da ich nichtmal den Hauch einer Idee habe, wo der Fehler liegen könnte und ich niemandem hunderte Zeilen Quellcode zumuten will. Auf Anfrage kann ich aber gerne Code nachreichen.

    Wäre echt spitze, wenn mir jmd nen Anstoß oder Hilfe geben könnte, dass ich an der Stelle mal weiterkomme...

    Greetz

    Coop

  • #2
    Sieht so aus, als sei das eine Verletzung des EVA Prinzips. Kann man aber ohne den restlichen Code nicht sagen. Wie wird die bilderzeugung.php eingebunden?
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Der Fehler bzw der Effekt ist doch selbstverständlich, wenn man sich nur mal die Reihenfolge ansieht!
      Als erstes generierst du eine HTML Ausgabe in der ein <img/> Tag vorkomme, in dem das Captcha eingebunden wird. In selber HTML Ausgabe zeigst du den Zufallsstring an. Anschleißend muss das Captcha für das <img/> Tag geladen werden, wozu dein Code unten ausgeführt wird und in dem der Zufallsstring in die Session geschrieben wird. Dadurch kann die HTML Ausgabe gar nicht den korrekten Wert für die Session haben, weil dieser erst nach dem Erstellen der Ausgabe geschrieben wird.

      Ist also kein Problem im Quellcode sondern nur ein Denkfehler und alles läuft so wie es soll...

      Kommentar


      • #4
        Ok, das ist schonmal ein Hinweis... Also wird erst der HTML-Teil geladen und dann der Code aus dem Bild ausgeführt, so dass die Session im ersten Durchlauf erst existiert, nachdem ich alles abgerufen habe...

        Aber jetzt frage ich mich, wie ich das (sauber) umgehen kann...

        So sieht das Formular dazu aus...
        PHP-Code:
        <form id="lob" method="post" action="feedbacklob.php?eintragen=neu">
             <table width="600" border="0" cellpadding="0" cellspacing="0">
               <tr>
                 <td>Name:</td>
                 <td><input name="name" type="text" id="name" size="18" value="" /></td>
               </tr>
               <tr>
                 <td><input name="lob" type="hidden" value="lob" /></td>
                 <td><? echo $error_name; ?></td>
               </tr>
               <tr>
                <td>&nbsp;</td>
               </tr>
               <tr>
                 <td>Deine Meinung:</td>
                 <td><input name="meinung" type="radio" value="gut" id="meinung" />
                   Gut
                     <input name="meinung" type="radio" value="geht" id="meinung" />
                     Geht so
                     <input name="meinung" type="radio" value="schlecht" id="meinung" />
                     Schlecht
                </td>
               </tr>
               <tr>
                <td>&nbsp;</td>
               </tr>
               <tr>
                 <td>&nbsp;</td>
                 <td><textarea name="text" type="longtext" cols="45" rows="5" id="text"></textarea></td>
                </tr>
                <tr>
                <td>&nbsp;</td>
                <td><? echo $error_text; ?></td>
                </tr>
               <tr>
                 <td><input name="lob" type="hidden" value="lob" /></td>
               </tr>
               <tr>
                <td>&nbsp;</td>
               </tr>
               <tr>
                 <td>Code eingeben:</td>
                 <td><img src="Bildgenerierung.php" alt="captcha" /></td>
            <td> <? echo "$_SESSION['captcha']"; ?> </td>
               </tr>
               <tr>
               <td>&nbsp;</td>
                <td><input name="ueberpruefung" type="text" id="ueberpruefung" size="18" value="" />
               </tr>
               <tr>
               <td>&nbsp;</td>
               <td><? echo $error_captcha ?></td>
               </tr>
               <tr>
                    <td>&nbsp;</td>
                 <td><input type="submit" name="senden2" id="senden2" value="Absenden" /></td>
               </tr>
              </table>
              </form>
        In derselben Datei sind noch PHP-Prüfungen, aber ich denke die sind nicht relevant...

        Mfg

        Coop

        Kommentar


        • #5
          Zitat von Cooper_012 Beitrag anzeigen
          PHP-Code:
          <td> <? echo "$_SESSION['captcha']"; ?></td>
          1) Short Tags
          2) Kann man entweder
          PHP-Code:
          <td> <?php echo $_SESSION['captcha']; ?>
          oder
          PHP-Code:
          <td> <?php echo "{$_SESSION['captcha']}"?>
          schreiben, aber das war du geschrieben hast ist falsch, dann erkennt PHP nicht dass das ['captcha'] der Arrayindex ist. Das ist das was mir beim überfliegen deines Codes aufgefallen ist.
          btw.. Kann man mit einem Imageheader überhaupt die Session starten? (Hab hier keine PHP Unterstützung...)
          MfG

          Kommentar


          • #6
            Zitat von gs93 Beitrag anzeigen
            1) aber das war du geschrieben hast ist falsch, dann erkennt PHP nicht dass das ['captcha'] der Arrayindex ist. Das ist das was mir beim überfliegen deines Codes aufgefallen ist.
            btw.. Kann man mit einem Imageheader überhaupt die Session starten? (Hab hier keine PHP Unterstützung...)
            MfG
            Naja, der imgheader dürfte nicht das Problem sein, da die Abfrage ja nach dem 2. Aufruf nen Wert enthält. Es scheitert wohl nur an der Verarbeitungsreihenfolge und mir gehen die Ideen aus, wie ich das möglichst sinnvoll aus der Welt schaffen kann.

            Das mit den Shorttags ist ne gute Sache, da werd ich mich nochmal intensiver mit befassen...

            Spart das denn außer (Schreib-)Aufwand noch mehr ein?!

            Greetz

            Coop

            Kommentar


            • #7
              Zitat von Cooper_012 Beitrag anzeigen
              Das mit den Shorttags ist ne gute Sache, da werd ich mich nochmal intensiver mit befassen...

              Spart das denn außer (Schreib-)Aufwand noch mehr ein?!
              Pardon, hab mich wohl falsch ausgedrückt. Das war Kritik. Mit PHP 6 werden die Short Tags (soweit ich weiß) rausgeworfen und auch jetzt funktionieren sie nur wenn die entsprechende Einstellung in der php.ini gesetzt ist.
              MfG

              Kommentar


              • #8
                @dit:

                Habs verstanden Google ist mein Freund xD!

                Also besser <?php schreiben als nur <?

                Danke für den Hinweiß !

                Aber was ist denn mit meinem eigentlichen Problem? Hat da jmd ne Idee/ Lösung?!

                Greetz

                Kommentar

                Lädt...
                X