【问题标题】:Session data persists after session_unset and session_destroy [duplicate]会话数据在 session_unset 和 session_destroy 之后仍然存在 [重复]
【发布时间】:2018-10-07 10:05:14
【问题描述】:

我有一个联系表contact.php,在form-processing.php 中处理。

表单字段存储在会话数组中(包括 ant 验证错误),form-processing.php 在错误或成功时重定向回contact.php

成功后,contact.php 上会显示一条感谢消息(而不是表单),并使用 session_unset() 后跟 session_destroy() 删除会话。然后在刷新页面时应该会再次显示空白表单(因为会话数组将为空)。

但是,即使在 unsetdestroyed 之后,会话中的数据仍然存在。怎么会这样?我已经通过在contact.php 页面上的session_unset(); session_destroy(); 之前和之后执行var_dump 来确认会话已被删除。因此,第一次填写表格后,总是会显示感谢信息。

contact.php:

session_start();

if ( $_SESSION['success'] ) {
    // display thank you message
    session_unset();
    session_destroy();
} else {
    //display form
}

form-processing.php:

session_start();

//get $_POST array, validate, sanitize and save to $_SESSION

//send form contents by email

if ($email_sent) {
     $_SESSION['success'] = true;
}

// redirect to contact.php

已编辑更新

这是在 Wordpress 安装上,会话开始的位置存在一些问题。我将session_start() 移出模板文件并移入functions.php 中的条件函数,现在表单可以工作了。

【问题讨论】:

  • 什么是 $email_sent?

标签: php session


【解决方案1】:

这应该完全破坏会话:

session_unset();
session_destroy();
session_write_close();
session_regenerate_id(true);
if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time()-42000, '/');
}

你也可以这样做:

$_SESSION = [];

【讨论】:

  • 谢谢,但这根本行不通(在这种情况下)-我可以在使用上面的代码确认会话为“空”后执行var_dump,只是因为它是“重新生成”与页面刷新时的原始数据。
  • 同样在运行 session_destroy() 之前清除 cookie : if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/' ); }
猜你喜欢
  • 2017-04-01
  • 2013-05-27
  • 2018-11-16
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多