【问题标题】:Session_start doesn't work or Session_destroy doesn't work?Session_start 不起作用或 Session_destroy 不起作用?
【发布时间】:2014-02-08 11:22:52
【问题描述】:

我在默认索引页面中有这段代码:

<?php 
$_SESSION['user'] = 'Bill';
print $_SESSION['user'];

$_SESSION = array();
session_destroy();

$_SESSION['user'] = 'Andy';
print $_SESSION['user'];
?>

输出如下:

Bill
Warning: session_destroy(): Trying to destroy uninitialized session in C:\xampp\htdocs\DSP\index.php on line 15
Andy

显然我必须使用 session_start() 来初始化会话,但这些是我的问题:

1) 但是,为什么我可以在没有 session_start() 函数的情况下存储会话?

2) 现在我把 session_start() 函数放在代码的顶部:

<?php 
session_start();

$_SESSION['user'] = 'Bill';
print $_SESSION['user'];

$_SESSION = array();
session_destroy();

$_SESSION['user'] = 'Andy';
print $_SESSION['user'];
?>

现在输出如下:

Bill
Andy

我现在的问题是:

3) 为什么 Andy 会打印在输出上?为什么编译器不给我错误,必须再次启动会话,因为我之前使用命令 session_destroy() 销毁了它?

非常感谢大家!

【问题讨论】:

  • 你能在没有火或任何能源的情况下准备食物吗?不,你不能,因为没有它你就不能准备食物。同样,如果您不启动 session_start();您的代码将不知道有关会话的任何信息。
  • 我知道,但我的问题是为什么即使 session_start 不存在,也会设置此示例中的会话。

标签: php session


【解决方案1】:

但是,为什么我可以在没有 session_start() 函数的情况下存储会话?

因为它只是一个普通的数组,可以这样访问。 $_POST$_GET等超全局数组也是如此。但是,会话仅在您调用 session_start() 后创建,因此在初始化会话之前尝试将信息存储在数组中是没有意义的。

我在您的代码和生成的输出中没有发现任何异常。为了说明,请看以下代码:

<?php 
session_start();

$_SESSION['user'] = 'Bill';    
var_dump($_SESSION);

$_SESSION = array();
session_destroy();    
var_dump($_SESSION);

$_SESSION['user'] = 'Andy';
var_dump($_SESSION);

输出是:

array(1) {
  ["user"]=>
  string(4) "Bill"
}

array(0) {
}

array(1) {
  ["user"]=>
  string(4) "Andy"
}

这就是上面发生的事情:

  • 使用session_start()初始化会话
  • 将带有键 user 的字符串 Bill 添加到关联数组中
  • session_destroy() 销毁存储在会话存储中的会话数据。 ($_SESSION 现在是
  • 另一个带有键 user 的字符串 Andy 被添加到关联数组中

如您所料,输出将是Andy。我没发现问题?

【讨论】:

【解决方案2】:

您应该在尝试销毁会话之前取消设置它。

session_unset();
session_destroy();

http://www.php.net/manual/en/function.session-unset.php

【讨论】:

  • session_unset() 已弃用,现在它使用 $_SESSION = array();
  • 要从数组中删除某些项目,您应该使用 unset ($_SESSION['varname']); 。顺便说一句,我看不到有关此功能弃用的文档,据我所知,session_unregister() 已被弃用。
  • 在 PHP 手册中我读到了这个:注意:不要使用 unset($_SESSION) 取消设置整个 $_SESSION,因为这将禁用通过 $_SESSION 超全局变量注册会话变量。
  • 对,不推荐,你应该使用unset ($_SESSION['varname']);取消设置你想要取消设置的具体变量
  • 不,我提出了更好的问题。我会知道如何才能真正破坏会话。当会话被销毁并且我再次使用会话后(例如,我将存储新的键值),编译器必须告诉我会话不存在并且未初始化?
猜你喜欢
  • 1970-01-01
  • 2018-08-19
  • 2017-02-25
  • 2013-04-29
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多