Heinrich: Formular automatisch abschicken

Hallo,

ich habe folgendes Problem:
Ein Formular wird mittels beim Abschicken mittels PHP immer an sich selbst geschickt, bis alle Eingaben korrekt sind. Ist dies der Fall würde ich gerne alle Informationen die unter $_POST bereit stehen an eine weitere PHP Seite übergeben, die diese weiterverarbeitet. Wenn ich jedoch einfach mittels
header("Location: new.php");
die neue Seite aufrufe, werden Daten nicht mit übergeben. Wie kann ich dies dann bewerkstelligen?

Ich habe zunächst daran gedacht, die "action"-Eigenschaft des Forms auf die neue Seite umzusetzen (was ja kein Problem ist). Aber ich weiß nicht wie ich mit PHP das Formular (in dem alle korrekte Infos stehen) zum abschicken zwingen kann (im Moment müsste man nochmal "Abschicken" klicken, um alles an die neue Datei zu schicken.

Kann ich eventuell mit JAVASCRIPT erreichen, dass die Seite abgeschickt wird, wenn sie fertig geladen ist, oder etwas in der Richtung?

Gruß,
Heinrich

  1. Hallo Heinrich!

    die neue Seite aufrufe, werden Daten nicht mit übergeben. Wie kann ich dies dann bewerkstelligen?

    Was genau ist Dein Problem? Wieso kannst Du nicht in _der_ Seite in der Du alles validierst, auch gleichzeitig die Daten verarbeiten, die Du auf der _Folgeseite_ verarbeiten willst? Wenn Du das getan hast (also weggespeichert, Mails generiert, etc) kannst Du doch immer noch mittels header() - Location benötigt immer einen absoluten Pfad - weiter leiten.

    Schönen Gruß

    Afra

    1. Ich antworte hier mal stellvertretend für alle Antworten...

      Die 6 Eingaben die gemacht und geprüft werden, bilden die Voraussetzung für weitere Eingaben in der nächsten Seite. Ich möchte erst wenn diese zweite Seite alle Informationen hat die Daten via SQL sichern.

      Damit diese zweite Seite funktioniert, benötigt sie die Daten aus der ersten, bevorzugt per POST.
      Ich kann ohne Probleme das Formular mit PHP schon mit all den korrekten Daten für den Aufruf der zweiten Seite bestücken, so dass man nur noch Absenden muss. Ich möchte jedoch nicht, dass der Anwender Absenden drücken muss (ist unkomfortabel und er könnte die Daten nochmal manipulieren).
      Daher ist die Frage, ob ich ein Absenden des Formulares sobald die Seite aufgebaut ist, erzwingen kann oder ob ich die Möglichkeit habe, die gemachten Daten selbst an die neue Seite zu übergeben.
      Mit header() - Location könnte ich natürlich per $_GET die Infos übergeben, aber das möchte ich ungern...

      1. echo $begrüßung;

        Die 6 Eingaben die gemacht und geprüft werden, bilden die Voraussetzung für weitere Eingaben in der nächsten Seite. Ich möchte erst wenn diese zweite Seite alle Informationen hat die Daten via SQL sichern.

        Wie wäre es mit einer Session? Dann kannst du die "fertigen" Daten beim Server lassen und musst sie nicht immer mit rumschleppen.

        Damit diese zweite Seite funktioniert, benötigt sie die Daten aus der ersten, bevorzugt per POST.

        Du kannst auch trotzdem nur eine Seite nehmen und dann per Fallunterscheidung Teil 1 oder Teil 2 des Formulars anzeigen und bearbeiten lassen.

        echo "$verabschiedung $name";

        1. Wie wäre es mit einer Session? Dann kannst du die "fertigen"
          Daten beim Server lassen und musst sie nicht immer mit
          rumschleppen.

          Ich habe keine Erfahrung, wie ich etwas derartiges per Cookie oder vergleichbar regle.
          Mein Session Management übermittelt einfach nur eine zufällige Zeichenkette via GET über die geprüft wird, ob der Nutzer sich eingeloggt hat oder ob er einfach so versucht auf die PHP-Seiten zuzugreifen.

          Du kannst auch trotzdem nur eine Seite nehmen und dann per
          Fallunterscheidung Teil 1 oder Teil 2 des Formulars
          anzeigen und bearbeiten lassen.

          Ist klar. Ich wollte die Trennung auf zwei Dateien eigentlich aus logischen Gründen und um keinen riesigen PHP File zu haben, der drei unterschiedliche Seiten anzeigen kann...

          Gruß,
          Heinrich

          1. Mahlzeit Heinrich,

            Ist klar. Ich wollte die Trennung auf zwei Dateien eigentlich aus logischen Gründen und um keinen riesigen PHP File zu haben, der drei unterschiedliche Seiten anzeigen kann...

            Wieso muss die Datei riesig sein?

            <?php  
            [code lang=php]  
              
            require('/sicherer/include_pfad/ausserhalb_vom_htdocs/formularueberpruefung.inc');  
            require('/sicherer/include_pfad/ausserhalb_vom_htdocs/datenbankkram.inc');  
            require('/sicherer/include_pfad/ausserhalb_vom_htdocs/meldungen.inc');  
              
            if (ueberpruefe_formulardaten('POST')) {  
              if (schreibe_daten_in_datenbank($_POST)) {  
                html_ausgabe('OK');  
              } else {  
                html_ausgabe('Datenbankfehler');  
              }  
            } else {  
              html_ausgabe('Formularfehler');  
            }  
              
            
            ~~~?>[/code]  
              
            Bisschen hier und da noch drumherum und das war's. Es ist IMMER ratsam, an verschiedenen Stellen gebrauchte Funktionalitäten oder fachlich zusammengehörende Dinge in entsprechende Includes oder Bibliotheken auszulagern.  
              
              
            MfG,  
            EKKi  
            
            -- 
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
            
          2. echo $begrüßung;

            Wie wäre es mit einer Session?
            Ich habe keine Erfahrung, wie ich etwas derartiges per Cookie oder vergleichbar regle.

            Um den Keks musst du dich normalerweise nicht kümmern. Du startest in den Scripten, welche Session-Daten zur Verfügung haben sollen, die Session mit session_start(), was vor allen Ausgaben stattfinden musst. Aber wenn du mit Cookies oder header() hantierst, weißt du ja wie das geht. Der Rest sind ganz normale Lese- und Schreib-Zugriffe auf das $_SESSION-Array.

            Ich wollte die Trennung auf zwei Dateien eigentlich aus logischen Gründen und um keinen riesigen PHP File zu haben, der drei unterschiedliche Seiten anzeigen kann...

            Riesige Dateien bekommt man durch Strukturierung und Auslagerung übersichtlicher und kleiner. Außerdem helfen einige Editoren mit Features wie Code-Folding, gerade nicht bearbeitete Teile zuzuklappen.

            echo "$verabschiedung $name";

            1. Ich habe mir eine einfache Session-Verwaltung selbst geschrieben. Kann ich mit session_id( $irgendwas) eine Session die vom PHP verwaltet wird starten und dazu die ID benutzten, die ich son in meiner eigenen Verwaltung habe (ein zufälliger Wert).
              Oder muss ich die ID nutzen, die mit session_start() generiert wird ?

              1. echo $begrüßung;

                Ich habe mir eine einfache Session-Verwaltung selbst geschrieben. Kann ich mit session_id( $irgendwas) eine Session die vom PHP verwaltet wird starten und dazu die ID benutzten, die ich son in meiner eigenen Verwaltung habe (ein zufälliger Wert).

                Sagt der Handbucheintrag zu session_id() etwas anderes als ja?

                Oder muss ich die ID nutzen, die mit session_start() generiert wird ?

                Bist du auf Probleme gestoßen?

                echo "$verabschiedung $name";

      2. Mahlzeit Heinrich,

        Damit diese zweite Seite funktioniert, benötigt sie die Daten aus der ersten, bevorzugt per POST.

        Wenn das (PHP-)Skript, das Daten verarbeiten (in diesem Fall in die Datenbank schreiben) soll, davon ausgeht, dass diese Daten, die es per POST bekommt, bereits "geprüft" sind und es ihnen bedingungslos vertrauen kann, hast Du ein massives Problem: ALL INPUT IS EVIL! Und zwar immer und überall. Insbesondere, wenn irgendwer(!) Daten an ein (PHP-)Skript senden kann ...

        Du solltest Dein ganzes Konzept überdenken und dabei berücksichtigen, dass die bereits gegebenen Empfehlungen (das Affenformular ruft sich solange selbst auf, bis alle Daten OK sind, dann kümmert es sich selbst - z.B. durch Aufrufen einer Funktion aus einer zentralen Bibliothek - um das Eintragen der Daten und leitet anschließend an eine entsprechende "Alles OK"-Seite weiter) sehr sinnvoll sind.

        Daher ist die Frage, ob ich ein Absenden des Formulares sobald die Seite aufgebaut ist, erzwingen kann oder ob ich die Möglichkeit habe, die gemachten Daten selbst an die neue Seite zu übergeben.

        Und diese neue Seite? Die überprüft dann wieder alle Variablen usw.? Oder vertraut sie ihnen blind?

        Mit header() - Location könnte ich natürlich per $_GET die Infos übergeben, aber das möchte ich ungern...

        Warum? Unsicherer als per POST ist das auch nicht ...

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Und diese neue Seite? Die überprüft dann wieder alle Variablen usw.?
          Oder vertraut sie ihnen blind?

          Die neue Seite prüft nur die SessionID wieder.
          Bei den anderen Werten wird schon abgefangen, wenn sie außerhalb des Wertebereiches liegen. Somit könnte jemand vorgaukeln, er hätte andere valide Optionen gewählt, aber wozu, er hätte sie ja sowieso wählen dürfen.

          Warum? Unsicherer als per POST ist das auch nicht ...

          Naja, jeder kann in der URL lesen, was da steht und beliebig Werte verändern. Die POST-Methode zu verändern mag zwar auch einfach sein, aber nicht so offensichtlich (ich wüsste nicht auf Anhieb wie).

          1. Mahlzeit Heinrich,

            Und diese neue Seite? Die überprüft dann wieder alle Variablen usw.?
            Oder vertraut sie ihnen blind?

            Die neue Seite prüft nur die SessionID wieder.

            Du nutzt also Sessions. Warum legst Du die geprüften und damit sicher gültigen Werte nicht in der Session ab? Dort kann das Skript, was die Daten in die Datenbank speichern soll, sie wieder auslesen und kann sicher davon ausgehen, dass sie auch korrekt sind.

            Bei den anderen Werten wird schon abgefangen, wenn sie außerhalb des Wertebereiches liegen.

            Wann und wo? Im Formularskript oder in dem Skript, das die Daten letztlich in die Datenbank schreibt?

            Warum? Unsicherer als per POST ist das auch nicht ...

            Naja, jeder kann in der URL lesen, was da steht und beliebig Werte verändern. Die POST-Methode zu verändern mag zwar auch einfach sein, aber nicht so offensichtlich (ich wüsste nicht auf Anhieb wie).

            Man nehme ein HTML-Formular und speichere es lokal ab. Anschließend manipuliere man beliebig im Quelltext herum, öffne die HTML-Datei im Browser seiner Wahl und schicke das Formular ab.

            Wenn das Formularziel dann nicht absolut JEDE Anfrage von außen peinlichst genau überprüft, hast Du ein Problem. Im Prinzip kann jeder immer alles Mögliche an Dein Skript schicken (wenn Du das nicht per Firewall, ACL o.ä. ausschließt): ALL INPUT IS EVIL!

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Es gibt an dieser Stelle (wie so oft) mehrere Möglichkeiten. Zunächst einmal ist es sehr sinnvoll, den Formularcheck, soweit möglich, clientseitig per JavaScript vorwegzunehmen. Eine serverseitige Prüfung sollte trotzdem unbedingt vorgenommen werden.

    Darüber hinaus möchte ich Dir empfehlen, die Verarbeitung der Daten auf der gleichen Seite zu machen und dann den Redirect vorzunehmen.

    Gruß, LX

    --
    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: Unusual
    X-Please-Search-Archive-First: Absolutely Yes
  3. Hallo

    Ein Formular wird mittels beim Abschicken mittels PHP immer an sich selbst geschickt, bis alle Eingaben korrekt sind.

    Ein sogenanntes Affenformular.

    Ist dies der Fall würde ich gerne alle Informationen die unter $_POST bereit stehen an eine weitere PHP Seite übergeben, die diese weiterverarbeitet. Wenn ich jedoch einfach mittels
    header("Location: new.php");
    die neue Seite aufrufe, werden Daten nicht mit übergeben. Wie kann ich dies dann bewerkstelligen?

    Da du in dem Skript, welches nach dem Abschicken des Formulars die Eingaben danach überprüft, ob sie sinnvoll und vollständig sind, entscheidest, ob das Formular noch einmal angezeigt werden muss, kannst du dort auch gleich die Verarbeitung für den Fall, dass alle Eingaben korrekt sind, vornehmen. Zudem kannst du bei schlussendlich erfolgtem Versand oder Speicherung der Daten auch eine Erfolgsseite anstatt des Formulars ausgeben oder, wie schon angemerkt, dann mit header("location: http://www.example.net/pfad/zur/dankeschoen.html") auf eine andere Seite weiterleiten.

    Tschö, Auge

    --
    Die deutschen Interessen werden am Liechtenstein verteidigt.
    Veranstaltungsdatenbank Vdb 0.2
  4. echo $begrüßung;

    Ein Formular wird mittels beim Abschicken mittels PHP immer an sich selbst geschickt, bis alle Eingaben korrekt sind. Ist dies der Fall würde ich gerne alle Informationen die unter $_POST bereit stehen an eine weitere PHP Seite übergeben, die diese weiterverarbeitet.

    Du möchtest also den Browser einen erneuten Request mit den Daten absenden lassen und gehst davon aus, das die Daten nun geprüft seien. Wenn du einen Browser per Redirekt auf eine andere Seite schickst, dann kann man diese URL auch direkt aufrufen und Daten übergeben, die zuvor nicht dein Prüf-Script gesehen haben. Du musst also die Prüfung im verarbeitenden Script wiederholen und bist damit wieder auf dem Stand des ursprünglichen Nur-Prüf-Scripts. Lass also Prüfung, Ablehnung/Wiedervorlage und Verarbeitung in einem Script und schick den Browser, wenn es sein muss, am erfolgreichen Ende des Vorgangs woanders hin.

    echo "$verabschiedung $name";