曾经偶然发现了一个你觉得很有价值的教程,但却没有得到很好的解释?那是我的困境.我知道这个教程有一些价值,但我无法得到它.
你在哪里称呼每个功能?
应首先调用哪个函数,然后调用哪个函数,以及哪个函数?
是否会在应用程序的所有文件中调用所有函数?
有谁知道一个更好的方法来治愈"Back Button Blues"?
我想知道这是否会引起包括文章作者在内的一些好的对话.我特别感兴趣的部分是控制后退按钮,以防止在按下后退按钮时将重复条目复制到数据库中.基本上,您希望在应用程序中执行脚本期间通过调用以下三个函数来控制后退按钮.从教程中可以清楚地知道调用函数的顺序(参见上面的问题).
使用我的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函数,或者由于浏览器中的BACK按钮,它将调用以下函数来根据程序堆栈的内容验证它是当前脚本如果不是,采取适当的行动.
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数组中的最后一个条目.这是预期的情况.全是饮料!
BobbyShaftoe.. 9
这是一个很好的讨论,但更重要的是你应该考虑Post Redirect Get(PRG),也称为"Get after Post".
http://www.theserverside.com/patterns/thread.tss?thread_id=20936
这是一个很好的讨论,但更重要的是你应该考虑Post Redirect Get(PRG),也称为"Get after Post".
http://www.theserverside.com/patterns/thread.tss?thread_id=20936