首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >治愈“后按钮蓝”

治愈“后按钮蓝”
EN

Stack Overflow用户
提问于 2009-01-09 00:22:52
回答 6查看 1.5K关注 0票数 2

你有没有偶然发现过一个教程,你觉得它很有价值,但没有很好的解释?这就是我的困境。我知道本教程有一定的价值,但我就是得不到它。

  1. 每个函数在哪里调用?
  2. 应该先调用哪个函数,然后调用哪个函数,哪个函数称为第三个函数?
  3. 会在应用程序中的所有文件中调用所有函数吗?
  4. 有没有人知道更好的治疗“后按钮蓝调”的方法?

我想知道这是否会引起一些好的谈话,包括作者的文章。我特别感兴趣的部分是控制back按钮,以防止在按back按钮时生成重复的条目到数据库中。基本上,您希望在执行应用程序中的脚本时调用以下三个函数来控制back按钮。教程中不清楚按什么顺序调用函数(见上面的问题)。

所有向前移动都是使用我的scriptNext函数执行的。这将在当前脚本中调用,以便激活新脚本。 函数scriptNext($script_id) //继续到一个新脚本{ if (空($script_id)){trigger_error(“脚本id未定义”,E_USER_ERROR);} // if // get列表中使用的该会话中使用的屏幕$page_stack =$_会话‘页面_堆栈’;如果(in_array($script_id,$page_stack)) { //删除此项和堆栈数组中的任何以下项,则执行{ $last = array_pop($page_stack);} while ($last != $script_id);} // if //将下一个脚本添加到数组的末尾,并更新会话数据$page_stack[] = $script_id;$_ session‘’page_堆栈‘= $page_stack;//现在将控制传递给指定的脚本$location =‘$location.$_SERVER’‘HTTP_HOST’.$script_id;标头(‘位置:’.$location);退出;} // scriptNext 当任何脚本完成其处理后,它都会通过调用我的scriptPrevious函数而终止。这将从堆栈数组的末尾删除当前脚本,并重新激活数组中的前一个脚本。 函数scriptPrevious() // go回到以前的脚本(如PAGE_STACK中所定义的){ // get当前脚本$script_id =$_SERVER‘session’;//获取此会话中使用的屏幕列表$page_stack =$_SESSION‘页面_堆栈’;如果(in_array($script_id,$page_stack)) { //删除此项,堆栈数组中的任何项都会执行{ $last = array_pop($page_stack);} while ($last != $script_id);//更新会话数据$_$last_堆栈= $page_stack;} // if (计数($page_stack)> 0) { $previous = array_pop($page_stack);//重新激活以前的脚本$location =‘$page_stack.$_SERVER’‘HTTP_HOST’.$previous;}{ //没有以前的脚本,因此终止会话session_unset();session_destroy();//恢复为默认起始页$location =‘session_unset.$_SERVER’‘HTTP_HOST’.'/index.php';}/ if标头(‘位置:’.$location);退出;} // scriptPrevious 每当一个脚本被激活时(可以通过scriptNext或scriptPrevious函数,或者因为浏览器中的BACK按钮),它将调用以下函数来根据程序堆栈的内容验证它是否是当前脚本,如果不是,则采取适当的操作。 函数initSession() //初始化会话数据{ // get程序堆栈如果(isset($_ session‘’page_堆栈‘)){ //使用现有堆栈$page_stack =$_SESSION’‘page_堆栈’;}{ //创建以当前脚本$page_stack[] =$_page_stack[]‘program’开始的新堆栈;$_SESSION‘’page_堆栈‘= $page_stack;} // if //检查此脚本是否位于当前堆栈$actual =$_SERVER‘current’的末尾;$expected = $page_stackcount($page_stack)-1;if ($expected = $actual) { if (in_array( $actual,$page_stack)) {//脚本在当前堆栈中,因此删除以下任何内容,而($page_stackcount($page_stack)-1 != $actual){ $null = array_pop($page_stack);} //虽然$_SESSION‘’page_堆栈‘= $page_stack;} // if // set脚本id用于在程序堆栈$actual =$page_stackcount($page_stack)-1中的最后一个条目;$location =’$page_stack。$_SERVER‘’HTTP_HOST‘.$actual;标题(’位置:‘.$location);退出;} // if . //继续处理} // initSession 所采取的操作取决于当前脚本是否存在于程序堆栈中。有三种可能性:

  • 当前脚本不在$page_stack数组中,在这种情况下不允许继续。相反,它被替换为位于数组末尾的脚本。
  • 当前脚本位于$page_stack数组中,但它不是最后一个条目。在这种情况下,将删除数组中的所有以下条目。
  • 当前脚本是$page_stack数组中的最后一个条目。这是预期的情况。全喝一杯!
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-01-09 00:41:08

这是一个很好的讨论,但更多的一点,你应该研究的邮政重定向Get (PRG),也称为“得到后邮报”。

id=20936

票数 9
EN

Stack Overflow用户

发布于 2009-01-10 09:02:00

如果您不理解我的文章,那么您应该仔细看看图1,它描述了一个典型的场景,用户通过一系列屏幕-登录、菜单、列表、搜索、添加和更新。当我描述向前移动时,我的意思是当前屏幕被挂起,而新屏幕被激活。当用户按下当前屏幕中的链接时,就会发生这种情况。当我将一个动作描述为向后移动时,我的意思是用户终止当前屏幕(按下“退出”或“提交”按钮)并返回到前一个屏幕,该屏幕从它停止的位置恢复处理。这可能包括包含刚刚终止的屏幕中所做的任何更改。

这是维护独立于浏览器历史记录的页面堆栈的关键所在--页面堆栈由应用程序维护,用于验证所有请求。就浏览器而言,这些方法可能是有效的,但应用程序可以将其标识为无效并相应处理。

页面堆栈由两个函数维护:

  • scriptNext()用于处理向前移动,它在堆栈末尾添加一个新条目并激活新条目。
  • scriptPrevious()用于处理向后移动,它从堆栈中移除最后一个条目并重新激活前一个条目。

现在举个例子,用户已经导航到列表屏幕的第4页,进入添加屏幕,然后返回到列表屏幕的第5页。添加屏幕中的最后一个操作是按SUBMIT按钮,该按钮使用POST方法向添加到数据库的服务器发送详细信息,然后自动终止并返回到列表屏幕。

因此,如果在列表屏幕第5页中按后退按钮,浏览器历史记录将为添加屏幕上的最后一个操作(即POST )生成一个请求。对于浏览器来说,这是一个有效的请求,但对于应用程序则不是这样。应用程序如何确定请求无效?通过检查它的页面堆栈。当添加屏幕被终止时,它的条目被从页面堆栈中删除,因此,对页面堆栈中不存在的屏幕的任何请求都可以被视为无效。在这种情况下,无效请求可以重定向到堆栈中的最后一个条目。

因此,你的问题的答案应该是显而易见的:

  • 问:你把每个函数都称为哪里?
  • 答:当用户选择前进到新屏幕时调用scriptNext()函数,当用户终止当前屏幕时调用scriptPrevious()函数。
  • 问:应该先调用哪个函数,然后调用哪个函数,哪个函数称为第三个函数?
  • 答:每个函数都是响应用户选择的操作调用的,因此一次只使用一个函数。
  • 问:应用程序中的所有文件中都会调用所有函数吗?
  • 答:所有函数都应该在应用程序中的所有文件中可用,但只有在用户选择时才能调用。

如果您希望看到这些想法付诸实施,那么您可以下载我的样本应用

票数 3
EN

Stack Overflow用户

发布于 2009-01-09 21:34:18

我特别感兴趣的部分是控制back按钮,以防止在按back按钮时生成重复的条目到数据库中。

你的前提是错误的。如果您将应用程序设计为web应用程序,则没有"Back Button Blues“这样的东西。如果您在设计应用程序时没有任何服务器端状态,那么在第一种情况下您将不会遇到这个问题。这种极简式的web应用程序方法工作得非常好,通常被称为REST。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/426620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档