解决XAMPP搭建织梦(dedecms)登录后台空白

在XAMPP上安装DEDECMS,但小明尝试登录后台时,首先是验证码错误,解决验证码问题之后成功登录,但后台一片空白,连任何错误提示信息都没有。查看了PHP、APACHE、DEDECMS运行错误,却没有任何相关信息。

问题排除


1、那么会不会是PHP环境没有安装好呢?
由于DEDECMS前台默认是php,如果php没有安装好,那么前台也应该是空白,但前台显示正常。
2、会不会是php禁用了某些函数,导致php程序不能执行呢?
如果禁用了某些函数,那么PHP、APACHE、DEDECMS等错误日志中应该会提示,查看了所有,依然没有。
3、会不会php某些函数不被支持呢?
找到处理登录操作的 D:\xampp\htdocs\dedecms_test\include\userlogin.class.php 文件,找几个特殊的函数进行阅读,好像找到了。有不被支持的函数。

问题分析


编辑 /include/userlogin.class.php 文件,找到 function keepUser() 函数,大概 281 行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

   /**
     *  保持用户的会话状态
     *
     * @access    public
     * @return    int    成功返回 1 ,失败返回 -1
     */
    function keepUser()
    {
        if($this->userID != '' && $this->userType != '')
        {
            global $admincachefile,$adminstyle;
            if(empty($adminstyle)) $adminstyle = 'dedecms';

            @session_register($this->keepUserIDTag);
            $_SESSION[$this->keepUserIDTag] = $this->userID;

            @session_register($this->keepUserTypeTag);
            $_SESSION[$this->keepUserTypeTag] = $this->userType;

            @session_register($this->keepUserChannelTag);
            $_SESSION[$this->keepUserChannelTag] = $this->userChannel;

            @session_register($this->keepUserNameTag);
            $_SESSION[$this->keepUserNameTag] = $this->userName;

            @session_register($this->keepUserPurviewTag);
            $_SESSION[$this->keepUserPurviewTag] = $this->userPurview;

            @session_register($this->keepAdminStyleTag);
            $_SESSION[$this->keepAdminStyleTag] = $adminstyle;

            PutCookie('DedeUserID', $this->userID, 3600 * 24, '/');
            PutCookie('DedeLoginTime', time(), 3600 * 24, '/');

            $this->ReWriteAdminChannel();

            return 1;
        }
        else
        {
            return -1;
        }
    }

其中,session_register 函数是已经被 php 抛弃了, php 这样解释道(原文 http://www.php.net/manual/zh/function.session-register.php):
该函数,接受一个可变数组参数。它主要用于创建一个或多个全局 SESSION 会话,支持范围是 PHP 4, PHP 5 < 5.4.0,我们的php版本是低于 5.4.0 吗?
在 D:\xampp\htdocs\dedecms_test 中创建 phpinfo.php 文件,文件内容:

1
2
3

<?php
    echo phpinfo();
?>

浏览器输入:http://localhost/phpinfo.php,悲催了。版本果然高于 5.4.0!

既然如此,我们把过时的函数删除是不是就可以了呢?嗯,试试!

解决方案


编辑 /include/userlogin.class.php(大概 281 行),将:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

    /**
     *  保持用户的会话状态
     *
     * @access    public
     * @return    int    成功返回 1 ,失败返回 -1
     */
    function keepUser()
    {
        if($this->userID != '' && $this->userType != '')
        {
            global $admincachefile,$adminstyle;
            if(empty($adminstyle)) $adminstyle = 'dedecms';

            @session_register($this->keepUserIDTag);
            $_SESSION[$this->keepUserIDTag] = $this->userID;

            @session_register($this->keepUserTypeTag);
            $_SESSION[$this->keepUserTypeTag] = $this->userType;

            @session_register($this->keepUserChannelTag);
            $_SESSION[$this->keepUserChannelTag] = $this->userChannel;

            @session_register($this->keepUserNameTag);
            $_SESSION[$this->keepUserNameTag] = $this->userName;

            @session_register($this->keepUserPurviewTag);
            $_SESSION[$this->keepUserPurviewTag] = $this->userPurview;

            @session_register($this->keepAdminStyleTag);
            $_SESSION[$this->keepAdminStyleTag] = $adminstyle;

            PutCookie('DedeUserID', $this->userID, 3600 * 24, '/');
            PutCookie('DedeLoginTime', time(), 3600 * 24, '/');

            $this->ReWriteAdminChannel();

            return 1;
        }
        else
        {
            return -1;
        }
    }

替换为(其实就是行注释 session_register):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

    /**
     *  保持用户的会话状态
     *
     * @access    public
     * @return    int    成功返回 1 ,失败返回 -1
     */
    function keepUser()
    {
        if($this->userID != '' && $this->userType != '')
        {
            global $admincachefile,$adminstyle;
            if(empty($adminstyle)) $adminstyle = 'dedecms';

            // @session_register($this->keepUserIDTag);
            $_SESSION[$this->keepUserIDTag] = $this->userID;

            // @session_register($this->keepUserTypeTag);
            $_SESSION[$this->keepUserTypeTag] = $this->userType;

            // @session_register($this->keepUserChannelTag);
            $_SESSION[$this->keepUserChannelTag] = $this->userChannel;

            // @session_register($this->keepUserNameTag);
            $_SESSION[$this->keepUserNameTag] = $this->userName;

            // @session_register($this->keepUserPurviewTag);
            $_SESSION[$this->keepUserPurviewTag] = $this->userPurview;

            // @session_register($this->keepAdminStyleTag);
            $_SESSION[$this->keepAdminStyleTag] = $adminstyle;

            PutCookie('DedeUserID', $this->userID, 3600 * 24, '/');
            PutCookie('DedeLoginTime', time(), 3600 * 24, '/');

            $this->ReWriteAdminChannel();

            return 1;
        }
        else
        {
            return -1;
        }
    }

好,保存文件尝试登录。笔者成功登录后,发现不能注销登录,一点注销登录有出现空白,看来又是这个问题了。好吧,继续解决DEDECMS后台不能注销登录,出现空白页面问题。

解决后台不能注销登录


当我们点击注销页面,它请求 http://localhost/dede/exit.php 到这个页面去了,打开 /dede/exit.php 文件,关键代码:

1
2
3

require_once(DEDEINC.'/userlogin.class.php');
$cuserLogin = new userLogin();
$cuserLogin->exitUser(); // 执行 userlogin.class.php 中的 exitUser(); 函数。

/include/userlogin.class.php 中的 exitUser(); 函数代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

   /**
     *  结束用户的会话状态
     *
     * @access    public
     * @return    void
     */
    function exitUser()
    {
        ClearMyAddon();
        @session_unregister($this->keepUserIDTag);
        @session_unregister($this->keepUserTypeTag);
        @session_unregister($this->keepUserChannelTag);
        @session_unregister($this->keepUserNameTag);
        @session_unregister($this->keepUserPurviewTag);
        DropCookie('dedeAdmindir');
        DropCookie('DedeUserID');
        DropCookie('DedeLoginTime');
        $_SESSION = array();
    }

从 PHP 文档(原文:http://www.php.net/manual/zh/function.session-unregister.php)中可以看到,session_unregister 函数又被抛弃了…

那咋办?注释代码吗?这个不行,注释就不能退出登录了…,这个php文档底部似乎有个解决方案,原文如下:

1
2
3
4
5
6

If globals is on, you'll have to unset the $_SESSION[varname] as well as the $varname.

Like:

unset($_SESSION[varname]);
unset($varname);

我们把 session_unregister 替换成 unset 试试吧,因此我们将:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

    /**
     *  结束用户的会话状态
     *
     * @access    public
     * @return    void
     */
    function exitUser()
    {
        ClearMyAddon();
        @session_unregister($this->keepUserIDTag);
        @session_unregister($this->keepUserTypeTag);
        @session_unregister($this->keepUserChannelTag);
        @session_unregister($this->keepUserNameTag);
        @session_unregister($this->keepUserPurviewTag);
        DropCookie('dedeAdmindir');
        DropCookie('DedeUserID');
        DropCookie('DedeLoginTime');
        $_SESSION = array();
    }

替换成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

    /**
     *  结束用户的会话状态
     *
     * @access    public
     * @return    void
     */
    function exitUser()
    {
        ClearMyAddon();
        unset ($this->keepUserIDTag);
        unset ($this->keepUserTypeTag);
        unset ($this->keepUserChannelTag);
        unset ($this->keepUserNameTag);
        unset ($this->keepUserPurviewTag);
        DropCookie('dedeAdmindir');
        DropCookie('DedeUserID');
        DropCookie('DedeLoginTime');
        $_SESSION = array();
    }

如你所想,问题解决了!可能其它地方还存在这样的问题,本文就当做个抛砖引玉~

 

转载于:https://www.cnblogs.com/huidaoli/articles/3387224.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值