HONDA: Weiterleitung nach Formularcheck >> header() ??

Hallo,

muss die header() - Funktion immer am Anfang eines Skripts stehen?... wenn ja, gibt es eine Möglichkeit, das Skript mittels >>> echo ($_SERVER['PHP_SELF']); <<< abzusenden (zwecks Kontrolle der Formulardaten), und bei positivem Ergebnis auf eine neue seite (neueseite.php) weiterzuleiten?!

Wie müsste das dann geschehen?

Merci für jegliche Problemlösungsvorschläge.
HONDA

  1. Hi,

    muss die header() - Funktion immer am Anfang eines Skripts stehen?

    nein. Aber vor der ersten Ausgabe.

    wenn ja, gibt es eine Möglichkeit, das Skript mittels >>> echo ($_SERVER['PHP_SELF']); <<< abzusenden (zwecks Kontrolle der Formulardaten), und bei positivem Ergebnis auf eine neue seite (neueseite.php) weiterzuleiten?!

    Äh?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. »» Äh?

      Cheatah

      Es handelt sich um ein mehrseitiges Formular,... nun bin ich bei der letzten Seite angelangt,.. ich überprüfe die Daten in demselben Skript >>echo ($_SERVER['PHP_SELF']);<< ....und trage die Daten in die DB ein... funktioniert auch.

      Da ich aber nicht möchte, nun das Formular alleine stehen bleibt, ... sondern auf eine Willkommenseite leiten möchte, benötige ich eine Umleit-Möglichkeit.

      include(), bringt mir nicht viel,... zumal hier ja auch nur ein "Willkommen" eingebunden würde,.. und der Rest der Seite bestehen bleibt....

      Ich hoffe, der Grund meiner Anfrage ist nun etwas klarer geworden.

      LG,
      HONDA

      1. Hi,

        Da ich aber nicht möchte, nun das Formular alleine stehen bleibt, ... sondern auf eine Willkommenseite leiten möchte, benötige ich eine Umleit-Möglichkeit.

        okay, mit anderen Worten: Es ist im Grunde völlig egal, dass es da ein Formular gibt. Du möchtest einfach nur weiterleiten.

        Ich hoffe, der Grund meiner Anfrage ist nun etwas klarer geworden.

        Ja. Ist Dein Problem nun gelöst?

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. »» Ja. Ist Dein Problem nun gelöst?

          Cheatah

          Ja, danke,.... ich habe im Kopfbereich der Seite einfach mittels if-Konstrukt und per header auf eine neue Seite weitergeleitet....

          CODE:
          if ($speichern and !$fnr){header("Location: aloha.php");}
          //HONDA

          1. Hi HONDA,

            if ($speichern and !$fnr){header("Location: aloha.php");}

            wichtig: Bitte halte hier den HTTP-Standard ein. »Location:« verlangt, dass ein absoluter URI angegeben wird, kein relativer! Wie man das sehr einfach erreichen kann, kannst du im PHP-Manual nachlesen.

            Viele Grüße
            Benjamin

            1. Hallo,

              die Weiterleitung kann ich nun doch in den Kübel werfen.... da Mozilla damit scheinbar seine Probleme hat,... zumindest wird kein Datenbankeintrag vorgenommen wenn ich mittels header() versuche weiterzuleiten....

              Mit IE funktioniert alles tadellos.... ist dieses Problem behebbar, sprich, kann ich den header evtl. doch einsetzen?
              HONDA

              CODE:

              if ($speichern2 and !$fnr){header("Location: http://beispiel.de/html/beispiel/primo.php");}

              1. Hi HONDA,

                die Weiterleitung kann ich nun doch in den Kübel werfen.... da Mozilla damit scheinbar seine Probleme hat,... zumindest wird kein Datenbankeintrag vorgenommen wenn ich mittels header() versuche weiterzuleiten....
                [...]
                if ($speichern2 and !$fnr){header("Location: http://beispiel.de/html/beispiel/primo.php");}

                klar, da ist ja auch überhaupt kein Code, der irgendwas in einer Datenbank eintragen soll. Bitte poste die relevanten Codezeilen, die für den Datenbankeintrag zuständig sind.

                Viele Grüße
                Benjamin

                1. klar, da ist ja auch überhaupt kein Code, der irgendwas in einer Datenbank eintragen soll. Bitte poste die relevanten Codezeilen, die für den Datenbankeintrag zuständig sind.

                  Hallo Benjamin,

                  das Skript sieht folgendermaßen aus:

                  <?
                  session_start();
                  if ($speichern2 and !$fnr){header("Location: http://beispiel.de/html/beispiel/primo.php");}

                  //INITIALISIERUNG DER VARIABLEN
                  //FEHLERCHECK (überprüfung der im HTML-Teil befindlichen Text- u.
                  //Selectfelder)
                  //HTML-CODE

                  //DATENBANKEINTRAG (UPDATE datenbank...)

                  Problem: IE durchläuft das Skript und führt unten den Datenbankeintrag durch... leitet danach an die im Header angegebene Adresse weiter.

                  Mozilla hingegen, leitet nur weiter,...  macht keinen Fehlercheck führt keinen Datenbankeintrag durch....

                  Warum dieser Unterschied?
                  Wie kann ich den Code stricken, dass auch Mozilla sowohl einen DB-Eintrag durchführt, als auch weiterleitet?

                  1. Hi HONDA,

                    (Code)

                    Problem: IE durchläuft das Skript und führt unten den Datenbankeintrag durch... leitet danach an die im Header angegebene Adresse weiter.
                    Mozilla hingegen, leitet nur weiter,...  macht keinen Fehlercheck führt keinen Datenbankeintrag durch....

                    Warum dieser Unterschied?

                    frag' mich nicht, offensichtlich führt der Location-Header bei Mozilla dazu, dass der restliche Code nicht ausgeführt wird. Ich weiß nicht, ob das das korrekte Verhalten ist, allerdings weist die PHP-Doku daraufhin, dass man (z.B mit exit) sicherstellen soll, dass nach dem Location-Header kein weiterer Code ausgeführt wird.

                    Wie kann ich den Code stricken, dass auch Mozilla sowohl einen DB-Eintrag durchführt, als auch weiterleitet?

                    Indem du zuerst die Datenbankabfragen durchführst und _danach_ die header-Funktion benutzt?

                    Viele Grüße
                    Benjamin

                    1. echo $begrueszung;

                      Problem: IE durchläuft das Skript und führt unten den Datenbankeintrag durch... leitet danach an die im Header angegebene Adresse weiter.
                      Mozilla hingegen, leitet nur weiter,...  macht keinen Fehlercheck führt keinen Datenbankeintrag durch....

                      Warum dieser Unterschied?

                      frag' mich nicht, offensichtlich führt der Location-Header bei Mozilla dazu, dass der restliche Code nicht ausgeführt wird.

                      PHP ist serverseitige Technik. Der Browser hat während der Scriptlaufzeit nichts zu damit tun. Der bekommt erst das Ergebnis wieder zu Gesicht. Wenn das Script mit unterschiedlichen Browser unterschiedliche Ergebnisse erzeugt, dann liegt das an den Eingangsparametern GET, POST, COOKIE, die diese Browser unterschiedlich schicken. Dort solltest man ansetzen und vergleichen:

                      echo '<pre>';
                      print_r($_POST);
                      print_r($_GET);
                      print_r($_COOKIE);

                      echo "$verabschiedung $name";

                      1. Dort solltest man ansetzen und vergleichen:

                        echo '<pre>';
                        print_r($_POST);
                        print_r($_GET);
                        print_r($_COOKIE);

                        echo "$verabschiedung $name";

                        Hallo,

                        ich habe dies nun ausgelesen... und keinen Unterschied feststellen können zwischen Mozilla und IE (abgesehen von der neuen Session-ID natürlich).

                        Was sollte ich hier ersehen können?

                        LG,
                        HONDA

                    2. Hello,

                      frag' mich nicht, offensichtlich führt der Location-Header bei Mozilla dazu, dass der restliche Code nicht ausgeführt wird. Ich weiß nicht, ob das das korrekte Verhalten ist, allerdings weist die PHP-Doku daraufhin, dass man (z.B mit exit) sicherstellen soll, dass nach dem Location-Header kein weiterer Code ausgeführt wird.

                      Wozu auch, wenn doch in einem idealen Netz dieses Dokumument sowie gleich überschrieben wird?

                      Nach einem Location-Header oder einem Basic-Auth-Header sollte ein exit folgen.

                      Harzliche Grüße aus http://www.annerschbarrich.de

                      Tom

                      --
                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                      Nur selber lernen macht schlau
                  2. »» Problem: IE durchläuft das Skript und führt unten den Datenbankeintrag durch... leitet danach an die im Header angegebene Adresse weiter.

                    Wenn ich den header weiter unten im Skript platziere, dann funktioniert es nicht,...

                    es erscheint dann folgende Fehlermeldung:

                    Warning: Cannot modify header information - headers already sent by (output started at /home/www/htdocs/beispiel.de/primo.php:63) in /home/www/htdocs/beispiel.de/primo.php on line 1112

                    .... soweit mir bekannt, muss der header(); ja immer am anfang eines Skripts platziert werden....

                    Die Verhaltensweise von Mozilla bleibt mir dennoch rätselhaft...

                    1. echo $begrueszung;

                      Warning: Cannot modify header information - headers already sent by (output started at /home/www/htdocs/beispiel.de/primo.php:63) in /home/www/htdocs/beispiel.de/primo.php on line 1112

                      In Zeile 63 von primo.php wird eine Ausgabe erzeugt. Die musst du entweder unterlassen oder erstmal festhalten (Output Control Functions).

                      Außerdem zählen auch Whitespaces außerhalb von <?php ... ?> als Ausgabe.

                      .... soweit mir bekannt, muss der header(); ja immer am anfang eines Skripts platziert werden....

                      Nein. Der Header muss nur als erstes zum Browser gelangen. Solange dein Script nichts ausgibt, kann es vorher noch machen was es will.

                      echo "$verabschiedung $name";

                    2. Hello,

                      »» Problem: IE durchläuft das Skript und führt unten den Datenbankeintrag durch... leitet danach an die im Header angegebene Adresse weiter.

                      Du hast da ein Vorstellungsproblem.

                      Der IE durchläuft das Script gar nicht, sondern der Parser auf dem Webserver. Und der kann an den Client (IE) nun genau eine Antwort senden. Diese Antwort besteht aus HTTP-Header und HTTP-Body. Im Body sind dann z.B. HTML-Head und HTML-Body enthalten, oder auch ein File zum Download.

                      Manche HTTP-Header sorgen dafür, dass der Browser keinen HTTP-Body mehr auswerten muss (aber natürlich kann, wenn er einen erhält, und es selber für spannend hält)

                      Du solltet Dein Script also erstmal aufräumen und in geeignete Bereiche aufteilen.

                      Vermische nicht

                      • Initialisierung,
                      • Parameter-/Datenübernahme, Datenbeschaffung
                      • Datenverarbeitung,
                      • Datenspeicherung,
                      • Antworterzeugung (Datenformatierung) und
                      • Antwortsenden (HTML-Teil des Scriptes)

                      Harzliche Grüße aus http://www.annerschbarrich.de

                      Tom

                      --
                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                      Nur selber lernen macht schlau
  2. hi,

    einen header senden kannst du nur solange noch kein header zwecks auslieferung an den browser des clients geschickt wurde. das muss nicht zwingend am anfang eines scripts sein.

    gruß
    aleks