非常に価値があると思われるチュートリアルに出くわしたことがありますが、適切に説明されていませんか? それが私のジレンマです。このチュートリアルには何らかの価値があることは知っていますが、それを得ることができません。
- 各関数をどこで呼び出しますか?
- どの関数を最初に呼び出し、次にどの関数を呼び出し、どの関数を 3 番目に呼び出す必要がありますか?
- アプリケーション内のすべてのファイルですべての関数が呼び出されますか?
- 「Back Button Blues」を治すより良い方法を知っている人はいますか?
これが記事の著者を含めて良い会話を巻き起こすかどうか疑問に思っています. 私が特に興味を持っている部分は、戻るボタンが押されたときにデータベースへのフォームの重複エントリを防ぐために、戻るボタンを制御することです。基本的には、アプリケーションでスクリプトの実行中に次の 3 つの関数を呼び出して、戻るボタンを制御します。関数を呼び出す正確な順序 (上記の質問を参照) は、チュートリアルからは明らかではありません。
すべての前方移動は、私の 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 関数を介して、またはブラウザの [戻る] ボタンによってスクリプトがアクティブ化されるたびに、次の関数が呼び出され、プログラム スタックの内容に従って現在のスクリプトであることを確認します。そうでない場合は、適切なアクションを実行します。
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
実行されるアクションは、現在のスクリプトがプログラム スタック内に存在するかどうかによって異なります。次の 3 つの可能性があります。
- 現在のスクリプトは $page_stack 配列にありません。この場合、続行できません。代わりに、配列の最後にあるスクリプトに置き換えられます。
- 現在のスクリプトは $page_stack 配列にありますが、最後のエントリではありません。この場合、配列内の後続のすべてのエントリが削除されます。
- 現在のスクリプトは、$page_stack 配列の最後のエントリです。これは予想される状況です。オールラウンドドリンク!