Jochen: Affenformular: Ich bekomme keine Weiterleitung hin

Hi,

ich bin gerade am Programmieren eines E-Mail-Kontaktformulars. Weiter unten habe ich dazu schon eine Frage gestellt, mit der Antwort "Affenformular" konnte ich jetzt zwar das Formular so programmieren, das bei falschen Eingaben eine Fehlermeldung an der betreffenden Stelle erscheint - aber ich bekomme es jetzt seit mehreren Stunden nicht hin, aus der Affenseite wieder rauszukommen, wenn alle Eingaben "korrekt" sind (deshalb auch ein neues Thema).

Die Seite ("kontakt.php") selber funktioniert ganz prima.

Das Formular wird eingeleitet mit:

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" name="edit_form">

Dann kommen die ganzen Formularfelder, am Ende kommt ein:

<input name="Mail schicken" type="submit" name="do_form_x" value=" Nachricht abschicken">

Über dem Formular gibt es einige Abfragen:

$valid = true;
     if (isset($_REQUEST["absender"])) {
       $error["absender"] = validate_textfeld($_REQUEST["absender"]);
       if ($error["absender"] != "")
         $valid = false;
     }

usw.

Wenn alle Eingaben korrekt sind, ist am Ende dieser Abfragen $valid immer noch "true";

Soweit so gut.

Wie schaffe ich es jetzt, das bei Klick auf den Sende-Knopf " Nachricht abschicken" die Seite "schicken.php" aufgerufen wird, die für die Verarbeitung aller Feldinhalte verantwortlich ist?

Die Vorlage, die ich im Netz gefunden habe:

http://www.php-faq.de/q/q-stil-normalform.html

schlägt zur Weiterverarbeitung unterhalb des Formulars folgendes vor:

<?php if ($valid and isset($_REQUEST["do_form_x"])) { ?>
<!-- Nutzlast -->
<?php } ?>

Aber bei mir sollen die Daten ja an eine neue Seite (PHP-Script) weitergegeben und verarbeitet werden. Mit dem Code-Fragment:

if ($valid and isset($_REQUEST["weitergehts"]))   {
       header("Location: schicken.php");
       exit;
       }

das ich von

http://de.wikipedia.org/wiki/Affenformular

habe, bekomme ich nur Fehlermeldungen der Form:

Warning: Cannot modify header information - headers already sent by (output started at E:\xampp\htdocs\firma-schwan\kontakt.php:7) in E:\xampp\htdocs\firma-schwan\kontakt.php on line 199

Seit mehreren Stunden surfe ich durchs Netz, probiere alles aus was ich so finde - und habe es jetzt aufgegeben, da ich es nicht hinbekomme.

Danke,

Jochen

  1. Hi,

    if ($valid and isset($_REQUEST["weitergehts"]))   {
           header("Location: schicken.php");
           exit;
           }

    Warning: Cannot modify header information - headers already sent by (output started at E:\xampp\htdocs\firma-schwan\kontakt.php:7) in E:\xampp\htdocs\firma-schwan\kontakt.php on line 199

    Vor der Umleitung darf keine Ausgabe an den Browser geschehen.

    Es darf nichts vor "<?PHP" stehen (nichtmal ein Leerzeichen), dann sollte die Weiterleitung funktionieren, denn der Header darf nur vor dem Content der Seite geschickt werden.

    mfG,
    steckl

    1. Vor der Umleitung darf keine Ausgabe an den Browser geschehen.
      Es darf nichts vor "<?PHP" stehen (nichtmal ein Leerzeichen), dann

      sollte die Weiterleitung funktionieren, denn der Header darf nur vor dem Content der Seite geschickt werden.

      Hm... wie bekomme ich dann eine Weiterleitung hin, wenn ich das auf diesem Weg nicht machen darf?

      1. Hallo

        Vor der Umleitung darf keine Ausgabe an den Browser geschehen.
        Es darf nichts vor "<?PHP" stehen (nichtmal ein Leerzeichen), dann
        sollte die Weiterleitung funktionieren, denn der Header darf nur vor dem Content der Seite geschickt werden.

        Hm... wie bekomme ich dann eine Weiterleitung hin, wenn ich das auf diesem Weg nicht machen darf?

        Du darfst das schon, aber nicht mehr zu diesem Zeitpunkt, oder besser gesagt, nicht mehr an dieser Stelle im Skript. Schreibe dein Skript so um, dass es dem EVA-Prinzip folgt. Kurz, als Vorschau: EVA heißt Eingabe, Verarbeitung, Ausgabe. Diese drei Schritte werden strikt nacheinander ausgeführt.

        Für dein Skript hieße das, bei Aufruf der Seite als erstes zu prüfen, ob Daten aus dem Formular vorliegen, wenn nicht, wird das leere Formular zur Ausgabe vorbereitet, wenn doch, werden sie dem Skriptteil übergeben, der sie auswertet. Wird bei der Auswertung ein Fehler festgestellt, wird das Formular, mit den übergebenen, gültigen Werten vorbelegt, zur Ausgabe vorbereitet.

        Wenn kein Fehler auftritt, werden die Daten versandt, gespeichert oder was auch immer. Dann wird die Weiterleitung angestoßen.

        Das alles passiert, _bevor_ der Skriptteil kommt, in dem die HTML-Seite zusammengebaut und schließlich ausgegeben wird. Kein Leerzeichen, kein Zeilenumbruch oder was auch immer, darf bis zu diesem Zeitpunkt an den Browser ausgegeben werden. Dann klappt es auch mit der Weiterleitung per header.

        Ach übrigens, in header("Location: ..."); _muss_ eine vollständige URL notiert werden. Also mit Protokoll (normalerweise "http://") und Domainname.

        header("Location: ziel.php"); # falsch  
        header("Location: http://example.com/pfad/zur/ziel.php"); # richtig
        

        Tschö, Auge

        --
        Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
        (Victor Hugo)
        Veranstaltungsdatenbank Vdb 0.2
        1. Hi,

          also danke erstmal für die Hilfreiche Antwort!

          Für dein Skript hieße das, bei Aufruf der Seite als erstes zu prüfen, ob Daten aus dem Formular vorliegen, wenn nicht, wird das leere Formular zur Ausgabe vorbereitet, wenn doch, werden sie dem Skriptteil übergeben, der sie auswertet. Wird bei der Auswertung ein Fehler festgestellt, wird das Formular, mit den übergebenen, gültigen Werten vorbelegt, zur Ausgabe vorbereitet.

          Ich habe die ganzen Abfragen jetzt vor den Aufbau gesetzt und mit

          if ($valid and isset($_REQUEST["weitergehts"])) {
                   header("Location: http://localhost/firma-schwan/mail-versand.php");
                   exit;
                   }

          komme ich jetzt sofort auf die "Weiterverarbeitungsseite".
          :-)

          Allerdings werden die in die Felder eingegebenen Werte nicht übergeben. Wenn ich auf der "mail-versand.php" schreibe:

          echo $_REQUEST['adresse'];

          wird "nichts" ausgegeben.

          Daß das array $_POST[...] leer ist, scheint mir ja logisch zu sein, da ich die Daten ja nicht mehr mit einem Formular und "method=post" übergebe sondern durch die Abfrage vor dem eigentlichen Seitenaufbau zum Verarbeitungsscript springe und eigentlich keine Daten durch "method=post" in den $_POST[...]-Array geschrieben werden.

          Aber warum ist denn der $_REQUEST[...]-Array leer?
          Auf der "Affenformular"-Seite werden die Eingabefelder ja erfolgreich durch Angaben wie:

          <td class="inhalt"><input type="text" class="eingabefeld" name="adresse" value="<?php if (isset($_REQUEST['adresse'])) {echo htmlspecialchars($_REQUEST['adresse']);} else {echo htmlentities($vorgabe-adresse);} ?>"></td>

          eingetragen und wenn ich auf der "Affen-Seite"

          echo $_REQUEST['adresse'];

          bzw.

          echo $_POST['adresse'];

          eintrage, wird auch die korrekte Adresse ausgegeben.

          Bevor ich das Affenscript angegangen bin und die Variablen "einfach" durch das Formular und "method=post" übergeben habe, konnte ich auf der "anderen Seite" die eingegebenen Daten durch

          echo $_POST['adresse'];

          ausgeben lassen.

          Das sind doch beides globale Arrays?

          Danke,

          Jochen

          1. Hallo

            Allerdings werden die in die Felder eingegebenen Werte nicht übergeben. Wenn ich auf der "mail-versand.php" schreibe:

            echo $_REQUEST['adresse'];

            wird "nichts" ausgegeben.

            Du hast das System des Affenformulars verstanden? Es wird _immer_ die Gleiche -nein, die _Selbe_- Seite aufgerufen. Das heißt, wenn die Seite mit dem Formular beispielsweise "kontakt.php" heißt, wird auch im Action-Attribut des <form>s genau _diese_ Seite referenziert. Dort wird auch die Auswertung vorgenommen, falls Formulareingaben übergeben wurden.

            Du rufst offensichtlich _vor_ der Auswertung eine andere Seite per header("Location: ...") auf. Dabei gehen die Daten des Formulars zwingend verloren, weil ein neuer Request ausgelöst wird, der _nichts_ mit dem ersten, in dem die Daten übergeben wurden, zu tun hat.

            Was REQUEST angeht, es ist sozusagen ein Metaarray, das, so vorhanden, die Daten aller Übergabemethoden enthält, also GET, POST, COOKIE. Gehen die POST-Daten, wie in deinem Skriptaufbau, verloren, fehlen sie natürlich auch in REQUEST.

            Tschö, Auge

            --
            Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
            (Victor Hugo)
            Veranstaltungsdatenbank Vdb 0.2
            1. Hi,

              Du hast das System des Affenformulars verstanden?

              Nach deiner Erklärung habe ich es jetzt verstanden.

              Was REQUEST angeht, es ist sozusagen ein Metaarray, das, so vorhanden, die Daten aller Übergabemethoden enthält, also GET, POST, COOKIE. Gehen die POST-Daten, wie in deinem Skriptaufbau, verloren, fehlen sie natürlich auch in REQUEST.

              Allerdings dachte ich bisher: Globale Variable = bleibt erhalten, bis sie mit anderen Werten beschrieben wird. Da die globale Variable ja offensichtlich mit Werten gefüllt wird (auf der Affenseite kann ich sie aus ausgeben lassen), verstehe ich jetzt aber nicht, warum sie dann auf einmal "leer" sind?

              Sprich: Was muss ich denn jetzt machen, damit ich meine Daten auf die andere Seite schauffeln kann?

              Habe mich im Internet dumm & dusslig gesucht nach dem Thema "PHP Variablen übergeben". Alles was ich finde sind die "bekannten" Methoden mittels

              <form method="post" action="script.php" name="edit_form">

              die bei mir aber nicht zum Einsatz kommen können, da ich die Affenseite ja schon davor "verlasse".

              ?

              Danke,

              Jochen

              1. Hallo

                Du hast das System des Affenformulars verstanden?

                Nach deiner Erklärung habe ich es jetzt verstanden.

                Wie es weiter unten zu lesen ist, nein.

                Allerdings dachte ich bisher: Globale Variable = bleibt erhalten, bis sie mit anderen Werten beschrieben wird.

                Ja, das gilt, solange ein Skript läuft.

                Da die globale Variable ja offensichtlich mit Werten gefüllt wird (auf der Affenseite kann ich sie aus ausgeben lassen), verstehe ich jetzt aber nicht, warum sie dann auf einmal "leer" sind?

                Weil du das Skript verlassen hast.

                Sprich: Was muss ich denn jetzt machen, damit ich meine Daten auf die andere Seite schauffeln kann?

                Es einfach lassen.

                Habe mich im Internet dumm & dusslig gesucht nach dem Thema "PHP Variablen übergeben". Alles was ich finde sind die "bekannten" Methoden mittels

                <form method="post" action="script.php" name="edit_form">

                die bei mir aber nicht zum Einsatz kommen können, da ich die Affenseite ja schon davor "verlasse".

                Lasse es. Ich habe doch ausführlich geschrieben, dass sowohl die Anzeige des leeren Formulars (Erstaufruf), wie auch die Verarbeitung der übergebenen Formulardaten mit nachfolgender Entscheidung (Fehler->Wiederanzeige des Formulars vs. Endverarbeitung der Daten (Speichern, Email)) in _einem_ Skript erfolgen. Wenn die Prüfung der Daten erfolgreich war und die dadurch ausgelöste Aktion (Speichern oder Zumailen der Daten, oder was auch immer) erfolgreich ausgeführt wurde, dann _und_nur_dann_ kannst du zu einer anderen Seite weiterleiten.

                Tschö, Auge

                --
                Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
                (Victor Hugo)
                Veranstaltungsdatenbank Vdb 0.2
                1. Hallo,

                  Ja, das gilt, solange ein Skript läuft.

                  Gut, das war eine Info, die mir neu war. Jetzt ist es wirklich klar.
                  Hm... ich glaube dann weiß ich jetzt auch, wie ich es hinbekomme...
                  Gleich mal ausprobieren...
                  :-)

                  Danke!

                  LG

                  Jochen

  2. Hallo

    ich bin gerade am Programmieren eines E-Mail-Kontaktformulars. Weiter unten habe ich dazu schon eine Frage gestellt, mit der Antwort "Affenformular" konnte ich jetzt zwar das Formular so programmieren, das bei falschen Eingaben eine Fehlermeldung an der betreffenden Stelle erscheint - aber ich bekomme es jetzt seit mehreren Stunden nicht hin, aus der Affenseite wieder rauszukommen, wenn alle Eingaben "korrekt" sind (deshalb auch ein neues Thema).

    Das gehört aber thematisch zur anderen Frage. Wenn später jemand das gleiche Problem hat, ist es besser wenn auch diese Folgefrage mitsamt der Lösung im gleichen Thread zu finden ist.

    Dein "headers already sent"-Problem könnte man zwar auch einzeln stehen lassen, es ist aber auch ein mMn gängiges Problem mit Affenformularen. Du bist ja nicht der Einzige, der, je nach Zustand, eine Weiterleitung vornehmen will.

    Tschö, Auge

    --
    Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
    (Victor Hugo)
    Veranstaltungsdatenbank Vdb 0.2