2016-08-05 16 views
0

Ich habe ein Formular und ich nicht clientseitige Validierung als required Attribut. Ich mache die Validierung auf der Serverseite.Redirect und POST zur gleichen Zeit

lyrics/add.php

<form action="../scripts/lyrics/submit_lyrics.php" id="lyricsForm" method="post" autocomplete="off" enctype="multipart/form-data"> 

Formulardaten in einer separaten PHP-Datei verarbeitet wird. Abrufen und Validierung der Formulardaten auf folgende Weise:

Skripte/Texte/submit_lyrics.php

$form_data = new FormData(["artist", "album", "song", "year", "track_no", "lyrics"], "sssiis"); 
$form_data->validate(); 

Was die validate Methode tut, ist

public function validate() { 
    $valid = $this->check_form_data($fields); 
    $fields = implode(",", $fields); 
    if (!$valid) { 
     header("location: ".BASE."lyrics/add?status=error&problem=input&specifics=$fields"); 
     exit; 
    } 
} 

Überprüfen Sie die Daten Form und umleiten die Seite ( scripts/lyrics/submit_lyrics.php) zur Formularseite (lyrics/add.php) mit den Informationen auf Validierung (wenn es fehlgeschlagen ist). Dann gebe ich eine Fehlermeldung aus, die anzeigt, dass etwas mit der Eingabe unter Verwendung der GET Methode falsch ist.

Ich bin gespannt, ob ich dies mit POST tun kann. Ich müsste diese Linie

header("location: ".BASE."lyrics/add?status=error&problem=input&specifics=$fields"); 

ändern machen es die Seite zu BASE."lyrics/add" umleiten und die Validierungsinformationen senden zu dieser Seite mit POST. Also würde ich immer noch den Validierungsfehler ausgeben können, aber POST anstelle von GET verwenden.

Ist das möglich?

+3

Werte in einer Sitzung speichern. –

+0

Kann Curl für diese –

+1

verwenden, gibt es http 307, die mit dem gleichen 'Verb' umgeleitet wird, um die ursprüngliche URL aufzurufen. also wenn du auf "foo.php" poste und es 307's auf "bar.php" schreibst, bekommt der browser einen post in bar.php, kein get. –

Antwort

0

Mit u_mulder der suggesion (Werte in einer Sitzung zu speichern), habe ich das Problem auf folgende Weise gelöst:

Skripte/Texte/submit_lyrics.php

public function validate() { 
    $valid = $this->check_form_data($fields); // check if input fields are valid 
    $fields = implode(";", $fields);   // invalid input fields 
    if (!$valid) {        // not all fields are valid, so we return 
     session_start();      // start session 
     if (!isset($_SESSION["problem"])) {  // making sure session variable doesn't exist 
      $_SESSION["problem"] = "input"; // error type: input, file_upload, db_insert, etc. 
      $_SESSION["specifics"] = $fields; // artist, album, etc. (for input) 
     } 
     header("location: ".BASE."lyrics/add?status=error"); // redirect to form page 
     exit; 
    } 
} 

lyrics/hinzufügen .php

if (isset($_GET["status"])) { 
    $status = $_GET["status"]; 
    switch ($status) { 
     case "error": 
      session_start(); 
      if (isset($_SESSION["problem"])) { 
       $problem  = $_SESSION["problem"]; 
       $specifics  = explode(";", $_SESSION["specifics"]); 
       $error_message = "There was an error."; 
       switch ($problem) { 
        case "input": 
         $error_message = "Invalid input on the following fields:"; 
         break; 
        // other cases ... 
       } 
       session_destroy(); 
       output("Error!", $error_message, $specifics); 
      } else { 
       // if the user reloads the page, session data is lost 
       // but we're still in the error page "lyrics/add?status=error" and have no error to show 
       // we either show an appropriate message or redirect to "lyrics/add" 
       session_destroy(); 
       // output("Error!", "You're in the form validation error page, but there aren't any errors. Did you reload the page?"); 
       // header("location: ".BASE."lyrics/add"); 
       // exit; 
      } 
      break; 
     case "success": 
      // form submitted successfully 
      break; 
    } 
} else { 
    // show form 
} 
0

Nein, dies ist nicht möglich, da Sie die Anforderung neu schreiben. Der Browser sendet immer eine "GET" -Anfrage als Antwort auf eine Weiterleitungsanfrage, es sei denn, er erhält eine Anfrage 307, in der er die Anfrage mit der gleichen Methode und den gleichen Parametern wiederholt. Siehe this related question on Programmers.

Die Problemumgehung besteht darin, auf eine neue Seite mit einem eingebetteten Formular, das Sie generieren, umzuleiten, und Sie haben Javascript POST das Formular für den Benutzer. Es ist eine zusätzliche Anforderung, aber es ist die einzige Möglichkeit, dass der Client einen zweiten POST erstellt.

Verwandte Themen