在wordpress中提交表单后会话丢失

时间:2017-04-03 04:20:38

标签: php wordpress forms session

我提交的会话在提交表单后丢失。

我已经构建了会话类来设置新会话,取消设置等等。在wordpress模板的function.php中。

function.php

if (!session_id()) {
    session_start();
}
include get_template_directory() . "/custom/session.php";

session.php文件

class session {
    function __construct() {

    }

    function set_flashdata($name, $value) {
        $_SESSION[$name] = $value;
    }

    function flashdata($name) {
        if (isset($_SESSION[$name])) {
            $str = $_SESSION[$name];
            return $str;
        } else {
            return FALSE;
        }
    }

    function userdata($name) {
        if (isset($_SESSION[$name])) {
            return $_SESSION[$name];
        } else {
            return FALSE;
        }
    }

    function set_userdata($name, $value) {
        $_SESSION[$name] = $value;
    }

    function unset_userdata($name) {
        if (isset($_SESSION[$name])) {
            unset($_SESSION[$name]);
        }
    }
}

我尝试将会话设置为:

<?php 
    $sess = new session();
    $sess->set_userdata('sess_name',"some value");
?>
<form action="get_permalink(212);">
    //input buttons
</form>

提交表格后,它进入固定链接(212)。然后我试了。

<?php
    $sess = new session();
    $value = $sess->userdata('sess_name');
    var_dump($value);      //returns false. That means session is lost after form submit. Why?
?>

7 个答案:

答案 0 :(得分:8)

您必须始终为每个请求调用session_start()

session_start()的任务是:

  • 创建新会话
  • 重新启动现有会话

这意味着,如果您已创建会话,并且未调用方法session_start(),则不会实现变量$ _SESSION。

除外:如果您的 php.ini 中已将选项session.auto_start设置为1,那么在这种情况下,无需调用session_start()因为变量$ _SESSION是隐式实现的。

答案 1 :(得分:8)

您需要将会话开始/恢复移动到Session的构造函数中。

像这样:

class session
{
    function __construct()
    {
        if (! session_id()) {
            session_start();
        }
    }

另外需要提及的是,每当您new Session,您将获得使用相同全局变量$_SESSION的相同功能的对象。

您不需要多个$session个对象,现在是调查Singleton pattern的好时机。

答案 2 :(得分:3)

你需要使用wordpress全局变量来设置会话的条件,或者不是:

global $session;
if (!session_id()) {
    session_start();
}
include get_template_directory() . "/custom/session.php";

答案 3 :(得分:3)

对我来说,session_start()未在get_permalink(212;)引用的页面的开头设置{<1}}。

我几乎没有WP本身的经验,所以我可能会误解get_permalink()的功能

答案 4 :(得分:3)

这可能是由于www。在您的网站域名的开头。确保两个页面使用相同的结构。

此外,我很久以前在表单将数据发送到安全地址时面临同样的问题(https://)

我希望这两项可以帮到你。

答案 5 :(得分:0)

我同意@ rock3t在类的构造函数中初始化会话的答案,但是每次启动一个类对象时,它都会去检查会话!

相反,如果你没事,访问会话的最简单方法是在调用 wp-settings之前将以下行添加到 wp-config.php 文件中EM>

if (!session_id())
    session_start();

这将全局设置/初始化会话,您不需要在类的构造函数中设置/检查session_start。

谢谢。

答案 6 :(得分:-1)

您可以检查会话是否首先设置...表单的内容是什么? ...还有你的php脚本没有session_start().. is function.php包含在你的php脚本中