페이지를 새로 고칠 때 양식 다시 제출을 방지하는 방법 (F5 / CTRL + R)


132

SQL 테이블에 텍스트를 제출하는 간단한 양식이 있습니다. 문제는 사용자가 텍스트를 제출 한 후 페이지를 새로 고칠 수 있으며 양식을 다시 채우지 않고 데이터가 다시 제출된다는 것입니다. 텍스트가 제출 된 후 사용자를 다른 페이지로 리디렉션 할 수 있지만 사용자가 동일한 페이지에 머무르기를 원합니다.

각 사용자에게 고유 한 세션 ID를 제공하고 다른 값과 비교하여 내가 가진 문제를 해결했지만 어디에 있는지 잊어 버린 것에 대해 읽은 것을 기억합니다.



1
사용자를 다른 페이지로 리디렉션하고 싶지 않은 이유는 무엇입니까?
Adam

@Adam : 서버에 대한 또 다른 요청을하기에 초과하기 때문에 DB에서 일부 데이터를 다시 가져옵니다. 우리가 이미 처리하는 동안 필요한 모든 데이터를 가져 오기 때문에 그러나 이것은 자원 낭비는 POST요청을
오이겐 Konkov

PRG 패턴의 @EugenKonkov에서는 성공 메시지가 표시된 페이지로 리디렉션됩니다. DB에서 더 이상 가져올 필요가 없습니다.
Adam

@Adam : POSTing 데이터 로 생성 된 전체 레코드를 표시 할 수도 있습니다 . 이 경우 SELECTDB에서 필요합니다 . 예를 들어 인보이스를 만들면 /invoices/53'성공'대신 전체 인보이스가 표시 되도록 리디렉션됩니다.
Eugen Konkov

답변:


96

Post / Redirect / Get 패턴을 사용하십시오. http://en.wikipedia.org/wiki/Post/Redirect/Get

내 웹 사이트를 사용하여 쿠키 또는 세션에 메시지를 저장하고 게시 후 리디렉션하고 쿠키 / 세션을 읽은 다음 해당 세션 또는 쿠키 변수의 값을 지 웁니다.


1
이로 인해 비즈니스에서 게시물 만 필요한 개발에 크롬을 사용할 수 없습니다!
John Peters

26
PRG 패턴을 사용하는 경우 실제로 페이지를 그대로 두겠습니까? 리디렉션하지 않을 때 작업을 수행하는 방법에 대한 질문이 아니 었습니까?
Adam

1
같은 페이지로 리디렉션하면 $ _POST가 지워지는 것 같습니다. 내가 이해할 때, 그것은 원하는 효과였습니다. 어쨌든 그것은 내가 원하는 효과였습니다. 그래도 대답이 더 좋을 것이라고 생각합니다.
donutguy640

잘 작동합니다. 제일 권장 사항은 엄격한 오류 테스트를 활성화하여 개발하는 동안 로컬에서 오류를 포착하는 것입니다. 그렇지 않으면 오류가 눈에 띄지 않을 수 있습니다.
Maurice

질문에 대답하지 않습니다. 왜 이것이 대답인지 확실하지 않습니다.
YungGun

124

또한 window.history.replaceState새로 고침 및 뒤로 버튼에서 다시 제출을 방지하기 위해 자바 스크립트 접근 방식을 사용할 수 있음을 지적하고 싶습니다 .

<script>
    if ( window.history.replaceState ) {
        window.history.replaceState( null, null, window.location.href );
    }
</script>

개념 증명은 여기 : https://dtbaker.net/files/prevent-post-resubmit.php

여전히 Post / Redirect / Get 접근법을 권장하지만 이것은 새로운 JS 솔루션입니다.


1
감사합니다, @dtbaker, 그것은 굉장 :)입니다
Gufran 하산

1
Tks, 이것은 나를 위해 완벽하게 작동합니다, 그것은 단지 사용자 오해를 피하기 위해 404 페이지를 만들어야했습니다
tess hsu

단순히 놀랍습니다. 감사합니다
user4906240

2
그것은 사파리에서 작동하지 않습니다, 그것은 href를 변경했지만 여전히 제출 요청 후 데이터를 유지
Vo Thanh Tung

감사합니다! PRG 접근법을 권장하는 이유는 무엇입니까?
iJassar

16

이것을 처리하기 위해 Post Redirect Get 패턴을 실제로 사용해야하지만 PRG를 사용할 수없는 위치 (예 : 양식 자체가 포함되어 리디렉션을 방지하는 위치)에 도달하면 일부 요청 매개 변수를 해시 할 수 있습니다 내용을 기반으로 문자열을 만든 다음 아직 보내지 않았는지 확인하십시오.

//create digest of the form submission:

    $messageIdent = md5($_POST['name'] . $_POST['email'] . $_POST['phone'] . $_POST['comment']);

//and check it against the stored value:

    $sessionMessageIdent = isset($_SESSION['messageIdent'])?$_SESSION['messageIdent']:'';

    if($messageIdent!=$sessionMessageIdent){//if its different:          
        //save the session var:
            $_SESSION['messageIdent'] = $messageIdent;
        //and...
            do_your_thang();
    } else {
        //you've sent this already!
    }

공유해 주셔서 감사하지만 작동하지 않는 것 같습니다. 페이지를 새로 고치면 실제로 양식이 다시 제출됩니다. 아마도 뭔가 빠졌습니까?
aLearner

페이지를 새로 고치면 모든 것이 다시 제출되지만 제출 데이터는 마지막으로 보낸 데이터와 다른 경우에만 제출됩니다 ( 'var var'messageIdent '세션에 저장). 'messageIdents가 다른 경우'절 (예 : 'do_your_thang ()') 내에서 양식 제출을 처리하고 있습니까?
Moob

답장을 보내 주셔서 감사합니다. Post / Redirect / Get 패턴을 구현했기 때문에 이제 정확히 무엇이 나를 트립했는지 기억하지 못합니다. 다시 돌아와 주셔서 감사합니다.
aLearner

이 방법은 다시 제출을 차단하기위한 것이 아니라 다시 제출을 감지하여 새로 제출 한 경우 수행 한 작업을 "하지"않도록 코드를 변경할 수 있습니다. 즉,이 방법을 사용하면 "원본"제출을 감지하고 데이터를 배치 할 수 있습니다. 원본이 아닌 경우 데이터를 배치하지 마십시오. "dupe 시도"경고를 표시하거나 "확인"을 대신 표시하십시오.
TheSatinKnight

이것이 작동하려면 session_start();파일 시작 부분 에 추가하여 세션을 시작해야 합니다. w3schools.com/php/php_sessions.asp는 말한다 주 다음으로 session_start () 함수는 문서의 첫 번째 일이 될해야합니다. HTML 태그 앞에.
wkille

16

이 자바 스크립트 라인을 사용하여 양식이 제출되면 새로 고침시 양식 재 제출을 요청하는 팝업을 차단합니다.

if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}

이 줄을 파일의 바닥 글에 놓고 마술을보십시오.


클라이언트 측에서 비활성화 할 수없는이 버전이 좋을지 모르지만 짧고 쉽고 빠르며 필요한 작업을 수행합니다. 사용자가 게시물을 다시 보내지 않고 뒤로 이동할 수 있도록 기록을 유지합니다.
Péter Vértényi

16

세션 변수를 통해 양식을 다시 제출하지 못하게 할 수 있습니다.

먼저 rand()텍스트 상자와 $_SESSION['rand']양식 페이지 에서 설정해야 합니다.

<form action="" method="post">
  <?php
   $rand=rand();
   $_SESSION['rand']=$rand;
  ?>
 <input type="hidden" value="<?php echo $rand; ?>" name="randcheck" />
   Your Form's Other Field 
 <input type="submit" name="submitbtn" value="submit" />
</form>

그런 다음 $_SESSION['rand']텍스트 상자 $_POST['randcheck']값을 다음과 같이 확인하십시오 .

if(isset($_POST['submitbtn']) && $_POST['randcheck']==$_SESSION['rand'])
{
    // Your code here
}

3
우리가 사용할 수있는 <input type="hidden" name="randcheck" id="randcheck" value="<?php echo microtime(); ?>" />대신에
니콜라이 Bronskiy

예, rand () 대신 microtime ()과 time ()을 사용할 수 있습니다. 다른 값을 제공하는 함수 또는 변수는 사용할 수 있습니다. 그러나 해당 값을 SESSION 변수로 설정했는지 확인하십시오. 여기서 세션은 randcheck 필드로 확인하고 양식을 다시 제출하지 않도록해야합니다.
Savoo

세션 및 게시물 변수가 일치하는지 확인한 후 세션 변수를 지우지 않아야합니까?
제거

1
@denoise @Savoo의 아이디어 $_POST는 양식 데이터 후 동일한 페이지가 세션 및 게시물 변수를 다시 설정하여 다시로드 한다는 것 입니다. 또한 변수가 일치하는지 확인한 후 변수를 작성해야합니다. 따라서 unset필요하지 않습니다.
HalfMens

13

양식이 처리되면 다른 페이지로 리디렉션됩니다.

... process complete....
header('Location: thankyou.php');

같은 페이지로 리디렉션 할 수도 있습니다.

주석과 같은 일을하고 사용자가 동일한 페이지에 머무르기를 원한다면 Ajax를 사용하여 양식 제출을 처리 할 수 ​​있습니다.


12

다음 해결 방법을 찾았습니다. 객체 POST를 조작하여 요청을 처리 한 후 리디렉션을 피할 수 있습니다 history.

따라서 HTML 형식이 있습니다.

<form method=POST action='/process.php'>
 <input type=submit value=OK>
</form>

서버에서이 양식을 처리 할 때 다음 과 같이 헤더 /the/result/page를 설정하여 사용자를 리디렉션하는 대신 Location:

$cat process.php
<?php 
     process POST data here
     ... 
     header('Location: /the/result/page');
     exit();
?>

여기에 이미지 설명을 입력하십시오

POSTed 데이터를 처리 한 후 작게 렌더링 <script>하고 결과/the/result/page

<?php 
     process POST data here
     render the <script>         // see below
     render `/the/result/page`   // OK
?>

<script>당신은 렌더링한다 :

<script>
    window.onload = function() {
        history.replaceState("", "", "/the/result/page");
    }
</script>

결과는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

보시 POST다시피 양식 데이터는 process.php스크립트로 표시됩니다.
이 스크립트 프로세스는 POST데이터 및 렌더링 에드 /the/result/page 과 :

  1. 리디렉션 안함
  2. POST페이지를 새로 고칠 때 데이터가 다시 표시되지 않음 (F5)
  3. POST브라우저 기록을 통해 이전 / 다음 페이지로 이동할 때 다시

UPD

다른 솔루션으로 Mozilla FireFox 팀 은 기능 요청 을 통해 사용자가 헤더처럼 작동 하고 패턴이 더 이상 사용되지 않도록 헤더 를 설정할 수 있습니다.NextPageLocationpost/redirect/get

한마디로. 서버가 양식 POST데이터를 성공적으로 처리 하면 :

  1. NextPage대신 설치 헤더Location
  2. 패턴으로 요청을 POST위해 렌더링 할 때 양식 데이터 처리 결과 렌더링GETpost/redirect/get

브라우저는 NextPage헤더를 볼 때 차례로 :

  1. 조정 window.locationNextPage가치
  2. 사용자가 페이지를 새로 고치면 브라우저는 데이터 를 재구성 GET하는 NextPage대신 요청을 협상 POST합니다.

나는 이것이 구현된다면 우수하다고 생각하지 않습니까? =)


11
  1. 헤더를 사용하고 페이지를 리디렉션하십시오.

    header("Location:your_page.php"); 동일한 페이지 또는 다른 페이지로 리디렉션 할 수 있습니다.

  2. 데이터베이스에 $ _POST를 삽입 한 후 설정을 해제하십시오.

    unset($_POST);


54
$ _POST를 설정 해제해도 Chrome에서는 최소한 양식 재전송에 전혀 영향을 미치지 않습니다.
개빈

2
이거 작동 안 할거야. 사용자가 백 페이지로 이동하면 POST 변수 설정을 다시 한 번 수행합니다.
Sandhu

사용하는 이유는 무엇입니까 unset? 다른 사람들이 그로부터 배울 수 있도록 귀하의 답변에 약간의 설명을 추가하십시오
Nico Haase

7

확실한 확실한 방법은 게시물에 고유 ID를 구현하고

<input type='hidden' name='post_id' value='".createPassword(64)."'>

그런 다음 코드에서 다음을 수행하십시오.

if( ($_SESSION['post_id'] != $_POST['post_id']) )
{
    $_SESSION['post_id'] = $_POST['post_id'];
    //do post stuff
} else {
    //normal display
}

function createPassword($length)
{
    $chars = "abcdefghijkmnopqrstuvwxyz023456789";
    srand((double)microtime()*1000000);
    $i = 0;
    $pass = '' ;

    while ($i <= ($length - 1)) {
        $num = rand() % 33;
        $tmp = substr($chars, $num, 1);
        $pass = $pass . $tmp;
        $i++;
    }
    return $pass;
}

나는 실제로 이것과 비슷한 것을 썼지 만 암호를 만드는 데 어려움을 겪지 않았고 방금 양식을 열거했습니다 (예 : 1-5 단계). 그렇지 않으면 DB에 저장하거나 이메일을 보내지 마십시오. 그러나 사용자가 어디를 가든 착륙 할 수 있습니다.
Fernando Silva

1
게시물이 성공적으로 게시되면 메시지가 표시되고 페이지를 다시로드하면 메시지가 삭제되므로 페이지를 다시로드하는 것보다 더 나은 솔루션이라고 생각합니다. 이것은 나를 위해 작동합니다, 당신은 또한 uniqid를 사용할 수 있습니다
Julio Popócatl

6

이 방법은 저에게 효과적이며이 작업을 수행하는 가장 간단한 방법이라고 생각합니다.

일반적으로 양식 제출 후 사용자를 다른 페이지로 리디렉션하면 페이지 새로 고침시 양식 다시 제출이 중지됩니다. 여전히 양식을 제출 한 후 동일한 페이지에서 사용자를 유지해야하는 경우 여러 가지 방법으로 수행 할 수 있지만 여기서는 자바 스크립트 방법을 설명합니다.

자바 스크립트 방법

이 방법은 매우 쉽고 양식을 제출하면 새로 고침시 양식을 다시 제출하도록 요청하는 팝업을 차단합니다. 이 자바 스크립트 코드 줄을 파일의 바닥 글에 놓고 마술을보십시오.

<script>
if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}
</script>


이것은 저에게도 도움이됩니다
Ankit

4

자바 스크립트

이 방법은 매우 쉽고 양식을 제출하면 새로 고침시 양식을 다시 제출하도록 요청하는 팝업을 차단합니다. 이 자바 스크립트 코드 줄을 파일의 바닥 글에 놓고 마술을보십시오.

<script>
    if ( window.history.replaceState ) {
        window.history.replaceState( null, null, window.location.href );
    }
</script>

3

양식 데이터를 사용한 후 동일한 페이지로 리디렉션하면 작동합니다. 나는 그것을 시도했다.

header('location:yourpage.php');

4
이것은 다른 사람이 몇 년 전에 준 것과 같은 대답을 반복합니다. (사실 다른 두 사람!)
Nick Rice

다른 사람의 답변을 복제하는 경우 답변을 흥미롭게 만들기 위해 적어도 몇 가지 설명을 추가해야합니다.
Nico Haase

3

Moob의 포스트의 세련된 버전. POST의 해시를 작성하여 세션 쿠키로 저장 한 후 모든 세션의 해시를 비교하십시오.

// Optionally Disable browser caching on "Back"
header( 'Cache-Control: no-store, no-cache, must-revalidate' );
header( 'Expires: Sun, 1 Jan 2000 12:00:00 GMT' );
header( 'Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT' );

$post_hash = md5( json_encode( $_POST ) );

if( session_start() )
{
    $post_resubmitted = isset( $_SESSION[ 'post_hash' ] ) && $_SESSION[ 'post_hash' ] == $post_hash;
    $_SESSION[ 'post_hash' ] = $post_hash;
    session_write_close();
}
else
{
    $post_resubmitted = false;
}

if ( $post_resubmitted ) {
  // POST was resubmitted
}
else
{
  // POST was submitted normally
}

2

기본적으로 해당 페이지에서 리디렉션해야하지만 인터넷 속도가 느린 동안 여전히 문제가 발생할 수 있습니다 (서버 측에서 헤더 리디렉션)

기본 시나리오의 예 :

제출 버튼을 두 번 클릭하십시오

해결 방법

  • 고객 입장에서

    • 클라이언트가 클릭하면 제출 버튼 비활성화
    • Jquery를 사용하는 경우 : Jquery.one
    • PRG 패턴
  • 서버 측

    • 요청이 전송 될 때 차별화 기반 해싱 타임 스탬프 / 타임 스탬프 사용
    • 사용자 요청 토큰. 메인이로드되면 반복되는 경우 무시되는 임시 요청 토큰을 할당합니다.

2

리디렉션없이 PHP 양식을 다시 제출하지 못하게하는 방법. $ _SESSION (session_start 이후) 및 $ _POST 양식을 사용하는 경우 다음과 같이 할 수 있습니다.

if ( !empty($_SESSION['act']) && !empty($_POST['act']) && $_POST['act'] == $_SESSION['act'] ) {
  // do your stuff, save data into database, etc
}

html 형식으로 다음을 입력하십시오.

<input type="hidden" id="act" name="act" value="<?php echo ( empty($_POST['act']) || $_POST['act']==2 )? 1 : 2; ?>">
<?php
if ( $_POST['act'] == $_SESSION['act'] ){
    if ( empty( $_SESSION['act'] ) || $_SESSION['act'] == 2 ){
        $_SESSION['act'] = 1;
    } else {
        $_SESSION['act'] = 2;
    }
}
?>

따라서 양식을 제출할 때마다 새 행위가 생성되어 세션에 저장되고 사후 행위와 비교됩니다.

추신 : Get 양식을 사용하는 경우 GET으로 모든 POST를 쉽게 변경할 수 있으며 작동합니다.


1

데이터베이스에 삽입 한 후 unset () 메소드를 호출하여 데이터를 지우십시오.

설정 해제 ($ _POST);

새로 고침 데이터 삽입을 방지하려면 레코드 삽입 후 동일한 페이지 또는 다른 페이지로 페이지 리디렉션을 수행하십시오.

header ( '위치 :'. $ _ SERVER [ 'PHP_SELF']);


1
다른 사람들이 배울 수 있도록 답변에 설명을 추가하십시오. 왜 unset전화가 필요한가요? 건너 뛰면 어떻게 되나요?
니코 하세

0

Keverw 답변의 Post / Redirect / Get 패턴을 사용하는 것이 좋습니다. 그러나, 당신은 당신의 페이지에 머물 수 없습니다 (그리고 이것이 당신이 요구 한 것이라고 생각합니까?) 또한, 때로는 실패 할 수도 있습니다 :

서버 지연으로 인해 초기 제출이 완료되기 전에 웹 사용자가 새로 고쳐지면 특정 사용자 에이전트에서 HTTP POST 요청이 중복됩니다.

다음과 같이 SQL 데이터베이스에 텍스트를 작성해야하는 경우 세션에 저장하는 다른 옵션이 있습니다.

if($_SERVER['REQUEST_METHOD'] != 'POST')
{
  $_SESSION['writeSQL'] = true;
}
else
{
  if(isset($_SESSION['writeSQL']) && $_SESSION['writeSQL'])
  {
    $_SESSION['writeSQL'] = false;

    /* save $_POST values into SQL */
  }
}

0

다른 사람들이 말했듯이 post / redirect / get을 사용하는 것은 불가능합니다. 그러나 동시에 서버 측에서 수행하려는 작업을 수행하는 것은 매우 쉽습니다.

POST 페이지에서 단순히 사용자 입력의 유효성을 검사하지만 작동하지 않고 SESSION 배열에 복사하십시오. 그런 다음 기본 제출 페이지로 다시 리디렉션하십시오. 기본 제출 페이지는 사용중인 SESSION 배열이 존재하는지 확인하고 로컬 배열로 복사하여 설정을 해제하여 시작합니다. 거기에서 당신은 그것에 행동 할 수 있습니다.

이렇게하면 모든 주요 작업을 한 번만 수행하여 원하는 작업을 수행 할 수 있습니다.


0

그 후 큰 프로젝트에서 다시 제출하지 못하도록 솔루션을 검색했습니다. 이 코드는 $ _GET 및 $ _POST와 잘 작동하며 예기치 않은 버그의 위험없이 양식 요소 동작을 변경할 수 없습니다. 자, 여기 내 코드가 있습니다 :

<!-- language: lang-php -->
<?php

// Very top of your code:

// Start session:
session_start();

// If Post Form Data send and no File Upload
if ( empty( $_FILES ) && ! empty( $_POST ) ) {
    // Store Post Form Data in Session Variable
    $_SESSION["POST"] = $_POST;
    // Reload Page if there were no outputs
    if ( ! headers_sent() ) {
        // Build URL to reload with GET Parameters
        // Change https to http if your site has no ssl
        $location = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        // Reload Page
        header( "location: " . $location, true, 303 );
        // Stop any further progress
        die();
    }
}

// Rebuilt POST Form Data from Session Variable
if ( isset( $_SESSION["POST"] ) ) {
    $_POST = $_SESSION["POST"];
    // Tell PHP that POST is sent
    $_SERVER['REQUEST_METHOD'] = 'POST';
}

// Your code:
?><html>
    <head>
        <title>GET/POST Resubmit</title>
    </head>
    <body>

    <h1>Forms:</h1>
    <h2>GET Form:</h2>
    <form action="index.php" method="get">
        <input type="text" id="text_get" value="test text get" name="text_get"/>
        <input type="submit" value="submit">
    </form>
    <h2>POST Form:</h2>
    <form action="index.php" method="post">
        <input type="text" id="text_post" value="test text post" name="text_post"/>
        <input type="submit" value="submit">
    </form>
    <h2>POST Form with GET action:</h2>
    <form action="index.php?text_get2=getwithpost" method="post">
        <input type="text" id="text_post2" value="test text get post" name="text_post2"/>
        <input type="submit" value="submit">
    </form>
    <h2>File Upload Form:</h2>
    <form action="index.php" method="post" enctype="multipart/form-data">
        <input type="file" id="file" name="file">
        <input type="submit" value="submit">
    </form>

    <h1>Results:</h1>
    <h2>GET Form Result:</h2>
    <p>text_get: <?php echo $_GET["text_get"]; ?></p>
    <h2>POST Form Result:</h2>
    <p>text_post: <?php echo $_POST["text_post"]; ?></p>
    <h2>POST Form with GET Result:</h2>
    <p>text_get2: <?php echo $_GET["text_get2"]; ?></p>
    <p>text_post2: <?php echo $_POST["text_post2"]; ?></p>
    <h2>File Upload:</h2>
    <p>file:
    <pre><?php if ( ! empty( $_FILES ) ) {
            echo print_r( $_FILES, true );
        } ?></pre>
    </p>
    <p></p>
    </body>
    </html><?php
// Very Bottom of your code:
// Kill Post Form Data Session Variable, so User can reload the Page without sending post data twice
unset( $_SESSION["POST"] );

$ _GET이 아닌 $ _POST의 다시 제출을 피하기 위해서만 작동합니다. 그러나 이것은 내가 필요한 행동입니다. 다시 제출 문제가 파일 업로드에서 작동하지 않습니다!


0

나를 위해 일하는 것은 :

if ( !refreshed()) {
   //Your Submit Here
        if (isset( $_GET['refresh'])) {
            setcookie("refresh",$_GET['refresh'], time() + (86400 * 5), "/");
        }

    }    
}


function refreshed()
{
    if (isset($_GET['refresh'])) {
        $token = $_GET['refresh'];
        if (isset($_COOKIE['refresh'])) {
            if ($_COOKIE['refresh'] != $token) {
                return false;
            } else {
                return true;
            }
        } else {
            return false;
        }
    } else {
        return false;
    }
}  


function createToken($length) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

?>

그리고 당신의 형태로

 <form  action="?refresh=<?php echo createToken(3)?>">



 </form>

0

form.php샘플은 PRG를 올바르게 사용하는 방법을 보여줍니다 (양식이 유효 할 때).

  • 양식이 유효하고 조치가 수행 된 경우에만 동일한 페이지로 경로 재 지정됩니다.
  • 리디렉션은 페이지를 새로 고칠 때 양식이 다시 제출되지 않도록 보호합니다.
  • 양식이 유효 할 때 표시하려는 성공 메시지를 풀지 않기 위해 세션을 사용합니다.
  • 테스트를위한 두 가지 버튼이 있습니다 : "유효한 제출", "잘못된 제출". 둘 다 시도하고 그 후에 페이지를 새로 고칩니다.
<?php
session_start();

function doSelfRedirect()
{
  header('Location:'.$_SERVER['PHP_SELF']);
  exit;
}

function setFlashMessage($msg)
{
  $_SESSION['message'] = $msg;
}

function getFlashMessage()
{
  if (!empty($_SESSION['message'])) {
    $msg = $_SESSION['message'];
    unset($_SESSION['message']);
  } else {
    $msg = null;
  }

  return $msg;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  // Validation primitive example.
  if (empty($_POST['valid'])) {
    $formIsValid = false;
    setFlashMessage('Invalid form submit');
  } else {
    $formIsValid = true;
  }

  if ($formIsValid) {
    // Perform any actions here.
    // ...

    // Cool!
    setFlashMessage('Form is valid. Action performed.');

    // Prevent form resubmission.
    doSelfRedirect();
  }
}
?>
<h1>Hello form</h1>

<?php if ($msg = getFlashMessage()): ?>
  <div><?= $msg ?></div>
<?php endif; ?>

<form method="post">
  <input type="text" name="foo" value="bar"><br><br>
  <button type="submit" name="invalid" value="0">Invalid submit</button>
  <button type="submit" name="valid" value="1">Valid submit</button>
</form>

-2
if (($_SERVER['REQUEST_METHOD'] == 'POST') and (isset($_SESSION['uniq']))){
    if($everything_fine){
        unset($_SESSION['uniq']);
    }
}
else{
    $_SESSION['uniq'] = uniqid();
}

다른 사람들이 그로부터 배울 수 있도록 귀하의 답변에 설명을 추가하십시오-어디에서 $everything_fine왔습니까?
니코 하세

-3

$_POST['submit']양식에있는 내용을 저장하기 위해 변수를 논리 문으로 사용하는 것이 어떻습니까? 당신은 항상 새로 고침 경우 같은 페이지 (리디렉션 수 있으며,이 명중 할 때 go back브라우저에서 포스트 변수가 더 이상 설정되지 않을 것이다 제출합니다. 그냥 제출 버튼이이 있는지 확인 name하고 idsubmit.


1
한 번 봐 가지고 en.wikipedia.org/wiki/Post/Redirect/Get을 ! 이것이 올바른 접근법입니다
jan267
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.