【问题标题】:Multi-page PHP Form With back Button issue带有后退按钮问题的多页 PHP 表单
【发布时间】:2016-05-31 14:23:27
【问题描述】:

我创建了一个多页 PHP 表单,将结果插入 MySQl 数据库并且工作正常,唯一的问题是当我尝试返回时,我得到“确认表单重新提交”“ERR_CACHE_MISS”错误页面。

Php 不是我最擅长的语言,需要一些帮助来修复它。

这是一个 20 页的调查,每页都有单选按钮,可选择 1 到 10。

下面是我的代码示例,任何建议都会很棒。

干杯

<?php session_start();
$_SESSION['answer_04'] = $_POST['answer_04'];
?>

<form action="peem-05.php" id="peem" method="post">

<ul class="answers">
    <li class="group1"><input type="radio" id="radio1" name="answer_05" value="1" data-msg-required="Please choose an answer bewteen 1 and 10" required><label for="radio1"><br>1</label></li>
    <li class="group1"><input type="radio" id="radio2" name="answer_05" value="2" required><label for="radio2"><br>2</label></li>
    <li class="group2"><input type="radio" id="radio3" name="answer_05" value="3" required><label for="radio3"><br>3</label></li>
    <li class="group2"><input type="radio" id="radio4" name="answer_05" value="4" required><label for="radio4"><br>4</label></li>
    <li class="group3"><input type="radio" id="radio5" name="answer_05" value="5" required><label for="radio5"><br>5</label></li>
    <li class="group3"><input type="radio" id="radio6" name="answer_05" value="6" required><label for="radio6"><br>6</label></li>
    <li class="group4"><input type="radio" id="radio7" name="answer_05" value="7" required><label for="radio7"><br>7</label></li>
    <li class="group4"><input type="radio" id="radio8" name="answer_05" value="8" required><label for="radio8"><br>8</label></li>
    <li class="group5"><input type="radio" id="radio9" name="answer_05" value="9" required><label for="radio9"><br>9</label></li>
    <li class="group5"><input type="radio" id="radio10" name="answer_05" value="10" required><label for="radio10"><br>10</label></li>
</ul>


<a href="javascript:history.back(1)"><img class="backButton" src="img/back-button.png"/></a>

<button class="rightArrow" name="submit" type="submit" value="Next" ><img class="backButton" src="img/next-button.png"/></button>
</form>

【问题讨论】:

  • 不要使用历史记录返回。最好将所有信息保存到会话并使用一些 UID 来识别表单。返回意味着重新访问同一页面,而不是返回浏览器历史记录。我认为浏览器可能会在您提交表单后删除您的表单页面缓存。
  • 嗨贾斯蒂纳斯,感谢您的回复。我不认为你能指出我正确使用代码的方向吗?
  • 请浏览对您有帮助的链接。 Stackoverflow answer
  • 感谢大家的反馈,这非常有帮助

标签: php mysql forms session multipage


【解决方案1】:

您最好将数据保存到 PHP 会话中,而不是使用 javascript:history.back(1),然后返回意味着重新访问同一页面。

[save.php]

$step = $_POST['formStep'];
$formData = $_POST['Form'][$step]; // all values from form
$formID = $_POST['formID']; // validate

if ($formData && $step) {
    if ($step < $maxSteps) {
        $_SESSION[$formID][$step] = $formData;

        $this->showStep($step++);
    } else {
        $this->db->saveForm($_SESSION[$formID]);
    }
}

[showStep.php]

$step = isset($_REQUEST['step']) ? $_REQUEST['step'] : 1;
$formID = isset($_SESSION['formID']) ? $_SESSION['formID'] : rand(0, 99);
$formData = isset($_SESSION[$formID][$step]) ? $_SESSION[$formID][$step] : [];
?>
<form action="save.php?step=<?= $step; ?>">
    <input type="hidden" value="<?= $formID; ?>" name="formID"/>
    <?php switch ($step): ?>
<?php case 1: ?>
      <input type="radio" id="radio10" name="Form[<?= $formID; ?>][<?= $step; ?>][answer_05]" value="10" <?= isset($formData['answer_05']) ? 'checked="checked"' : ''; ?>/>
<?php case 20: ?>
      ...
<?php break; ?>
</form>
<a href="showStep.php?step=<?= $step - 1; ?>">Back</a>

【讨论】:

    【解决方案2】:

    请注意,您必须重命名您的 peem-x.php 文件,删除零才能使该代码正常工作。我评论了我的更改,也许这对你有帮助。

    <?php
    session_start();
    
    $page = basename(__FILE__); // get current filename
    $page = preg_replace("/[^0-9]/","",$page); // remove everything except numbers
    $page_last = "peem-".($page-1).""; // calculate last page name
    $page_now = "peem-".$page.""; // current page name
    
    for ($i = 0; $i < count($_POST['answer']); $i++) { // loop for total count of answers selected
        $_SESSION['page'.$page_now.'']['answer'.$i.''] = $_POST['answer'.$i.''];  // assign session to answer
    }
    ?>
    
    <form action="" id="peem" method="post">
    
        <ul class="answers">
            <li>Please choose an answer between 1 and 10</li>
            <?php
            for ($i = 1; $i < 10; $i++) {
                // check every loop if it's the current page and current answer that has been checked before
                // if so, set a variable to mark it as checked
                if ($_SESSION['page'] == $page_now && $_SESSION['page']['answer'.$i.''] == 'page'.$page_now.'answer'.$i.'')
                {
                    $checked = " checked"; // create var to check current answer in loop
                }
    
                echo '<li class="group1"><input type="radio" id="radio1" name="answer' . $i . '" value="1"'.$checked.'><label for="radio' . $i . '"><br>' . $i . '</label></li>';
                unset($checked); // unset $checked var for next loop to avoid checking unchecked radio buttons
            }
            ?>
        </ul>
    
    
        <a href="-<?php echo $page_last; ?>.php"><img class="backButton" src="img/back-button.png"/></a>
    
        <button class="rightArrow" name="submit" type="submit" value="Next" ><img class="backButton" src="img/next-button.png"/></button>
    </form>
    
    <?php
    // test session and post variables
    echo "<pre>";
    print_r($_POST);
    print_r($_SESSION);
    echo "</pre>";
    ?>
    

    【讨论】:

    • 嗨 Vaia,感谢您的代码更新,但是当我返回一个页面时,我没有收到错误消息,但我选择的单选按钮不再被选中。有什么想法吗?
    • 那是因为你只能从上次提交的$_POST 数据中获取数据(下一个按钮)。因此,您必须检查 $_SESSION 变量,您在其中保存了该特定页面的所有答案,并标记了变量中检查的每个答案。在这种情况下,我还将您现在所在的当前页面连同已检查的答案一起保存在变量中。你可以跟着我自己尝试一下还是需要帮助?
    • 哦,好的,谢谢,对不起,我的 PHP 知识不是很好。我很快就会试一试,让你知道我是怎么走的。干杯
    • @Phil Hey,所以我编辑了我的答案,应该检查用户之前检查过的答案。我将当前页面保存在一个多维数组中,这样系统就知道用户现在在哪里。我还评论了这些行以帮助您更好地理解它。如果我帮助了你,我将不胜感激将我的答案标记为正确。
    猜你喜欢
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多