2010-05-19 2 views
0

로 다시로드하면 감지 :PHP 페이지가 나는 업데이트 된 데이터 페이지를 다시로드 형태가 PHP_SELF

페이지 I 메시지 "업데이트 데이터"를 표시 할 업데이트됩니다
<form name="form" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> 
    ... 
    <input type="submit" name="Submit" value="Update data"> 
</form> 

합니다. Referer과 같은 것이 있었지만 기억이 안납니다.

BTW 나는 또한 사용하고 있습니다 : 사용자가 뒤로 버튼을 클릭 할 때

if (isset($_POST['Submit'])) { 
    // prevent resending data 
    header("Location: " . $_SERVER['PHP_SELF']); 
} 

은 성가신 재발송 데이터 메시지가 나타나지 않도록 할 수 있습니다. 이 올바른지?

+1

을 방지하는 유효한 방법입니다. 양식은 기본적으로 자체에 제출됩니다. – mercator

+0

그래서

할 것인가 ?? 단! – FFish

+2

예. 그러나 HTML4 또는 XHTML doctype을 사용하고 HTML의 유효성을 검사하려면 속성을 유지해야합니다.'action = ""'할 것입니다. HTML5 doctype을 사용하면 제외 할 수 있습니다. – mercator

답변

3

폼이 제출 된 것을 절대적으로 확신하고 싶다면, 당신이 변수를 저장할 수있는 session :

session_start();  // at top of page 
... 
if (isset($_POST['Submit'])) { 
    $_SESSION['form_submitted'] = true; 
    ... 
    // prevent resending data 
    header("Location: " . $_SERVER['PHP_SELF']); 
} 
elseif ($_SESSION['form_submitted']) 
{ 
    ... 
} 

덜 신뢰할 만 가능 방문자가 와서 어떤 페이지 감지 할 수 $_SERVER['HTTP_REFERER']의 사용이다 에서.

+0

정보 메시지 만 표시하는 경우 리퍼러를 확인하는 것이 좋습니다. – mercator

+0

감사 Jeroen.뭔가 : if (basename ($ _ SERVER [ 'HTTP_REFERER']) == basename ($ _ SERVER [ 'PHP_SELF'])) echo "data updated"; 지금 트릭을 할 것인가? 나는이 페이지가 로그인 시스템 뒤에 있기 때문에 보안에별로 신경 쓰지 않는다. – FFish

+0

@FFish : 그렇게해야 할 일이 있습니다. 그러나 사람들이 동일한 페이지에 대한 링크를 클릭 할 수 있으면 연락처 페이지에서 연락처를 클릭하는 것과 같은 메시지를 받게됩니다. – jeroen

0

당신은 당신이 꽤 많이 사용중인 사용할 수 있습니다

if (isset($_POST['submit'])) { 
    echo "data submitted"; 
} 

은 왜하지?

+1

그는 리다이렉트를하고 있기 때문에 그 리디렉션 이후에 "업데이트 된 데이터"를 표시해야합니다. – mercator

+0

아, 잘못 이해했습니다. 감사합니다 mercator, 사람들이 그 질문을하는 것 이상의 사람들을 도울 때 그것은 좋다, 그래서 그것은 위대한 공동체 다. – dscher

1

"데이터 재전송"메시지를 방지하기 위해 일반적으로 받아 들여지는 방법은 Post-Redirect-Get 패턴을 사용하는 것입니다.

결과를 표시하고 양식을 처리하는 데 같은 페이지를 사용하지 않는 것이 가장 이상적입니다. 양식 유효성 검사가 통과 된 후 리디렉션되는 별도의 페이지로 "업데이트 된 데이터"를 옮길 것을 제안합니다.

이렇게하면 브라우저의 뒤로 버튼이 성가신 메시지가없는 사용자를 위해 직관적으로 동작합니다.

또한 기술적으로 $ reServer "referer"값은 스푸핑 될 수 있으므로 항상 의존하지 않아야합니다.

2

다음과 같이 할 수 있습니다.

a.

if (isset($_POST['Submit'])) { 
    // prevent resending data 
    header("Location: " . $_SERVER['PHP_SELF'] . '?updated=true'); 
} 

B를 (PHP_SELF 이미 쿼리 문자열이 포함되어있는 경우 ** & ** = 사실 업데이트) - 자기로 리디렉션하지만, 정보의 추가 조각 "업데이트 = 사실?". 이 추가 정보에 따라 텍스트를 표시하십시오.

if (isset($_GET['updated'])) { 
    echo "data updated"; 
} 

... 그리고 네, 당신의 리디렉션 resubmision

당신은 당신의 폼의 action 속성을 설정할 필요가 없습니다
+0

고마워요.하지만 이미 var이 있습니다 : admin/photos-edit.php? ref = 002140 그런 식으로 유지하고 싶습니다. – FFish

+0

ok, 대신 '& updated = true'를 추가 할 수 있습니다 (물음표 대신 앰퍼샌드). 결국 admin/photos-edit.php로 끝날 것입니다. ref = 002140 & updated = true – laher

+0

예, 좋은 해결책이지만 URL을 깨끗하게 유지하고 싶습니다. 어쨌든 thnx – FFish

관련 문제