自定义会话处理程序不适用于PHP5.6,但适用于PHP7

时间:2016-05-19 20:40:24

标签: php wordpress session

我正在编写一个Wordpress插件,它使用会话并编写了我自己的自定义会话处理程序,以将会话数据保存在wordpress数据库的自定义表中。

我在主插件文件中定义了以下内容

add_action( 'init','start_session',1);    
function start_session() {
        if(!session_id())
        {
            session_set_save_handler('open_session', 'close_session', 'read_session', 'write_session', 'destroy_session', 'clean_session');
            session_start();
        }
    }

我的会话功能如下所示

function open_session()
{
    return true;
}

function close_session()
{
    return true;
}

function read_session($sessionid)
{
    global $wpdb;

    $session_table_name = $wpdb -> prefix . "sessions";

    $query = $wpdb->prepare(
                        "SELECT data FROM $session_table_name
                        WHERE id = %s",
                        $sessionid);

    $result = $wpdb -> get_var($query);

    if ($result)
    {
        return $result;
    } else
    {
        return '';
    }
}

function write_session($sessionid,$data)
{
    global $wpdb;

    $session_table_name = $wpdb -> prefix . "sessions";

    $rowsaffected = $wpdb->replace(
                            $session_table_name,
                            array(
                                    'id' => $sessionid,
                                    'data' => $data
                            ),
                            array(
                                    '%s',
                                    '%s'
                            ));

    return true;
}

function destroy_session($sessionid)
{
    global $wpdb;

    $session_table_name = $wpdb -> prefix . "sessions";

    $rowsaffected = $wpdb->delete($session_table_name,array('id' => $sessionid),array('%s'));

    $_SESSION = array();

    return true;
}

function clean_session($expire)
{
    global $wpdb;

    $session_table_name = $wpdb -> prefix . "sessions";

    $wpdb->query(
        $wpdb->prepare(
                "DELETE FROM $session_table_name
                WHERE DATE_ADD(last_accessed, INTERVAL %d SECOND) < NOW()",
                $expire
        )
    );

    return true;
}

我有一些插件创建的页面,然后我通过向the_content添加过滤器并检查页面ID来替换内容。

        add_filter( 'the_content', 'content_filter' );

    function content_filter ($content)
    {
    ...
        if ($post->ID == $page_id)
        {
            $content = '';
            $content = basket_page($content);
        }
        return $content;
    }

   function basket_page($content)
   {
       $_SESSION['test'] = 'test';

       $content = $_SESSION['anexistingvariable'];

       return $content;
   }

现在这一切在运行PHP7时运行正常,但是在PHP5.6中,如果我在函数basket_page()中设置了一个SESSION变量,我得到一个致命的PHP错误,该错误表示“调用成员函数”在null上替换()...&#39;在第39行的会议功能。这是在$ wpdb上调用replace方法的行,因为全局$ wpdb为空。

我在这个插件中使用Ajax是多么奇怪,在我的ajax回调函数中编写会话变量即使在PHP5.6中也能正常工作。我也可以从basket_page()中读取会话变量,它似乎只是导致问题的写入。

我的托管服务提供商只能达到PHP5.6,所以我需要在这个版本中使用它。任何人都可以给予的任何见解将不胜感激!

1 个答案:

答案 0 :(得分:0)

我自己已修复此问题,我需要在wp_footer动作挂钩中添加RunWithProgressBar。现在一切都适用于PHP5.6和PHP7。万岁!