2016-08-05 9 views
0

私はフォームを持っており、required属性以外のクライアント側の検証は行いません。私はサーバー側で検証を行っています。同時にリダイレクトとPOST

歌詞/ add.php

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

フォームデータを別々のphpファイル内で処理されます。取得と、次のようにフォームデータを検証:

スクリプト/歌詞/ submit_lyrics.php

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

validate方法がないこと

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; 
    } 
} 

チェックフォームデータとでリダイレクトフォームページ(lyrics/add.php)にページ(スクリプト/歌詞/ submit_lyrics.php)の情報検証(失敗した場合)。次に、GETメソッドを使用して入力に問題があることを示すエラーメッセージを出力します。

私がPOSTを使用してこれを行うことができるかどうか不思議です。私はそれがBASE."lyrics/add"にページをリダイレクトしてもそのページにPOSTを使用して検証情報を送信します

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

この行を変更する必要があります。だから私はまだGETの代わりにPOSTを使用して、検証エラーを出力することができます。

これは可能ですか?

+3

セッションに値を格納します。 –

+0

これにcurlを使うことができます –

+1

元のURLを呼び出すために使用された同じ動詞でリダイレクトされるhttp 307があります。だからあなたが "foo.php"に投稿し、307が "bar.php"であれば、ブラウザはbar.phpへの投稿を取得します。 –

答えて

0

は、私は次のように問題を解決しました:

スクリプト/歌詞/ 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; 
    } 
} 

歌詞/追加します.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

いいえ、要求を書き換えているため、これはできません。ブラウザーは、同じメソッドとパラメーターを使用して要求を繰り返す307要求を受信しない限り、リダイレクト要求に応答して常に「GET」要求を送信します。 this related question on Programmersを参照してください。

回避策は、生成する埋め込みフォームの新しいページにリダイレクトし、そのユーザーのフォームにjavascript POSTを設定することです。余分な要求ですが、クライアントに2回目のPOSTをさせる唯一の方法です。 (セッション中に値を格納する)u_mulderのsuggesionを使用して

関連する問題