문제

나는 항상 사용합니다 게시/리디렉션/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를 직렬화하고 쿼리 문자열에 넣을 수 있습니다 (헤더를 통해 전송됩니다 ()

다른 팁

세션에서 상태를 저장하지 않고는 이것을 피할 수있는 방법이 없습니다. 오류가 발생하면 다음과 같은 작업을 수행 할 수 있습니다.

  1. 고유 한 ID를 생성하십시오
  2. 복사 $_POST 위의 고유 ID로 키워진 세션에 변수
  3. 지금처럼 리디렉션하지만 쿼리 문자열의 일부로 고유 ID를 전달하십시오.
  4. 액세스하는 대신 세션 (오류 상황) 에서이 고유 한 ID를 찾도록 라이브러리를 업데이트합니다. $_POST 변수 직접, 고유 ID가 요청에 전달되지 않았거나 찾고있는 이름이 존재하지 않으면 기본값을 사용하십시오.
  5. 요청이 끝나면 세션에서 고유 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', ''); ?>" />

당신도 원할 수도 있습니다 이 튜토리얼을 읽으십시오.

당신은 기본적으로 제대로하고 있습니다. "다시 게시"경고를 피하는 방법은 특별한 방법이 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top