首页 > 后端开发 > php教程 > 自定义session处理方式导致加载验证码失败。

自定义session处理方式导致加载验证码失败。

WBOY
发布: 2016-06-06 20:21:09
原创
1500 人浏览过

一个很抓狂的问题,搞了一个下午没弄好,请高手指教

问题是验证码存在SESSION中,能写进数据库,但是在浏览器加载不出来。

验证码输出方法所在的控制器 继承自BackplatformController控制器 ,
自定义session处理方式导致加载验证码失败。

在BackplatformController的构造方法里调用session类

下面是自定义的session类

<code><?php

/**
 * Class SessionDBTool
 */

class SessionDBTool{
    private $db;    //保存数据库连接对象
    public function __construct(){
        //自定义session处理方法
        ini_set('session.save_handler','user');
        session_set_save_handler(
                array($this,'sess_open'),
                array($this,'sess_close'),
                array($this,'sess_read'),
                array($this,'sess_write'),
                array($this,'sess_destroy'),
                array($this,'sess_gc')
        );
        //开启session
        @session_start();
    }

    /**
     * 初始化
     */
    public function sess_open(){
        $this->db = MYSQLDB::getInstance($GLOBALS['config']['database']);
    }

    /**
     * 关闭
     * @return bool
     */
    public function sess_close(){
        return true;
    }

    /**
     * @param $sess_id
     * @return string
     */
    public function sess_read($sess_id){
        $sql="select sess_data from it_session where sess_id='$sess_id'";
        if($row=$this->db->fetchRow($sql)){
            return $row['sess_data'];
        }else{
            return '';
        }
    }

    /**
     * @param $sess_id
     * @param $sess_data
     */
    public function sess_write($sess_id,$sess_data){
        $expire=time();
        //存在则更新
        $sql="insert into it_session values('$sess_id','$sess_data','$expire') on duplicate key update sess_data='$sess_data',
        expire='$expire'";
        if($result=$this->db->myquery($sql)){
            return true;
        }
    }

    /**
     * @param $sess_id
     */
    public function sess_destroy($sess_id){

        $sql="delete from it_session where sess_id='$sess_id'";
        $result=$this->db->myquery($sql);
    }

    /**
     * @param $ttl
     * @return mixed
     */
    public function sess_gc($ttl){
        $now = time();
        $last = $now -$ttl;
        //删除过期session
        $sql = "delete from it_session where expire < $last";
        return $this->db->myquery($sql);
    }
}
</code>
登录后复制
登录后复制

下面是验证码存入session

自定义session处理方式导致加载验证码失败。

回复内容:

一个很抓狂的问题,搞了一个下午没弄好,请高手指教

问题是验证码存在SESSION中,能写进数据库,但是在浏览器加载不出来。

验证码输出方法所在的控制器 继承自BackplatformController控制器 ,
自定义session处理方式导致加载验证码失败。

在BackplatformController的构造方法里调用session类

下面是自定义的session类

<code><?php

/**
 * Class SessionDBTool
 */

class SessionDBTool{
    private $db;    //保存数据库连接对象
    public function __construct(){
        //自定义session处理方法
        ini_set('session.save_handler','user');
        session_set_save_handler(
                array($this,'sess_open'),
                array($this,'sess_close'),
                array($this,'sess_read'),
                array($this,'sess_write'),
                array($this,'sess_destroy'),
                array($this,'sess_gc')
        );
        //开启session
        @session_start();
    }

    /**
     * 初始化
     */
    public function sess_open(){
        $this->db = MYSQLDB::getInstance($GLOBALS['config']['database']);
    }

    /**
     * 关闭
     * @return bool
     */
    public function sess_close(){
        return true;
    }

    /**
     * @param $sess_id
     * @return string
     */
    public function sess_read($sess_id){
        $sql="select sess_data from it_session where sess_id='$sess_id'";
        if($row=$this->db->fetchRow($sql)){
            return $row['sess_data'];
        }else{
            return '';
        }
    }

    /**
     * @param $sess_id
     * @param $sess_data
     */
    public function sess_write($sess_id,$sess_data){
        $expire=time();
        //存在则更新
        $sql="insert into it_session values('$sess_id','$sess_data','$expire') on duplicate key update sess_data='$sess_data',
        expire='$expire'";
        if($result=$this->db->myquery($sql)){
            return true;
        }
    }

    /**
     * @param $sess_id
     */
    public function sess_destroy($sess_id){

        $sql="delete from it_session where sess_id='$sess_id'";
        $result=$this->db->myquery($sql);
    }

    /**
     * @param $ttl
     * @return mixed
     */
    public function sess_gc($ttl){
        $now = time();
        $last = $now -$ttl;
        //删除过期session
        $sql = "delete from it_session where expire < $last";
        return $this->db->myquery($sql);
    }
}
</code>
登录后复制
登录后复制

下面是验证码存入session

自定义session处理方式导致加载验证码失败。

已经搞定了,ob缓存没有清除

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板