Ankündigung

Einklappen
Keine Ankündigung bisher.

Session Variable 2x übergeben mit submit

Einklappen

Neue Werbung 2019

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

  • Session Variable 2x übergeben mit submit

    Hallöchen an alle,

    ich bin zur Zeit dabei mich ein wenig in php einzuarbeiten. Die ersten kleinen erfolgreiche Schritte hab ich schon hinter mir. Beim rumprobieren bin ich nun auf folgendes Problem gestoßen.
    Ich habe eine seite a.php hier gebe ich einen Wert "a" ein. Mit einem Button möchte ich nun auf die seite b.php wechseln und den Wert "a" mitnehmen.
    Auf Seite b.php soll mir nun der wert a angezeigt werden (Das geht auch wunderbar). Auf Seite b ist nun aber nochmal ein input-Feld für den Wert "b".
    Wenn ich nun aber keinen Wert für b auf seite b.php eingebe und auf den submit-button auf der b.php zum senden der werte "a" und "b" klicke, dann geht mein Wert "a" verloren. Der Wert "a" soll aber erhalten bleiben, bis man einen Wert "b" eingetragen hat und das dann beide Werte weggeschickt werden können.

    Was mach ich hier falsch? Stimmt was mit den Sessions nicht? Wie kann ich den Wert "a" speichern.

    hier mal meine beiden Seiten...

    Seite a.php
    PHP-Code:
    <?php
    session_start
    ();
    ?>
    <html>

    <head>
    <title>a</title>
    </head>
    <body>
        <form name="Form" action="<?PHP echo $_SERVER['PHP_SELF']; ?>" method="post">
            Wert a eingeben:
            <br>
             <input size="6"  name="werta" value="">                    
            <input name="Send" formaction="b.php" type="submit" value="Daten senden"> 
        </form>
    </body>
    </html>
    Seite b.php
    PHP-Code:
    <?php
    session_start
    ();
    ?>
    <html>
    <head>
    <title>b</title>
    </head>

    <body>
    <?php
    $werta 
    $_POST['werta'];
    $_SESSION['werta'] = $werta;

    if (isset(
    $_POST['senden']))
    {
        if (isset(
    $_POST['wertb']) && strlen(trim($_POST['wertb'])) && !is_array($_POST['wertb'])) 
            {
            
    $eingabe['wertb'] = htmlspecialchars(trim($_POST['wertb']));
            }
            else{
                
    $fehler['wertb'] = 'wertb';
                }
        
        if (empty(
    $fehler))
            {
            
    header("Location: c.php");
            }
            else
                {
                
    // Fehler ausgeben
                
    }
    }
    ?>

        <form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">

        <?php
        
    echo "Wert aus a:" $_SESSION['werta'] ." </br>";
        
    ?>
            Wert b:
            <br>
            <input type="text" id="wertb" name="wertb"<?php if(isset($eingabe['wertb'])) echo ' value="'.$eingabe['wertb'].'"'?> size="30"/>
            <input type="submit" name="senden" value="Wert aus a und Wert aus b abschicken!" />
            
        </form>
    </body>
    </html>
    Wäre klasse wenn mir das jemand erklären könnte woran das liegt, bzw. mir da auf die Sprünge helfen damit das läuft.

    Liebe Grüße
    Matzuman


  • #2
    Willkommen im Forum.

    Du setzt den Wert in der Session immer auf den Inhalt von $_POST['a'].

    Das POST-Feld existiert aber nur, wenn du b.php über das Absenden von a.php aufrufst. (Nur dann ist das ein POST-Request, in dem 'a' übertragen wird.)

    Wird b.php dann über das Absenden von b.php noch mal aufgerufen, existieren in $_POST nur die Felder, die dort auf b.php im Formular enthalten waren.

    PHP nimmt dann für $_POST['a'], das nicht gesetzt ist, einfach null an oder so.

    Ein Fix wäre das hier:

    PHP-Code:
    if (isset($_POST['werta'])) {
        
    $_SESSION['werta'] = $_POST['werta'];
    }

    $werta 0;

    if (isset(
    $_SESSION['werta'])) {
        
    $werta $_SESSION['werta'];

    In deinem Code sollte sich PHP übrigens auch darüber beschweren, dass du POST-Felder abrufst, die nicht existieren.

    Dazu musst du vermutlich das Error-Reporting einschalten.

    Ganz oben im Script:

    PHP-Code:
    error_reporting(-1); // Setzt alle Bits, ab PHP 5.4 solltest du E_ALL schreiben
    ini_set('display_errors'1); 
    Oder die entsprechenden Einstellungen direkt in der php.ini vornehmen.

    Kommentar


    • #3
      Mach doch einfach unter dem Eingabefeld für b ein verstecktes (type="hidden") Formularfeld was den Wert vom übergebenen a besitzt.

      Kommentar


      • #4
        Und beachte auch gleich von Anfang an das E-V-A-Prinzip, der Großteil deiner E/V-Logik befindet sich derzeit im Ausgabeteil (HTML) http://php-de.github.io/jumpto/eva-prinzip/

        und das Wächter Prinzip, um komplexere Verschachtelungen von Kontrollstrukturen zu vermeiden: http://php-de.github.io/jumpto/waechter/

        Und PHP_SELF besser nicht verwenden, potentielles XSS Risiko: http://blog.oncode.info/2008/05/07/p...scripting-xss/

        LG
        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


        • #5
          Hallo an alle,

          vielen Dank für die Tipps und Ratschläge auf meinem steinigen Weg .

          Ich habe eben auf die schnelle Variante von mermshaus ausprobiert, funktioniert super. Dankeschön... auch wenn ich jetzt noch kurz drüber nachdenken muss, was genau da jetzt passiert.
          Also gilt es jetzt erstmal brainen und abspeichern . Aber danke für den schnellen Rat.

          Die andere Variante von Spamversender werde ich später mal ausprobieren. Wenn ich das richtig verstanden hab, soll ich hier dann die sessionvariable in ein hidden Formularfeld eintragen, richtig? und hier bleibt der wert gespeichert? bzw. wenn die Sessionvariable ja wieder auf Null gesetzt wird beim wiederholten Aufruf von b.php , dann überschreibt es mir das doch auch wieder, oder?

          @ hausl
          Danke für die Links... da hab ich ja bisschen was zu tun übers wochenende

          LG Matzuman

          Kommentar


          • #6
            Wenn ich das richtig verstanden hab, soll ich hier dann die sessionvariable in ein hidden Formularfeld eintragen, richtig?
            Könntest du. Das ist leider nur etwas knifflig zu erklären (weshalb ich in meinem Post auch wohlweislich nichts dazu gesagt hatte ).

            Wenn du a immer mit in alle Formulare schreibst und in deiner Interaktion mit der Web-Anwendung ausschließlich Requests hast, die über das Absenden von Formularen ausgelöst werden, brauchst du die Session gar nicht, um den Wert zu behalten.

            Sobald aber mal ein Request dabei ist, der nicht das Absenden eines Formulars beinhaltet (etwa über einen normalen Link oder über Aktualisieren im Browser und Verneinen der Frage, ob Formulardaten erneut gesendet werden sollen – so grob gesagt), brauchst du eine Session, weil a sonst futsch ist.

            Wenn du eine Session nutzt, brauchst du aber a im Grunde nicht mehr als hidden field. Es sei denn, es ergibt Sinn für deine Anwendung, a für die nächste Seite in POST oder GET zu haben. Das ist eine Frage, die sich meines Erachtens nicht pauschal beantworten lässt, weshalb ich bei „Versuchscode“ wenig Sinn darin sehe, über so was großartig zu reden.

            bzw. wenn die Sessionvariable ja wieder auf Null gesetzt wird beim wiederholten Aufruf von b.php , dann überschreibt es mir das doch auch wieder, oder?
            Wenn du a als hidden field (mit name="werta") in das Formular auf b.php setzt und dieses Formular dann abschickst, dann wäre hier im Originalcode $_POST['werta'] gesetzt:

            PHP-Code:
            $werta $_POST['werta'];
            $_SESSION['werta'] = $werta
            Das würde funktionieren. Du setzt dann bei einem Aufruf von b.php über b.php den Wert von a in der Session auf den Wert, den das Feld bereits hatte.

            Kommentar


            • #7
              Wow, danke.

              Wirklich sau gut erklärt .

              Kommentar

              Lädt...
              X