PHP未设置会话不起作用

Posted

技术标签:

【中文标题】PHP未设置会话不起作用【英文标题】:PHP unset session not working 【发布时间】:2016-07-06 07:05:13 【问题描述】:

我的用于取消设置会话变量的 php 脚本不起作用。

我需要调用一个 PHP 文件 destroy.php,其中包含从 ajax 取消设置会话变量的代码,除了会话清除之外一切正常。

我正在发布清除会话变量的代码,请指出我的错误。

jQuery 代码:

$.ajax
                    (
                        type: "POST",
                        url: "SubmitReview.php",
                        data: dataString,
                        cache: false,

                        success: function(response)
                        
                            $.fn.destroySession();
                            $('body').animate(scrollTop:0, 500);
                            $('body').children(':not(div.ErrorMessageContainer)').fadeTo(500, 0.1);
                            $('div.ErrorMessageContainer').html(response).fadeIn(500).delay(5000).fadeOut(500);
                            setTimeout(function()
                            
                                $('body').children(':not(div.ErrorMessageContainer)').fadeTo(500, 1);
                            , 5400);
                            setTimeout(function()
                            
                                window.location.href = "Thanks.php";
                            , 5600);
                        
                    );

$.fn.destroySession = function()
            
                $.post("Destroy.php");
            

destroy.php:

<?php

if(isset($_SESSION['MN']))

    $_SESSION['MN'] = array();
    unset($_SESSION['MN']);


?>

【问题讨论】:

结合会话和 ajax 有时会使会话不起作用。如果要使用ajax,请通过参数而不是使用会话。 会话开始了吗?加上$.post("Destroy.php");destroy.php 是 NIX 系统上的两种不同的动物。 @Fred-ii- 像一位魅力先生一样工作......非常感谢......我在想的是,当我清理会话时,为什么要再次开始会话...... .但是你的解决方案帮助了我.....谢谢吨.... @KushAcharya 不客气,干杯 @frosty 谢谢先生您的反馈......我一定会记住这一点...... 【参考方案1】:

如 cmets 中所述,您没有启动会话,并且需要在所有使用会话的文件中。

因此,在 PHP 开始标签的顶部和下方添加 session_start();

参考:

http://php.net/manual/en/session.examples.basic.php

error reporting 添加到文件顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Then the rest of your code

旁注:只应在暂存阶段显示错误,而不是在生产阶段。


“为什么要再次启动会话” - 因为,session_start(); 需要驻留在文件中,即使您想取消设置它(这就是他们在 PHP.net 上构建它的方式)。

<?php
session_start();

if(isset($_SESSION['MN']))

    $_SESSION['MN'] = array();
    unset($_SESSION['MN']);

【讨论】:

@luweiqi hehe 感谢您修复错字。我有时打字有点太快了。我的手指得到了所有 lkasdfkfdakdsdfjajsd 哈哈。 @Fred-ii- 你太棒了先生...清除了我的疑虑...再次非常感谢您...... @KushAcharya 不客气 Kush,很高兴能帮上忙,干杯! @Fred-ii-,这很有帮助,但有一个疑问;如果我们在开头添加 session_start,那么 isset($_SESSION) 将永远为真,不是吗? @Neo 它并不总是正确的,因为它设置在一个条件语句中,if(isset($_SESSION['MN'])) 根据答案中的内容。但是,如果有人要这样做,如果这是您正在谈论的内容并使用类似:$var = isset($_SESSION['var']); 那么这将有资格作为会话数组始终被视为已设置,这反过来又会失败并且不正确检查是否设置了会话数组的语法。【参考方案2】:

将 session_start() 放在第一行。

<?php
session_start();

if(isset($_SESSION['MN']))

    $_SESSION['MN'] = array();
    unset($_SESSION['MN']);

【讨论】:

以上是关于PHP未设置会话不起作用的主要内容,如果未能解决你的问题,请参考以下文章

注销后Drupal 9.2登录不起作用

在另一个页面中重定向时php会话不起作用[重复]

PHP - 数组未设置在foreach循环中不起作用

Codeigniter - 注销链接不起作用 - 会话和 cookie 未销毁

会话和 php 重定向不起作用

通过非 PHP 扩展访问时,PHP 会话不起作用