2010-10-01 78 views
2

我在使用PHP中的会话时遇到了一个奇怪的问题。基本上,当用户提交联系表单时,处理脚本在完成时设置会话($_SESSION['action']='sent';)。然后,用户发送回他们发送的形式从页面,并使用下面的代码会显示一条消息:PHP中奇怪的会话问题

$action = $_SESSION['action']; 

if ($action == 'sent') 
{ 
echo '<p>Thank you for contacting us, we will be in touch with you ASAP.</p>'; 
unset($_SESSION['action']); 
} 

的会话设置,所以,如果他们刷新页面或导航离开和回来赢得消息将不再显示。

基本上问题是当会话未被设置时,它似乎从脚本的一开始就取消它,以便消息不显示。当会话未设置时,if语句显然正在运行,但消息未显示。

我以前使用过这个完全相同的脚本,它在其他站点(在同一台服务器上,具有所有相同的设置)上绝对完美地工作。

任何帮助/建议,将不胜感激!

+0

没有什么错码,这是别的东西。你有没有301/302/meta/js重定向可能导致代码执行而不显示?我曾经使用过类似的消息传递机制,这总是让我感到沮丧。 – pharalia 2010-10-01 10:03:14

+0

此过程中涉及的唯一重定向是将用户从联系人脚本发送回页面的那个重定向。它使用代码'header(“location:”。$ page_url);'完成。页面URL变量的设置取决于表单从哪个页面提交,因为它位于网站上的多个页面上。 – thebiggianthead 2010-10-01 10:12:15

+0

这不是什么愚蠢的事情在session_write_close()以前在脚本的某处? – 2010-10-01 11:26:29

回答

0

你初始化了一个会话吗? session_start();之前在浏览器中输出的东西?

+0

是的,我是。如果我删除未设置的消息($ _ SESSION ['action']);来自代码。它不会导致问题。 – thebiggianthead 2010-10-01 09:47:17

0

尝试做一个session_destroy();而不是未设置($ _ SESSION); 您能否给我们开始会议的部分,以及您将“行动”设置为“发送”的位置?

+0

session_destory();恐怕也有同样的效果。会话在$ _SESSION ['action'] ='sent'的表单处理脚本中设置;并且涉及的所有文件都有session_start();作为他们的第一线。 – thebiggianthead 2010-10-01 10:18:10

+0

试试这个:if($ action =='sent'){echo“I'm here”; ......} 如果它输出“我在这里”,那么你在if之前的某个地方有一个严重的错误 – ITroubs 2010-10-01 10:47:48

+0

这和我的代码有什么区别?改变回应的内容不会改变。还是我误解了你? – thebiggianthead 2010-10-01 10:56:01

0

嗨汤姆你确保启动会话的脚本是在同一个目录 - 例如,访问同一会话 - 可以在一个下的命令是在https下,并且一个在http 或如果一在/下,另一个在/ dir1下,并且/ dir1首先运行。会话创建的cookie用于/ dir1和更深,因此其他脚本无法读取它;它没有看到会话,所以它开始一个新的。

我不会在这个会议上发光,但它可能值得一检查。 - 爸爸

+0

不知道这会不同,但PHP文件都在同一个目录中。 – thebiggianthead 2010-10-04 08:11:50

0

你的代码是正确的。而且由于会话未被设置,我们知道if块中的语句正在执行。可能是输出实际上是由echo显示的,但只是没有被浏览器显示(如果你的css代码是这样配置的话,这可能会发生)。因此,只需检查输出页面的源代码,并检查源代码是否包含输出消息。

通过其他方式,您可以在您的echo中添加一个JavaScript警告框并查看它是否显示警告框。

echo "<script type='text/javascript'> alert('Hi'); </script>";

这应该重写任何隐藏的CSS代码。

0

旧线,但我会补充一点,我会在这种情况下更喜欢isset()函数:

<?php 
session_start(); 
if(isset($_SESSION['sent'])){ 
    echo "Successfully submitted form!"; 
    $_SESSION = array(); 
    session_regenerate_id(); 
    session_unset(); 
    session_destroy(); 
    exit; 
} 
if(isset($_POST['submit'])){ 
    //validate input & process form 
    $_SESSION['sent'] = 1; 
    header("location:form.php"); // name of this file 
    exit; 
} 
echo "Enter your email<br /> 
<form action='' method='post'> 
<input type='text' name='email' /> 
<input type='submit' name='submit' /> 
</form>"; 
exit; 
?>