【问题标题】:PHP quiz send data to next pagePHP quiz 发送数据到下一页
【发布时间】:2009-11-02 00:13:03
【问题描述】:

好的,我正在尝试做一个测验……现在一切都很好。但是当我试图通过页面发送收集的数据(单选按钮值)时,我无法获得逻辑流程。我有主要想法,但我不能付诸实践。

  1. 我想收集所有单选值
  2. 创建一个包含这些值的数组
  3. 序列化数组
  4. 将序列化数组放入隐藏输入中

问题是我想通过 $_SERVER['PHP_SELF'] 在同一页面上发送数据,但我不知道什么时候可以做这些事情。(因为我有测验的“第一页”什么都没有收到,然后在“下一页”上我收到 S_POST['radio_names'] 并且在第二页之后我可以得到隐藏的输入)。我希望我能理解自己(即使是我也很难理解我的问题是什么:D)

【问题讨论】:

  • 标签不是句子:o

标签: php post webforms


【解决方案1】:

您可以尝试改用$_SESSION 对象...对于测验的每一页,将结果存储在$_SESSION 数组中。在摘要页面上,使用它来显示您的结果。

要做到这一点,在每一页的开头,你可以这样写:

<?
    session_start();
    foreach ($_POST as $name => $resp) {
      $_SESSION['responses'][name] = $resp;
    }
?>

然后,在最后一页,您可以遍历所有结果:

<?
    session_start();
    foreach ($_SESSION['responses'] as $name => $resp) {
      // validate response ($resp) for input ($name)
    }
?>

【讨论】:

  • 我不想使用会话(安全和主机提供商原因)
  • 我知道如何使用会话...但我不想
  • 您有什么安全问题?您的提供商以何种方式禁止使用会话?
  • 我不知道为什么......但这就是我所知道的......他们已经关闭了 register_globals 并且我不允许使用 .htaccess 修改它们
  • 我认为您不明白关闭 register_globals 意味着什么。您仍然可以使用 $_SESSION、$_POST、$_GET、$_REQUEST、$_SERVER 等。
【解决方案2】:

这样命名您的表单字段:

<input type="radio" name="quiz[page1][question1]" value="something"/>
...
<input type="hidden" name="quizdata" value="<?PHP serialize($quizdata); ?>"/>

那么当你处理时:

<?PHP
//if hidden field was passed, grab it.
if (! empty($_POST['quizdata'])){
    $quizdata = unserialize($_POST['quizdata']);
}

// if $quizdata isn't an array, initialize it.
if (! is_array($quizdata)){
    $quizdata = array();
}

// if there's new question data in post, merge it into quizdata
if (! empty($_POST)){
    $quizdata = array_merge($quizdata,$_POST['quiz']);
}

//then output your html fields (as seen above)

【讨论】:

  • 我认为这是遗漏的(即 is_array 的东西)......嗯,让我再试一次
  • 但是如果一个数组被序列化了is_array仍然返回true?
【解决方案3】:

作为另一种方法,您可以向每个“页面”添加一个字段并跟踪您的位置。然后,在页面顶部的处理程序中,您将知道哪些输入是有效的:

<?
  if (isset($_POST['page'])) {
    $last_page = $_POST['page'];
    $current_page = $last_page + 1;
    process_page_data($last_page);
  } else {
    $current_page = 1;
  }
?>

...稍后在页面上...

<? display_page_data($current_page); ?>
<input type="hidden" name="page" value="<?= $current_page ?>" />

在此示例中,process_page_data($page) 将处理读取给定页码所需的所有输入数据,display_page_data($page) 将向用户显示给定页码的有效问题。

您可以进一步扩展它并创建类来表示页面,但这可能会让您知道从哪里开始。使用这种方法,您可以将所有数据处理保留在同一个 PHP 脚本中,并使数据可用于同一脚本中的其他函数。

【讨论】:

    【解决方案4】:

    您想使用诸如

    之类的流程
    if (isset $_POST){
        //do the data processing and such 
        }
    else {
    /show entry form
    }
    

    这是我所知道的保持在同一页面上并接受数据的最直接的方式。

    【讨论】:

    • 但我不能依赖它,因为 isset($_POST) 将从第一页返回 true...因为这就是我获得所选测验的方式(通过 post 方法我发送测验id 到第一页...知道要加载什么测验)
    • 然后说 isset($_POST['quizentryitem']) 或 post 数组的其他一些唯一成员
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多