【问题标题】:Strange session issue in PHPPHP中的奇怪会话问题
【发布时间】:2010-10-01 09:40:14
【问题描述】:

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

$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 语句显然正在运行,因为会话未设置,但消息未显示。

我以前多次使用过这个完全相同的脚本,它在其他网站上运行得非常完美(在同一台服务器上,所有设置都相同)。

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

【问题讨论】:

  • 该代码没有任何问题,它是另一回事。您是否有任何 301/302/meta/js 重定向可能导致代码执行而不显示?我曾经使用过类似的消息传递机制,这一直是我的绊脚石。
  • 此过程中涉及的唯一重定向是将用户从联系人脚本发送回页面的重定向。它是使用代码'header("location:".$page_url);'完成的。页面 URL 变量的设置取决于表单从哪个页面提交,因为它位于网站的多个页面上。
  • 脚本中之前某个地方的 session_write_close() 一点也不傻?
  • 不,它是一个很小的站点,而这实际上是它唯一处理会话的部分。我已经彻底查看了代码,没有什么可以阻止它的工作。可能与我的 php 设置有关吗?

标签: php session


【解决方案1】:

您是否已初始化会话? session_start(); 在浏览器中输出之前?

【讨论】:

  • 是的,我是。如果我删除 unset($_SESSION['action']);从代码。这是导致问题的原因。
【解决方案2】:

尝试做一个 session_destroy();而不是 unset($_SESSION); 您能否告诉我们您开始会话的部分以及将“操作”设置为“发送”的部分?

【讨论】:

  • session_destory();有同样的效果,我害怕。会话在表单处理脚本中设置为 $_SESSION['action']='sent';并且所有涉及的文件都有 session_start();作为他们的第一行。
  • 试试这个: if ( $action == 'sent' ){echo "I'm here"; ......}如果它输出“我在这里”,那么你在 if 之前的某个地方有一个严重的错误
  • 这和我的代码有什么区别?改变回显的内容不会改变。还是我误解了你?
【解决方案3】:

嗨,Tom,您是否确保启动会话的脚本位于同一目录中 - 例如,访问同一会话的命令 - 可以在一个在 https 下,一个在 http 下 或者,如果一个在 / 下,另一个在 /dir1 下,并且 /dir1 先运行。 session创建的cookie是针对/dir1及更深的,所以其他脚本无法读取;它没有看到任何会话,所以它开始一个新的会话。

我对这个会议的东西并不精通,但它可能值得一试。 - 爸爸

【讨论】:

  • 不确定这是否会有所不同,但 PHP 文件都在同一个目录中。
【解决方案4】:

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

另外,您可以在 echo 中放置一个 javascript 警报框,看看它是否显示警报框。

echo "&lt;script type='text/javascript'&gt; alert('Hi'); &lt;/script&gt;";

这应该覆盖任何隐藏的 CSS 代码。

【讨论】:

    【解决方案5】:

    旧线程,但我会补充一点,在这种情况下我更喜欢 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;
    ?>
    

    【讨论】:

      猜你喜欢
      • 2016-01-01
      • 1970-01-01
      • 2023-03-06
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      相关资源
      最近更新 更多