Marcus Galka: header("Location") zeigt die aufrufende Seite an

Hallo,

ich versuche mal mein Problem zu beschreiben:

Ich habe ein Formular, welches beim Absenden sich selbst aufruft und auf Eingabefehler überprüft. Dabei wird eine Session-Variable mit einem Wert gefüllt ("fehler" bzw. "keinfehler"). Wenn er einen Fehler findet, zeigt er dieselbe Seite mit der passenden Meldung an. Findet er keinen Fehler, so soll er umleiten auf eine andere Seite. An sich wohl kein Problem. Es funktioniert auch mit der Fehleranzeige. Findet er aber keine Fehler, so leitet er nicht zur richtigen Seite um, sondern nur auf sich selbst!

Wo habe ich hier meinen Denkfehler?

<?php
session_start();
if($_POST['submit']) {
if($_POST["nachname"]<3) {
$_SESSION["fehler"] = "fehler";
}
if($_SESSION["fehler"] != "fehler") {
header ("Location: http://www.avdienst.de/rechtschutz/rechtschutz_commit.php");
exit();
}
}
?>

Wahrscheinlich habe ich einen logischen Fehler.

Marcus

  1. echo $begrüßung;

    Wo habe ich hier meinen Denkfehler?

    Versuche, ihn mit den üblichen Debugging-Methoden zu finden. Stelle das error_reporting aus E_ALL ein, stelle sicher, dass display_errors auf on steht. Kommen damit schon Hinweismeldungen? Wenn nicht, lass dir die Inhalte der beteiligten Variablen ausgeben: echo, var_dump() und print_r() sind dafür geeignete Mittel. Verfolge den Ablauf. Setzt in Verzweigungen Kontrollausgaben, um zu sehen, welcher Weg in deinem Script abgearbeitet wird.

    echo "$verabschiedung $name";

    1. Hallo dedlfix,

      danke für die schnelle Antwort. Die Session-Variablen werden passend gefüllt. Auch die Kontrollausgaben habe ich schon hinter mir. Alles im grünen Bereich.

      Kann es denn überhaupt irgendwie passieren, dass die header()-Funktion trotz korrekter Zielangabe falsch interpretiert wird?

      Marcus

      1. Moin Marcus,

        danke für die schnelle Antwort. Die Session-Variablen werden passend gefüllt. Auch die Kontrollausgaben habe ich schon hinter mir. Alles im grünen Bereich.

        Kann es denn überhaupt irgendwie passieren, dass die header()-Funktion trotz korrekter Zielangabe falsch interpretiert wird?

        Sehr wahrscheinlich wird eine deiner IF-Bedinungen nicht so ausgeführt wie Du es erwartest. Setzte an den entsprechenden Punkten Echos.

        regds
        Mike©

        --
        Freunde kommen und gehen. Feinde sammeln sich an.
        1. Hallo Jungs,

          da ich anscheinend etwas unkonzentriert war (hüstel), habe ich es jetzt aber mit Eurer (jawohl, in GROSS: Für mich seit "Ihr" ab jetzt Könige!) Hilfe geschafft. Ich Depp habe nicht die $_POST-Variablen abgefragt, sondern einfach die "inline"-Variablen ($nachname). Somit konnte das auch nicht so toll klappen. Alle Tests schienen soweit normal zu laufen. Aber nur, weil ich diesen Gehirnknoten hatte, der sich nicht lösen wollte. Oder, wie sagt man so schön: Ich sah den Wald vor lauter Bäumen nicht.

          Danke an Eure Majestäten ;-)

          Marcus

          1. Hello,

            Oder, wie sagt man so schön: Ich sah den Wald vor lauter Bäumen nicht.

            Naja, kann auch schon mal vorkommen, dass man an an den nicht vorhandenen Häkchen dreimal vorbeiguckt. Ist mir heute auch gerade passiert...

            Shit happens!

            Sehr schön, dass Du eine Rückmeldung gegebn hast. Das hilft zumindest auch noch späteren Lesern.

            Harzliche Grüße vom Berg
            http://bergpost.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      2. Moin Marcus,

        danke für die schnelle Antwort. Die Session-Variablen werden passend gefüllt. Auch die Kontrollausgaben habe ich schon hinter mir. Alles im grünen Bereich.

        Noch ein Nachtrag. Wenn Deine Session Variable innerhalb der Session
        einmal den Wert fehler hatte, dann wird der Wert immer "fehler" bleiben, da er nicht zurückgesetzt wird.

        regds
        Mike©

        --
        Freunde kommen und gehen. Feinde sammeln sich an.
      3. echo $begrüßung;

        Kann es denn überhaupt irgendwie passieren, dass die header()-Funktion trotz korrekter Zielangabe falsch interpretiert wird?

        Das Zusammenspiel zwischen PHP und deinem Browser lässt sich z.B. mit der livehttpheaders-Extension für den Firefox beobachten. (Für andere Browser gibt es ähnliche Add-Ons.)

        echo "$verabschiedung $name";

  2. Hello,

    Hallo,

    ich versuche mal mein Problem zu beschreiben:

    Ich habe ein Formular, welches beim Absenden sich selbst aufruft und auf Eingabefehler überprüft. Dabei wird eine Session-Variable mit einem Wert gefüllt ("fehler" bzw. "keinfehler"). Wenn er einen Fehler findet, zeigt er dieselbe Seite mit der passenden Meldung an. Findet er keinen Fehler, so soll er umleiten auf eine andere Seite. An sich wohl kein Problem. Es funktioniert auch mit der Fehleranzeige. Findet er aber keine Fehler, so leitet er nicht zur richtigen Seite um, sondern nur auf sich selbst!

    Wo habe ich hier meinen Denkfehler?

    <?php
      session_start();

    if($_POST['submit'])
        {

    if($_POST["nachname"]<3)

    {

    $_SESSION["fehler"] = "fehler";
        }

    if($_SESSION["fehler"] != "fehler")
          {

    header ("Location: http://www.avdienst.de/rechtschutz/rechtschutz_commit.php");
          exit();
        }
      }
    ?>

    Wann wird denn eine neue Session begonnen?
    Was steht in der Session im Feld ['fehler']?

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  3. Hallo,

    @Tom:

    in der Session-Variable steht halt "fehler" oder "keinfehler".

    @dedlfix:

    Danke für den Tipp mit der Firefox-Erweiterung. Wenn ich es richtig interpretiere, dann fordert der Header sich selber an. Bedeutet das, dass etwa die header()-Funktion mit der neuem Ziel gar nicht ausgeführt wird?

    @Mike:
    Die Session-Variable wird später zerstört werden. Wenn ich denn erst einmal auf mein Ziel kommen würde ;-)

    @Alle drei:
    Super danke für die schnelle Hilfestellung.

    Marcus

    1. Hello,

      @Tom:

      in der Session-Variable steht halt "fehler" oder "keinfehler".

      Wann steht das da drin?
      Wie lange steht es schon da drin?
      Wird tatsächlich bei jedem Versuch eine neue Session gestartet, oder benutzt Du immer Dieselbe?

      Da ich nicht finden konnte, wo Du "keinfehler" in die Session schreibst, nehme ich an, dass da immer "fehler" drin steht.

      Harzliche Grüße vom Berg
      http://bergpost.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      1. Hallo Tom,

        So sieht es im Moment aus:

        session_start();
        if($_POST['submit']) {
        if($topic1=="Ja"||$topic2=="Ja" ||$topic3=="Ja" ||$topic4=="Ja" ||$topic5=="Ja" ||$topic6=="Ja" ||$topic7=="Ja" ||$topic8=="Ja" ||$topic9=="Ja"||$topic10=="Ja" ||$topic11=="Ja"||$topic12=="Ja") {
        $_SESSION["fehler"] = "keinfehler";
        } else {
        $_SESSION["fehler"] = "fehler";
        }

        Trotzdem geht er nicht auf die andere Seite.

        Zu den Sessions:

        Ich dachte bisher, dass der Server merkt, ob schon eine Session gestartet wurde und startet diese nur einmal. Liege ich da falsch? Was sollte ich ändern?

        Danke

        Marcus

        1. Hi Marcus,

          if($topic1=="Ja"||$topic2=="Ja" ||$topic3=="Ja" ||$topic4=="Ja" ||$topic5=="Ja" ||$topic6=="Ja" ||$topic7=="Ja" ||$topic8=="Ja" ||$topic9=="Ja"||$topic10=="Ja" ||$topic11=="Ja"||$topic12=="Ja") {
          $_SESSION["fehler"] = "keinfehler";
          } else {
          $_SESSION["fehler"] = "fehler";
          }

          Für Variablen, die nur zwei Zustände kennen, gibt es den Boolschen Datentyp. Warum verwendest du diesen nicht? Damit würdest du schon mal eine Fehlerquelle eliminieren, falls du dich nämlich bei einem Vergleich mal vertippst.

          Ich dachte bisher, dass der Server merkt, ob schon eine Session gestartet wurde und startet diese nur einmal. Liege ich da falsch? Was sollte ich ändern?

          Dann schau dir doch einfach mal die Dokumentation zu session_start() im PHP-Manual an. Insbesondere dieser Absatz

          session_start() erzeugt eine Session oder nimmt die aktuelle wieder auf, die auf der
            Session-ID basiert, die mit einer Anfrage, z.B. durch GET, POST oder ein Cookie,
            übermittelt wurde.

          sowie die darauf folgenden Beispiele sollten dich in deiner Meinung stutzig machen.

          Viele Grüße,
            ~ Dennis.

          1. Hallo Dennis,

            session_start() erzeugt eine Session oder nimmt die aktuelle wieder auf, die auf der
              Session-ID basiert, die mit einer Anfrage, z.B. durch GET, POST oder ein Cookie,
              übermittelt wurde.

            Wenn ich meine Daten von Seite zu Seite mittels eines Formulars weiterreiche, so wird doch die gleiche Session genommen, oder verstehe ich da etwas falsch?

            Gruss,

            Marcus

            1. Hi Marcus,

              session_start() erzeugt eine Session oder nimmt die aktuelle wieder auf, die auf der
                Session-ID basiert, die mit einer Anfrage, z.B. durch GET, POST oder ein Cookie,
                übermittelt wurde.

              Wenn ich meine Daten von Seite zu Seite mittels eines Formulars weiterreiche, so wird doch die gleiche Session genommen, oder verstehe ich da etwas falsch?

              Würde, wenn du die Session starten würdest. ;-) Zur Verständlichkeit: Das „start” aus „session_start” bezieht sich nicht auf das erstmalige Einrichten einer Session-ID, sondern auf das Starten des Session-Systems von PHP. Solange du dieses „System” nicht startest kann keine Session begonnen oder fortgesetzt werden.

              Aus den Beispiel-Scripten im Manual müsste das eigentlich auch ersichtlich werden ;-)

              Viele Grüße,
                ~ Dennis.

              1. Hallo Dennis,

                ich starte die session fleissig von Seite zu Seite ;-)

                Vielen Dank für diese Informationen.

                Nun bin ich wieder mal etwas schlauer.

                Liebe Grüße

                Marcus

    2. Moin Marcus,

      @Mike:
      Die Session-Variable wird später zerstört werden. Wenn ich denn erst einmal auf mein Ziel kommen würde ;-)

      In dem von Dir gesposteten Code Schnipsel ist es gar nicht nötig eine
      SESSION zu verwenden?

      Das würde reichen:

        
      <?php  
      if( $_POST['submit'] )  
        {  
         if( $_POST['nachname'] >= 3 )  
           {  
            header ("Location:http://www.avdienst.de/rechtschutz/rechtschutz_commit.php");  
            exit;  
           }  
        }  
      
      

      Und ausserdem, was ist den das für eine Bedingung?
      Sollte das nicht lauten:

      if( strlen($_POST['nachname']) >= 3 )
      bzw. Dein Originalcode

      if( strlen($_POST['nachname']) < 3 )

      regds
      Mike©

      --
      Freunde kommen und gehen. Feinde sammeln sich an.
      1. Hallo Mike,

        da ist mir doch beim kopieren in den oberen Bereich einiges abhanden gekommen. Du hast natürlich recht (schande über mich :-( ).

        Ich brauche die Session aber, um die Variablen auch bei Seitenwechsel im "Hinterkopf" zu haben, oder?

        Marcus

      2. Hi,

        if( $_POST['nachname'] >= 3 )

        Warum werden Leute mit kurzem Nachnamen hier ausgeschlossen?

        Ich kenne mehrere Leute mit nur 2 Buchstaben im Familiennamen.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Hello,

          if( $_POST['nachname'] >= 3 )

          Warum werden Leute mit kurzem Nachnamen hier ausgeschlossen?

          Werden sie doch gar nicht. Es werden nur alle Leute ausgeschlossen, deren Nachname nicht mindesens mit 3 anfängt. "3com" wäre also ein zulässiger Nachname.

          Harzliche Grüße vom Berg
          http://bergpost.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

          1. Hi,

            Werden sie doch gar nicht. Es werden nur alle Leute ausgeschlossen, deren Nachname nicht mindesens mit 3 anfängt. "3com" wäre also ein zulässiger Nachname.

            Ja, ich gestehe, ich habe die falsche Zeile zitiert und die richtige weggelöscht.

            Zitieren _wollte_ ich die:
            if( strlen($_POST['nachname']) < 3 )

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      3. Hello,

        if( $_POST['nachname'] >= 3 )  ### wann ist denn nachname >= 3?

        Meint Marcus vielleicht

        if (isset($_POST['nachname']) and strlen $_POST['nachname'] >= 3)    ### ?

        Harzliche Grüße vom Berg
        http://bergpost.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

        1. Hallo,

          natürlich meinte Marcus das (und er hat sich auch eben schon in Grund und Boden geschämt ;-)

          1. Hi,

            natürlich meinte Marcus das (und er hat sich auch eben schon in Grund und Boden geschämt ;-)

            Das ist aber rücksichtslos! Wo sollen denn die Regenwürmer, Asseln, Ameisen usw. so plötzlich hin, wenn der Marcus da unvorangemeldet daherkommst?

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.