使用PHP Session存储表单数据

时间:2011-11-10 18:33:44

标签: php html forms session

我正在处理一个HTML表单,其数据将保存在失败的提交或页面刷新上。

我们正在使用PHP会话来存储这些数据,并在需要时将元素发回。

问题在于它不起作用。我们需要在包含错误或页面刷新的提交中保留表单数据。目前,在提交失败或页面刷新时,会话中不存储任何数据。

我对PHP很新,而且大部分代码都不是我的,所以请放轻松。

使用的PHP Sumbit代码是:

Software: PHPMailer - PHP email class                                    
Version: 5.0.2                                                          
Contact: via sourceforge.net support pages (also www.codeworxtech.com)  
Info: http://phpmailer.sourceforge.net                               
Support: http://sourceforge.net/projects/phpmailer/  

会话:

<?php

session_name("fancyform");
session_start();

$str='';
if($_SESSION['errStr'])
{
$str='<div class="error">'.$_SESSION['errStr'].'</div>';
unset($_SESSION['errStr']);
}

$success='';
if($_SESSION['sent'])
{
$success='<div class="message-sent"><p>Message was sent successfully. Thank you!  </p></div>';

$css='<style type="text/css">#contact-form{display:none;}</style>';

unset($_SESSION['sent']);
}
?>

FORM:

<form id="contact-form" name="contact-form" method="post" action="submit.php">
<p><input type="text" name="name" id="name" class="validate[required]"     placeholder="Enter your first and last name here" value="<?=$_SESSION['post']['name']?>" /></p>
<p><input type="text" name="email" id="email" class="validate[required,custom[email]]" placeholder="Enter your email address here" value="<?=$_SESSION['post']['email']?>" /></p>
<p><input type="text" name="phone" id="phone" placeholder="Enter your phone number here" value="<?=$_SESSION['post']['phone']?>" /></p>
<p>
<select name="subject" id="subject">
<option>What event service are you primarily interested in?</option>
<option>Event Creation</option>
<option>Project Management</option>
<option>Promotion</option>
</select>
</p>
<textarea name="message" id="message" class="validate[required]" placeholder="Please     include some details about your project or event..."><?=$_SESSION['post']['message']?>    </textarea>
<input type="submit" value="" />
</form>

5 个答案:

答案 0 :(得分:1)

您正在向模板输出$_SESSION['post']['form_element'],但在上面的PHP代码中没有提及设置该数据。要使其工作,您必须循环遍历$ _POST数组并将每个密钥对分配给$ _SESSION ['post']

此时,您应该能够像上面编码一样从会话中访问先前提交的表单数据。

将此添加到您的submit.php:

session_start();    
foreach ($_POST AS $key => $value) {
 $_SESSION['post'][$key] = $value;
} 

这会将所有数据从$ _POST移动到$ _SESSION ['post']以供将来在模板中使用,并且应该是让它运行所需的全部内容。

答案 1 :(得分:0)

我可能错了,但我认为您需要使用

之类的内容从表单中获取已发布的值
if ($_POST['errStr']) {
     $_SESSION['errStr'] = $POST['errStr'];
} 

如果我在发布表单

后尝试访问变量的方式是正确的

如果你查看它设置为post的表单的METHOD属性,那么这应该返回你想要通过页面传递的值。

也许这不是你问的问题,我有点不清楚问题的关键部分,我假设它从表格中取值并在下一页上将它们拿出来。

如果你想在页面刷新/退出时这样做,你可能需要使用一些javascript客户端来尝试在动作发生之前捕获它。

不知道这是否可行。 PHP不会因为它执行的服务器端而帮助你,并且客户端在退出/重新加载时不会向服务器提交任何(有用的),只有执行操作的命令。

这可能需要使用javascript侦听器,例如window.onclose(虽然显然不适用于safari或firefox 2),并且在其中使用ajax xmlhttprequest将数据发送到服务器。

对于提交失败(即带有无效数据的捕获表单?),它与提交的表单几乎相同。只需在处理时重新检查另一侧的数据。

答案 2 :(得分:0)

HTTP是无状态的,除非您使用客户端方法(webstorage等),否则不会保留未提交的数据。

答案 3 :(得分:0)

您需要解析帖子变量并将其添加到会话超级全局,现在您正在引用$ _SESSION ['post'] ['phone'],这将无法按预期工作。

// Assuming same file, this is session section
if (array_key_exists('submit', $_REQUEST)) {

    if (array_key_exists('phone', $_REQUEST)) {
        $_SESSION['phone'] = $_REQUEST['phone'];
    }
}

// Form section
<?php $phone = (array_key_exists('phone', $_SESSION)) ? $_SESSION['phone'] : null;?>
<input type="text" name="phone" id="phone" placeholder="Enter your phone number here" value="<?php echo $phone ?>" />

答案 4 :(得分:0)

您没有包含submit.php的代码,或者,如果您这样做,问题很明显:您永远不会设置会话值。为此,您可以使用

session_start();

// etc...

$_SESSION['post']['name']  = $_POST['name'];
$_SESSION['post']['email'] = $_POST['email'];
$_SESSION['post']['phone'] = $_POST['phone'];

// etc...

submit.php然后表单页面(可能是另一页?)然后可以检查这些值是否已设置

.. value="<?php if (isset($_SESSION['post']['name'])) echo $_SESSION['post']['name']; ?>" ..