게시물/리디렉션/get 패턴 구현의 문제
-
16-09-2019 - |
문제
나는 항상 사용합니다 게시/리디렉션/get 내 양식에 대한 방법. 내 양식은 일반적으로 항상 스스로를 제출합니다. 그러나 양식에 오류가 발생하면 새 헤더를 보내지 않습니다. 이것은 내가 이런 일을 쉽게 할 수 있도록
<input type="text" name="email" value="<?php echo $this->input->post('email', '') ?>" />
PHP는 2 인수, $ _post 키 및 기본값이없는 경우 라이브러리 함수 일뿐입니다.
이것은 누군가가 양식으로 오류를하는 경우 두 번째 양식을 보충 할 필요가 없다는 것을 의미합니다. 단점은 페이지를 다시로드하면 브라우저에서 게시물 경고를 제공한다는 것입니다.
어쨌든 상태 (예 : 쿠키, 세션, 데이터베이스 등)를 사용하지 않고 이것을 피할 수 있습니까?
해결책
이 작업을 수행하는 가장 좋은 방법은 헤더 기능을 사용하는 것입니다. 당신은 당신이 필요한 파일 자체에 게시 할 수 있습니다. 유효성 검사를 수행 한 다음 헤더 리디렉션을 사용하여 실패한 경우 양식으로 돌아갑니다. 세션 또는 다른 액세스 가능한 변수에 Post'd 값을 저장하므로 이전에 입력 한 데이터에 액세스 할 수 있습니다.
헤더를 사용할 때 ( "위치 : myscript.php"); exit ()를 포함 시키십시오. 그 후에는 여전히 새로 고침에 대한 게시물 경고를 받게됩니다.
myscript.php
if($_POST['submit'])
{
//check for errrors
if ($error)
{
$_SESSION['myPostVars'] = $_POST;
header("location: myscript.php");
exit();
}
}
<form>
// your form code
</form>
편집 : 방금 세션 사용을 피하기 위해 질문을 편집 한 것을 알았습니다.
반환하려는 Post vars를 직렬화하고 쿼리 문자열에 넣을 수 있습니다 (헤더를 통해 전송됩니다 ()
다른 팁
세션에서 상태를 저장하지 않고는 이것을 피할 수있는 방법이 없습니다. 오류가 발생하면 다음과 같은 작업을 수행 할 수 있습니다.
- 고유 한 ID를 생성하십시오
- 복사
$_POST
위의 고유 ID로 키워진 세션에 변수 - 지금처럼 리디렉션하지만 쿼리 문자열의 일부로 고유 ID를 전달하십시오.
- 액세스하는 대신 세션 (오류 상황) 에서이 고유 한 ID를 찾도록 라이브러리를 업데이트합니다.
$_POST
변수 직접, 고유 ID가 요청에 전달되지 않았거나 찾고있는 이름이 존재하지 않으면 기본값을 사용하십시오. - 요청이 끝나면 세션에서 고유 ID 항목을 제거합니다. 이로 인해 너무 많은 쓰레기로 세션을 오염시킬 수 있습니다. 라이브러리에 따라 요청의 시작 부분 에서이 작업을 수행 할 수도 있습니다.
나는 당신이 다음과 같은 것을 의미한다고 생각합니다.
function Value($array, $key, $default = false)
{
if (is_array($array) === true)
{
settype($key, 'array');
foreach ($key as $value)
{
if (array_key_exists($value, $array) === false)
{
return $default;
}
$array = $array[$value];
}
return htmlspecialchars($array);
}
return $default;
}
<input type="text" name="email" value="<?= Value($_POST, 'email', ''); ?>" />
당신도 원할 수도 있습니다 이 튜토리얼을 읽으십시오.
당신은 기본적으로 제대로하고 있습니다. "다시 게시"경고를 피하는 방법은 특별한 방법이 없습니다.