【问题标题】:How do I control flow of PHP multi-page form?如何控制 PHP 多页表单的流程?
【发布时间】:2010-09-10 10:41:30
【问题描述】:

我有点 PHP 新手 我开发了一个多页表单,目前可以正常工作 - 每个阶段都在另一个页面上(我使用会话来保留数据)。 但是我知道用户并不总是按照您想要的方式使用这些表单!

我想控制表单的流程。

  • 我希望用户能够使用浏览器的后退和前进按钮以方便使用。
  • 他们不应该通过直接在地址栏中输入表单阶段 URL 来跳过表单的一部分以获取表单的后续阶段(本质上是跳过表单的一部分)。

  • 表单也不会每次都流相同的路径,这取决于用户选择接下来显示什么阶段。

我想知道是否有人对控制这种多页表单的流程有任何想法,谢谢!

【问题讨论】:

  • 为什么不在用于保留数据的同一会话中保存进度?
  • 尽可能使用ajax

标签: php forms controls


【解决方案1】:

将表单结果存储在 SESSIONS 中(如果敏感,则对其进行加密)

然后只需检查每个表单是否设置了值并在必要时显示它。

使用另一个会话来检查表单的“进度”,以防止用户跳过。 比如……

<?php
  /* on form 3 */
    if(isset($_SESSION['progress'] && $_SESSION['progress']==2)
    {
       //the second form has been filled out and validates
    }
    else
    {
      // the 2nd form hasn't been finished, redirect
    }
?>

您还可以在会话中使用基于百分比的系统 - 值 90 表示 90% 的表单字段已完成 - 以可视方式向用户显示“进度”。

基本上在每次提交表单时,检查提交的内容,如果符合预期,然后设置适当的会话以重定向到下一阶段。

检查每个表单上的每个设置会话以确定用户是否应该在这里。

【讨论】:

  • 这是一个非常糟糕的主意。会话应该只保存会话数据——存储事务数据只是自找麻烦。尝试处理虚拟会话/多个浏览器时,您会陷入困境。
  • 我没想到这一点(显然!)。取点
  • @symcbean 这样的表单应该只有单个实例。在会话中存储这样的事务并没有什么不好。
  • “用户并不总是按照你想要的方式使用这些表单”
【解决方案2】:

将非当前字段的数据推送到浏览器中的隐藏字段中(以节省时间和精力 - 只需序列化数组/对象)。

【讨论】:

  • 不确定我应该赞成还是反对,所以我会通过。使用隐藏字段是一个可行的选择。序列化东西并放在那里是个坏主意。
  • @troelskn OP 说过users don't always use these forms the way you want - 这很清楚。愚蠢的隐藏字段不是一种选择
  • @shrapnel 我不确定隐藏字段会以何种方式变得愚蠢?
  • 我只是建议对用户提交的数据进行序列化——在用于任何事情之前仍应对其进行验证。当用户直接与之交互的不是数据时,使用序列化值只是节省了编写大量隐藏字段的工作。
  • 如果您认为这会损害应用程序的完整性,那么请说明原因。
【解决方案3】:

我希望用户能够使用浏览器的后退和前进按钮

如果允许用户重新进入之前的阶段,只需让他们在会话中重写当前阶段即可。
如果不是,请将表单字段设为只读,并且不处理之前阶段提交的表单。

这是我在这里看到的唯一问题。

【讨论】:

    【解决方案4】:

    您可以使用会话数据来保留多个页面之间的状态,也可以传输每个页面上的所有数据。通常,您会使用隐藏字段执行后者,或者您将创建一个巨大的表单,并使用 javascript 使其看起来好像是多个页面,而实际上并非如此。

    每种解决方案各有利弊。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多