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

use*_*153 11 php forms wordpress session

提交表单后,我设置的会话将丢失.

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

function.php

if (!session_id()) {
    session_start();
}
include get_template_directory() . "/custom/session.php";
Run Code Online (Sandbox Code Playgroud)

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]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试将会话设置为:

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

提交表格后,它将进入永久链接(212).然后我试了一下.

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

Mig*_*uel 8

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

session_start()的任务是:

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

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

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


roc*_*k3t 8

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

像这样:

class session
{
    function __construct()
    {
        if (! session_id()) {
            session_start();
        }
    }
Run Code Online (Sandbox Code Playgroud)

另外要提到的是,每次你做的时候,new Session你都会得到一个使用相同全局变量的相同功能的对象$_SESSION.

您不需要多个$session对象,这是一个值得研究的好时机Singleton pattern.