문제

큰 가치가 있다고 생각하지만 제대로 설명되지 않은 튜토리얼을 우연히 발견한 적이 있습니까?그게 내 딜레마야.알아요 이 튜토리얼 가치가 있지만 얻을 수는 없습니다.

  1. 각 함수를 어디서 호출하나요?
  2. 어떤 기능이 먼저 호출되어야하고 다음 세 번째 기능은 무엇입니까?
  3. 애플리케이션의 모든 파일에서 모든 함수가 호출됩니까?
  4. "뒤로 버튼 블루스"를 치료하는 더 좋은 방법을 아는 사람이 있습니까?

이것이 기사 작성자를 포함한 좋은 대화를 불러일으킬 수 있을지 궁금합니다.제가 특히 관심을 갖고 있는 부분은 뒤로 버튼을 눌렀을 때 데이터베이스에 항목이 중복되는 것을 방지하기 위해 뒤로 버튼을 제어하는 ​​것입니다.기본적으로 애플리케이션에서 스크립트를 실행하는 동안 다음 세 가지 함수를 호출하여 뒤로 버튼을 제어하려고 합니다.함수를 정확히 어떤 순서로 호출해야 하는지(위 질문 참조)는 튜토리얼에서 명확하지 않습니다.

내 ScriptNext 함수를 사용하여 모든 전방 이동이 수행됩니다.새 스크립트를 활성화하기 위해 현재 스크립트 내에서 호출됩니다.

function scriptNext($script_id)
// proceed forwards to a new script
{
   if (empty($script_id)) {
      trigger_error("script id is not defined", E_USER_ERROR);
   } // if

   // get list of screens used in this session
   $page_stack = $_SESSION['page_stack'];
   if (in_array($script_id, $page_stack)) {
      // remove this item and any following items from the stack array
      do {
         $last = array_pop($page_stack);
      } while ($last != $script_id);
   } // if

   // add next script to end of array and update session data
   $page_stack[] = $script_id;
   $_SESSION['page_stack'] = $page_stack;

   // now pass control to the designated script
   $location = 'http://' .$_SERVER['HTTP_HOST'] .$script_id;
   header('Location: ' .$location); 
   exit;

} // scriptNext

스크립트가 처리 된 경우 내 ScriptPrevious 기능을 호출하여 종료됩니다.이렇게하면 스택 어레이 끝에서 현재 스크립트가 떨어지고 배열의 이전 스크립트를 다시 활성화합니다.

function scriptPrevious()
// go back to the previous script (as defined in PAGE_STACK)
{
   // get id of current script
   $script_id = $_SERVER['PHP_SELF'];

   // get list of screens used in this session
   $page_stack = $_SESSION['page_stack'];
   if (in_array($script_id, $page_stack)) {
      // remove this item and any following items from the stack array
      do {
         $last = array_pop($page_stack);
      } while ($last != $script_id);
      // update session data
      $_SESSION['page_stack'] = $page_stack;
   } // if

   if (count($page_stack) > 0) {
      $previous = array_pop($page_stack);
      // reactivate previous script
      $location = 'http://' .$_SERVER['HTTP_HOST'] .$previous;
   } else {
      // no previous scripts, so terminate session
      session_unset();
      session_destroy();
      // revert to default start page
      $location = 'http://' .$_SERVER['HTTP_HOST'] .'/index.php';
   } // if

   header('Location: ' .$location); 
   exit;

} // scriptPrevious

스크립트가 활성화 될 때마다 ScriptNext 또는 ScriptPrevious Functions를 통해 또는 브라우저의 뒤로 버튼으로 인해 다음 함수를 호출하여 프로그램 스택 및 프로그램 스택의 내용에 따라 현재 스크립트인지 확인합니다. 그렇지 않은 경우 적절한 조치를 취하십시오.

function initSession()
// initialise session data
{
   // get program stack
   if (isset($_SESSION['page_stack'])) {
      // use existing stack
      $page_stack = $_SESSION['page_stack'];
   } else {
      // create new stack which starts with current script
      $page_stack[] = $_SERVER['PHP_SELF'];
      $_SESSION['page_stack'] = $page_stack;
   } // if

   // check that this script is at the end of the current stack
   $actual = $_SERVER['PHP_SELF'];
   $expected = $page_stack[count($page_stack)-1];
   if ($expected != $actual) {
      if (in_array($actual, $page_stack)) {// script is within current stack, so remove anything which follows
      while ($page_stack[count($page_stack)-1] != $actual ) {
            $null = array_pop($page_stack);
         } // while
         $_SESSION['page_stack'] = $page_stack;
      } // if
      // set script id to last entry in program stack
      $actual = $page_stack[count($page_stack)-1];
      $location = 'http://' .$_SERVER['HTTP_HOST'] .$actual;
      header('Location: ' .$location);
      exit;
   } // if

   ... // continue processing

} // initSession

취한 조치는 현재 스크립트가 프로그램 스택 내에 존재하는지 여부에 따라 다릅니다.세 가지 가능성이 있습니다.

  • 현재 스크립트는 $ page_stack 배열에 있지 않으며,이 경우 계속할 수 없습니다.대신 배열 끝에있는 스크립트로 대체됩니다.
  • 현재 스크립트는 $ page_stack 배열에 있지만 마지막 항목은 아닙니다.이 경우 배열의 모든 다음 항목이 제거됩니다.
  • 현재 스크립트는 $ page_stack 배열의 마지막 항목입니다.이것이 예상되는 상황입니다.모든 라운드를 마신다!
도움이 되었습니까?

해결책

이는 좋은 토론이지만 "Get after Post"라고도 알려진 PRG(Post Redirect Get)를 조사해야 한다는 점에 더 가깝습니다.

http://www.theserverside.com/patterns/thread.tss?thread_id=20936

다른 팁

제 글이 이해가 안 되시면 자세히 읽어보셔야 할 것 같아요 그림 1 이는 사용자가 로그온, 메뉴, 목록, 검색, 추가 및 업데이트 등 일련의 화면을 통과하는 일반적인 시나리오를 보여줍니다.FORWARDS 동작을 설명할 때 새 화면이 활성화되는 동안 현재 화면이 일시 중지된다는 의미입니다.이는 사용자가 현재 화면에서 링크를 누를 때 발생합니다.BACKWARDS로 이동을 설명할 때 사용자가 현재 화면을 종료하고(QUIT 또는 SUBMIT 버튼을 눌러) 이전 화면으로 돌아가서 중단된 부분부터 처리를 다시 시작한다는 의미입니다.여기에는 방금 종료된 화면의 변경 사항을 통합하는 것이 포함될 수 있습니다.

브라우저 기록과 독립적인 페이지 스택을 유지하는 것이 중요합니다. 페이지 스택은 애플리케이션에 의해 유지되며 모든 요청을 확인하는 데 사용됩니다.이는 브라우저에 관한 한 유효할 수 있지만 애플리케이션에 의해 유효하지 않은 것으로 식별되어 그에 따라 처리될 수 있습니다.

페이지 스택은 두 가지 기능으로 유지됩니다.

  • ScriptNext ()는 앞으로의 이동을 처리하는 데 사용되며 스택 끝에 새 항목을 추가하고 새 항목을 활성화합니다.
  • ScriptPrevious ()는 역전 이동을 처리하는 데 사용되며 스택에서 마지막 항목을 제거하고 이전 항목을 다시 활성화합니다.

이제 사용자가 LIST 화면의 4페이지로 이동하여 ADD 화면으로 이동한 다음 LIST 화면의 5페이지로 돌아간 상황을 가정해 보겠습니다.ADD 화면의 마지막 작업은 POST 메서드를 사용하여 데이터베이스에 추가된 세부 정보를 서버로 전송하는 SUBMIT 버튼을 누른 후 자동으로 종료되고 LIST 화면으로 돌아가는 것이었습니다.

따라서 LIST 화면의 5페이지에서 BACK 버튼을 누르면 브라우저 기록이 ADD 화면의 마지막 작업인 POST에 대한 요청을 생성합니다.이는 브라우저에 관한 한 유효한 요청이지만 애플리케이션에 관한 한 유효한 요청은 아닙니다.애플리케이션은 요청이 유효하지 않다고 어떻게 결정할 수 있나요?페이지 스택을 확인하여.ADD 화면이 종료되면 해당 항목이 페이지 스택에서 삭제되므로 페이지 스택에 없는 화면에 대한 요청은 항상 잘못된 것으로 처리될 수 있습니다.이 경우 잘못된 요청은 스택의 마지막 항목으로 리디렉션될 수 있습니다.

따라서 귀하의 질문에 대한 답변은 명확해야 합니다.

  • 큐:각 함수를 어디서 호출하나요?
  • ㅏ:사용자가 새 화면으로의 전달을 선택하고 사용자가 현재 화면을 끝내면 scriptPrevious () 함수를 호출 할 때 scriptNext () 함수를 호출합니다.
  • 큐:어떤 기능이 먼저 호출되어야하고 다음 세 번째 기능은 무엇입니까?
  • ㅏ:각 함수는 사용자가 선택한 작업에 응답하여 호출되므로 한 번에 하나의 기능 만 사용됩니다.
  • 큐:응용 프로그램의 모든 파일에서 모든 기능이 호출됩니까?
  • ㅏ:모든 기능은 응용 프로그램의 모든 파일에서 사용할 수 있어야하지만 사용자가 선택한 경우에만 호출됩니다.

이러한 아이디어가 실제로 실행되는 모습을 보고 싶다면 내 다운로드를 다운로드하세요. 샘플 애플리케이션.

제가 특히 관심을 갖고 있는 부분은 뒤로 버튼을 눌렀을 때 데이터베이스에 항목이 중복되는 것을 방지하기 위해 뒤로 버튼을 제어하는 ​​것입니다.

당신의 전제가 잘못되었습니다.애플리케이션을 웹 애플리케이션으로 디자인하는 경우 "뒤로 버튼 블루스"와 같은 것은 없습니다.서버 측 상태 없이 애플리케이션을 설계하면 첫 번째 경우에 이 문제가 발생하지 않습니다.웹 애플리케이션에 대한 이러한 최소한의 접근 방식은 매우 잘 작동하며 일반적으로 REST라고 알려져 있습니다.

@트로엘스크엔

서버 측 상태 없이 애플리케이션을 디자인하는 경우 ....

상태가 없는 효과적인 애플리케이션을 디자인하는 것은 불가능합니다. 그렇지 않으면 서로 통신하지 않는 개별 페이지 모음만 갖게 됩니다.클라이언트의 상태를 유지하는 데는 문제가 많기 때문에 서버의 상태를 유지하는 것 외에는 효과적인 대안이 없습니다.

@마스턴.

나는 post/redirect/get으로 문제를 해결했지만 튜토리얼에는 약간의 장점이 있고 아마도 Tony Marston이 이에 대해 자세히 설명할 수 있을 것이라고 생각합니다.그리고 그것이 반드시 내 특정 문제가 아니라 아마도 비슷한 문제를 해결하는 데 사용될 수 있는 방법입니다.또는 기능이 실제로 내 특정 문제를 해결하는 데 사용될 수 있다면 게시/리디렉션/가져오기보다 어떻게 더 낫습니까?나는 이것이 여기 커뮤니티에 좋은 보탬이 될 것이라고 생각합니다.

if ($_POST) {
    process_input($_POST);
    header("Location: $_SERVER[HTTP_REFERER]");
    exit;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top