2016-08-05 5 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; 
    } 
} 

확인 양식 데이터입니다 리디렉션 양식 페이지 (가사/add.php)에 페이지 ( 스크립트/가사/submit_lyrics.php) 검증 (실패한 경우). 그런 다음 GET 메서드를 사용하여 입력에 문제가 있음을 나타내는 오류 메시지를 출력합니다.

내가 POST을 사용하여 이것을 수행 할 수 있는지 궁금합니다. 나는

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

그것이 BASE."lyrics/add"에 페이지를 리디렉션 또한 해당 페이지에 POST를 사용하여 검증 정보를 보낼 수 있도록이 줄을 수정해야합니다. 그래서 여전히 유효성 검사 오류를 출력 할 수 있지만 GET 대신 POST을 사용합니다.

이것이 가능합니까?

+3

세션에 값을 저장하십시오. –

+0

이것에 컬을 사용할 수 있습니다 –

+1

원본 URL을 호출하는 데 사용되는 동일한 '동사'로 리디렉션되는 http 307이 있습니다. 그래서 만약 당신이 "foo.php"에 글을 올리면 307은 "bar.php"로 가고, 브라우저는 bar.php가 아닌 get.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을 참조하십시오.

해결 방법은 포함 된 양식이 포함 된 새 페이지로 리디렉션하고 사용자가 생성하는 자바 스크립트 POST를 사용하는 것입니다. 추가 요청이지만 클라이언트가 두 번째 POST를 수행하는 유일한 방법입니다. (세션에 값을 저장) u_mulder의 suggesion를 사용

관련 문제