在来回网页时填写表单字段

时间:2011-05-03 21:10:11

标签: php html forms session

我环顾四周(这里是stackoverflow和谷歌)但我似乎无法弄清楚为什么我的表格价值在我倒退然后转发网络调查时消失了。我有三页我正在试验。如果我通过调查回答每个问题,然后返回,则保留值。但是,如果我在第一页上重新回答问题并按提交,我的第二页和第三页的值将不再填写。但是,顶部列出的阵列仍然显示它。表单中的PHP代码本身是否应该重新填充会话数组中的值,直到用户更改它们为止?

我也知道我用于将所有POST值存储到会话中的方法很危险,但我打算只将它写入一个普通的.txt文件。谢谢你的帮助!

第1页

<?php
// begin the session
ini_set('session.cache_limiter', 'private');
session_start();
// Take each input name and create a variable for it
foreach($_POST as $k=>$v) {
$_SESSION[$k]=$v;
}
?>
<html>
<head>
<title>This is a test</title>
</head>
<body>
<form method="POST" name="Gender" action="page2.php">
<p>What is your gender?</p>
<input type="radio" name="gender" value="male" id="male" <?php if (isset($_SESSION['male'])) { echo 'checked="checked"'; } else { echo $gender = ''; } ?>> <label for="male">Male</label> <br />
<input type="radio" name="gender" value="female" id="female" <?php if (isset($_SESSION['female'])) { echo 'checked="checked"'; } else { echo $gender = ''; }?>> <label for="female">Female</label><br />

<input type="submit">
</form>
</body>
</html>

第2页

<?php
// begin the session
ini_set('session.cache_limiter', 'private');
session_start();
// Take each input name and create a variable for it
foreach($_POST as $k=>$v) {
$_SESSION[$k]=$v;
}
// Prints out the session array
print('<input type="hidden" name="' . $k . '" value="' . $v . '" />'); 
Print_r ($_SESSION);
?>
<html>
<head>
<title>This is a test</title>
</head>
<body>
<form method="POST" name="lolz" action="page3.php">
<p>What is your lolz?</p>
<input type="radio" name="lolz" value="YesLOLZ" id="YesLOLZ" <?php if (isset($_SESSION['YesLOLZ'])) { echo 'checked="checked"'; } else { echo $lolz = ''; } ?>> <label for="YesLOLZ">YesLOLZ</label> <br />
<input type="radio" name="lolz" value="NoLOLZ" id="NoLOLZ" <?php if (isset($_SESSION['NoLOLZ'])) { echo 'checked="checked"'; } else { echo $lolz = ''; } ?>> <label for="NoLOLZ">NoLOLZ</label><br />

<input type="submit">
</form>
</body>
</html>

第3页

<?php
// begin the session
ini_set('session.cache_limiter', 'private');
session_start();
// Take each input name and create a variable for it
foreach($_POST as $k=>$v) {
$_SESSION[$k]=$v;
}
// Prints out the session array
print('<input type="hidden" name="' . $k . '" value="' . $v . '" />'); 
Print_r ($_SESSION);
?>
<html>
<head>
<title>This is a test</title>
</head>
<body>
<form method="POST" name="lolz" action="page3.php">
<p>What is your roflz?</p>
<input type="checkbox" name="roflz[]" value="Yesroflz" id="Yesroflz" <?php if (isset($_SESSION['Yesroflz'])) { echo 'checked="checked"'; } else { echo ''; } ?>> <label for="Yesroflz">Yesroflz</label> <br />
<input type="checkbox" name="roflz[]" value="Noroflz" id="Noroflz" <?php if (isset($_SESSION['Noroflz'])) { echo 'checked="checked"'; } else { echo ''; } ?>> <label for="Noroflz">Noroflz</label><br />

<input type="submit">
</form>
</body>
</html>

3 个答案:

答案 0 :(得分:2)

您的会话无法正常运行,因为标头已经发送过了。您正在session_start语句之前输出html,如果您想使用会话,则无法执行此操作。

只需将html标记向下移动到第一个php块下方,并确保在打开php标记之前没有空格或换行符。

编辑:根据您的评论,我认为您需要在表单的所有php文件的开头执行以下操作:

  1. 开始并阅读会话
  2. 阅读$_POST值并在$_SESSION变量中添加/覆盖它们(会话现在包含新发布的和以前发布的信息)
  3. 在您设置值的表单中使用$_SESSION而不是$_POST个变量,因此:
    <?php if (isset($_SESSION['YesLOLZ'])) { echo 'checked="checked"'; }
    而不是:
    {{ 1}}
  4. 另请注意,<?php if (isset($_POST['YesLOLZ'])) { echo 'checked="checked"'; }循环之外的变量$k$v并不真正存在;它们确实存在,但包含最后while变量的信息,可能是发送按钮,因此您无法真正使用它们。

答案 1 :(得分:0)

问题是您要在会话中存储答案,但在想要查看是否应自动填写某个输入时不要检查答案。 post值不是持久的,所以如果你返回并从第一页重新开始测验,那么只有第一页的值将在post变量中。当您提交第二页时,实际上您在第一页的POST中丢失了所有内容,但由于您将其存储在会话中,因此您仍然可以访问它。

答案 2 :(得分:0)

如果这不起作用,请截取/复制+粘贴显示在print_r($_SESSION);&amp;报告您获得的任何PHP错误,即使它们只是通知级别。

到目前为止,您已完成以下操作:

  • 启动会话必须是页面上第一个成功的事情。您应该收到错误警告:session_start()[function.session-start]:无法发送会话cookie - 已经发送的标头...通过移动session_start(),这已得到修复。
  • 您正在每页上将$ _POST数组复制到$ _SESSION。
  • 您确保在检查值时始终使用$ _SESSION超全局而不是$ _POST超全局。

现在你需要:

  • 确保使用foreach循环和相应的变量名称输出隐藏的输入。您应该收到一条错误,上面写着注意:未定义的变量:第9行中的k ......等等。
  • 确保在检查字段值时使用正确的数组键。 $ _POST(以及$ _SESSION)数组中的键将与name的{​​{1}}属性匹配,而值将与input的{​​{1}}属性匹配。< / LI>

如果您没有遇到任何这些错误,请尝试将value添加到第5行(input之后)。此行应仅在开发期间使用,并在您发布代码时取出。

Page 1

error_reporting(E_ALL);

第2页

session_start();

第3页

<?php
    // begin the session
    ini_set('session.cache_limiter', 'private');
    session_start();
    // Take each input name and create a variable for it
    foreach($_POST as $k=>$v) {
        $_SESSION[$k]=$v;
    }
    // Prints out the session array
    print_r($_SESSION);
?>
<html>
<head>
    <title>This is a test</title>
</head>
<body>
    <form method="POST" name="Gender" action="page2.php">
        <p>
            What is your gender?
        </p>
        <input type="radio" name="gender" value="male" id="male" <?php if (isset($_SESSION['gender']) && $_SESSION['gender'] == "male") { echo 'checked="checked"'; } ?>>
        <label for="male">
            Male
        </label>
        <br />
        <input type="radio" name="gender" value="female" id="female" <?php if (isset($_SESSION['gender']) && $_SESSION['gender'] == "female") { echo 'checked="checked"'; } ?>>
        <label for="female">
            Female
        </label>
        <br />
        <input type="submit">
    </form>
</body>
</html>