2010-11-26 2 views
42

저는 PHP로 작업 중이며 양식이 게시하는 작업 페이지를 만들고 있습니다. 페이지는 오류를 확인한 다음 모든 것이 정상이면 데이터가 게시 된 페이지로 리디렉션합니다. 그렇지 않은 경우 오류 및 POST 변수를 사용하여 페이지를 다시 리디렉션해야합니다. 그것이 작동하는 요지는 다음과 같습니다.POST 변수를 사용하여 PHP header() 리디렉션

html로는 다음과 같이 보일 것 ...

<form name="example" action="action.php" method="POST"> 
    <input type="text" name="one"> 
    <input type="text" name="two"> 
    <input type="text" name="three"> 
    <input type="submit" value="Submit!"> 
</form> 

action.php이 같을 것이다 ... 오류의 경우

if(error_check($_POST['one']) == true){ 
    header('Location: form.php'); 
    // Here is where I need the data to POST back to the form page. 
} else { 
    // function to insert data into database 
    header('Location: posted.php'); 
} 

, 나는 다시 POST 할 필요 첫 페이지로 입력 값이 너무 커서 GET을 사용할 수 없습니다. 가능한 경우 SESSION을 사용하고 싶지 않습니다. 이것이 가능합니까?

+0

http : //www.phpfreaks의 일부 스레드에 따르면.com/forums/php-coding-help/header ('location-x-php') - question-going-2-pages-back /을 사용하면'header ("Location : javascript : window.history. – cambraca

+0

음 ... 필요한 경우 오류 메시지를 추가하려고합니다. 그건 그걸 허용하지 않을거야. – Yoshiyahu

답변

18

세션을 사용하지 않으려면 할 수있는 것은 동일한 페이지에 POST입니다. 어쨌든 가장 좋은 솔루션은 어떤 IMO입니까?

// form.php 

<?php 

    if (!empty($_POST['submit'])) { 
     // validate 

     if ($allGood) { 
      // put data into database or whatever needs to be done 

      header('Location: nextpage.php'); 
      exit; 
     } 
    } 

?> 

<form action="form.php"> 
    <input name="foo" value="<?php if (!empty($_POST['foo'])) echo htmlentities($_POST['foo']); ?>"> 
    ... 
</form> 

+0

그게 현재 내가 해왔 던 일이지만, 나는 깔끔함을 위해 다른 페이지에서 내 서버 작업을하려고 노력 중이다 ... – Yoshiyahu

+0

그냥 궁금해서 POST 데이터를 nextpage.php에서 사용할 수 있습니까? – jerjer

+0

@ jerjer 아니, 그 이유는 같은 페이지에서 모든 처리를해야하거나 세션을 사용하여 페이지간에 데이터를 유지해야하기 때문입니다. – deceze

0

POST를 통해 양식을 보내기 전에 양식의 데이터를 확인하는 것이 좋습니다. 양식에서 오류를 확인하고 양식을 보내려면 JavaScript 함수를 작성해야합니다. 이렇게하면 데이터가 반복해서 전송되는 것을 막을 수 있으므로 브라우저 속도가 느려지고 서버에서 전송 볼륨을 사용할 수 있습니다.

편집 :

보안이 가장 좋은 방법이 될 것이다 데이터를 확인하는 AJAX 요청을 수행하는 우려가있는 경우. AJAX 요청의 응답은 양식을 제출해야하는지 여부를 결정합니다.

+1

서버의 데이터를 확인해야합니다. 그렇지 않으면 보안 문제가 발생할 수 있습니다. –

+0

정확히 내가 생각했던 것, 코르크. 서버 측 오류 검사가 항상 최상입니다. – Yoshiyahu

+0

데이터를 확인하는 방법에 관계없이 항상 보안 문제가 있습니다. 보안이 중요하다면 AJAX 인증 요청이 도움이 될 수 있습니다. –

6

다른 곳 POST를 리디렉션 할 수 없습니다 ...이 더 우아 할 수있다, 그러나 당신은 아이디어를 얻을. 요청을 POSTED하면 브라우저는 서버로부터 응답을 받고 POST가 완료됩니다. 그 이후의 모든 것은 새로운 요청입니다. 거기에 위치 헤더를 지정하면 브라우저는 항상 GET 메소드를 사용하여 다음 페이지를 가져옵니다.

일부 Ajax를 사용하여 백그라운드에서 양식을 제출할 수 있습니다. 그렇게하면 양식 값이 그대로 유지됩니다. 서버가 수락하면 여전히 다른 페이지로 리디렉션 할 수 있습니다. 서버가 승인하지 않으면 오류 메시지를 표시하고 사용자가 입력을 정정하여 다시 보내도록 할 수 있습니다.

+0

좋은 아이디어, 그리고 당신은 내 질문에 대답했습니다. 그러나, 나는이 프로젝트에서 Javascript를 외면하고있다. – Yoshiyahu

+1

그렇지 않습니다. 헤더 ('HTTP/1.1 307 Temporary Redirect')와 헤더 ('HTTP/1.1 308 Permanent Redirect')는 다음 헤더 ('Location : new_url')를 사용하여 리디렉션 할 원래 방법을 유지합니다. – Patanjali

+0

이 상태 코드가 존재하지 않거나 적어도 대부분 지원되지 않는 경우이 응답은 2010 년에 발생한 것입니다. 이에 대한 지식이있는 경우 OP의 문제를 해결하기 위해 이러한 새로운 상태 코드를 활용하는 방법을 보여주는 완전한 대답을 게시 할 수 있습니다. 많은 사람들이 유용하다고 생각합니다. –

25
// from http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl 
function do_post_request($url, $data, $optional_headers = null) 
{ 
    $params = array('http' => array(
       'method' => 'POST', 
       'content' => $data 
      )); 
    if ($optional_headers !== null) { 
    $params['http']['header'] = $optional_headers; 
    } 
    $ctx = stream_context_create($params); 
    $fp = @fopen($url, 'rb', false, $ctx); 
    if (!$fp) { 
    throw new Exception("Problem with $url, $php_errormsg"); 
    } 
    $response = @stream_get_contents($fp); 
    if ($response === false) { 
    throw new Exception("Problem reading data from $url, $php_errormsg"); 
    } 
    return $response; 
} 
+5

주의 ... – ryanwinchester

+0

어떻게 이것을 사용하여 동일한 양식의 특정 페이지로 리디렉션합니까? – Rich

0

멋진 템플릿을 사용하여 물건을 만드십시오. 그런 다음 POST 배열을 멋진 배열로 설정하고 템플릿을 엽니 다. 나는 아직이 시도하지 않은하지만 난 솔루션으로 그것을 시도하기 위하여려고하고있다 그리고 당신은 내가 무엇을 발견 알려드립니다

if(correct){ 
    header("Location: passed.php"); 
} else { 
    $smarty->assign("variables", $_POST); 
    $smarty->display("register_error.php"); 
    exit; 
} 

: 통과되는 경우 있도록 템플릿에서 단지 배열을 에코. 물론이 방법은 당신이 현명하게 사용하고 있다고 가정합니다.

당신은 단지 형태로이 오류 페이지와 에코 정보에 양식을 다시 만들 수 있습니다 또는에서 GET 비 중요한 데이터를 다시 전송하고

전을 얻을 수없는 경우.

register.php?name=mr_jones&address==...... 
echo $_GET[name]; 
관련 문제