ecshop用的是mysql,现在需要修改成mssql,原来正常运行的代码,出现unserialize错误,字符串格式化以后和serialize相同的字符串也不行,请高手帮忙看下

解决方案 »

  1.   

    serialize & unserialize
    举例
      

  2.   

            $adminid = !empty($GLOBALS['_SESSION']['admin_id']) ? intval($GLOBALS['_SESSION']['admin_id']) : 0;
            $userid  = !empty($GLOBALS['_SESSION']['user_id'])  ? intval($GLOBALS['_SESSION']['user_id'])  : 0;
            $user_name  = !empty($GLOBALS['_SESSION']['user_name'])  ? trim($GLOBALS['_SESSION']['user_name'])  : 0;
            $user_rank  = !empty($GLOBALS['_SESSION']['user_rank'])  ? intval($GLOBALS['_SESSION']['user_rank'])  : 0;
            $discount  = !empty($GLOBALS['_SESSION']['discount'])  ? round($GLOBALS['_SESSION']['discount'], 2)  : 0;
            $email  = !empty($GLOBALS['_SESSION']['email'])  ? trim($GLOBALS['_SESSION']['email'])  : 0;
            unset($GLOBALS['_SESSION']['admin_id']);
            unset($GLOBALS['_SESSION']['user_id']);
            unset($GLOBALS['_SESSION']['user_name']);
            unset($GLOBALS['_SESSION']['user_rank']);
            unset($GLOBALS['_SESSION']['discount']);
            unset($GLOBALS['_SESSION']['email']);        $data        = serialize($GLOBALS['_SESSION']);
      

  3.   

                    $this->session_expiry = $session['expiry'];
                    $this->session_md5    = md5($session['data']);
    //$session['data']=preg_replace('!s:(\d+):"(.*?)";!se',"'s:'.strlen('$2').':\"$2\";'",$session['data']);
                    $GLOBALS['_SESSION']  = unserialize($session['data']);
                    $GLOBALS['_SESSION']['user_id'] = $session['userid'];
                    $GLOBALS['_SESSION']['admin_id'] = $session['adminid'];
                    $GLOBALS['_SESSION']['user_name'] = $session['user_name'];
                    $GLOBALS['_SESSION']['user_rank'] = $session['user_rank'];
                    $GLOBALS['_SESSION']['discount'] = $session['discount'];
                    $GLOBALS['_SESSION']['email'] = $session['email'];
      

  4.   

    服务器操作系统: WINNT ()
    Web 服务器: Microsoft-IIS/7.0 
    PHP 版本: 5.2.13 MSSQL 版本: 2039 
    编码: UTF-8 
      

  5.   

    这样看太可怕了。
    输出 serialize前的值  输出 serialize 后的值 然后把不能unserialize 的注明一下
      

  6.   

    可能是编码的问题吧,mssql没有用过,不过mssql的编码应该不是utf8
      

  7.   

    有些类型的数据不能被序列化,记得做过一个session保存购物车数据的东西,就遇到过循环的对象及一些数据需要序列化。
    1、看看你的原来程序是否对mysql序列,有,去掉试试。
    2、自己检测看看mmsql的有些类型不适合的,单独取出作一个数组。
      

  8.   

    $data = serialize($GLOBALS['_SESSION']);//$session['data']=preg_replace('!s:(\d+):"(.*?)";!se',"'s:'.strlen('$2').':\"$2\";'",$session['data']);
      $GLOBALS['_SESSION'] = unserialize($session['data']);
    编码: UTF-8 
    mssql数据库对应的类型是nchar
      

  9.   

    //$session['data']=preg_replace('!s:(\d+):"(.*?)";!se',"'s:'.strlen('$2').':\"$2\";'",$session['data']);
    把这个加上后前后是一致的,也不行
      

  10.   

    可能是编码的问题吧,mssql没有用过,不过mssql的编码应该不是utf8这个是什么意思?
      

  11.   

    我曾经在页面编码上吃过这个亏测试了好久才弄清楚 原来在 gbk 编码的页面 序列化的字符串 不能够在 UTF-8里还原 否则出错,你可以检查一下是否存在这样的问题。
      

  12.   

    我没用过mssql,我的意思就是可能mssql的编码类似gbk之类的,你传给数据库的数据是utf8的,所以才产生这样的问题,仅仅是猜测,呵呵
      

  13.   

    无法想象你在做什么!
    #2 的代码在一系列的 unset 后 $data = serialize($GLOBALS['_SESSION']);
    不知道还能剩下什么需要序列化的#3 的 $GLOBALS['_SESSION'] = unserialize($session['data']); 中的 $session['data'] 又是从哪里来的?
      

  14.   


    这个后来怎么处理的,不要告诉我把页面的GBK换掉,这是二次开发,原有的东西要尽可能保留
      

  15.   

    这个是从数据装入session的函数
        function load_session()
        {
            $session = $this->db->getRow("SELECT userid, adminid, user_name, user_rank, discount, email, data, expiry FROM ecs_sessions WHERE sesskey = '" . $this->session_id . "'");
            if (empty($session))
            {
                $this->insert_session();            $this->session_expiry = 0;
                $this->session_md5    = '40cd750bba9870f18aada2478b24840a';
                $GLOBALS['_SESSION']  = array();
            }
            else
            {
                if (!empty($session['data']) && $this->_time - $session['expiry'] <= $this->max_life_time)
                {
                    $this->session_expiry = $session['expiry'];
                    $this->session_md5    = md5($session['data']);
    //$session['data']=preg_replace('!s:(\d+):"(.*?)";!se',"'s:'.strlen('$2').':\"$2\";'",$session['data']);
                    $GLOBALS['_SESSION']  = unserialize($session['data']);
                    $GLOBALS['_SESSION']['user_id'] = $session['userid'];
                    $GLOBALS['_SESSION']['admin_id'] = $session['adminid'];
                    $GLOBALS['_SESSION']['user_name'] = $session['user_name'];
                    $GLOBALS['_SESSION']['user_rank'] = $session['user_rank'];
                    $GLOBALS['_SESSION']['discount'] = $session['discount'];
                    $GLOBALS['_SESSION']['email'] = $session['email'];
                }
                else
                {
                    $session_data = $this->db->getRow('SELECT data, expiry FROM ' . $this->session_data_table . " WHERE sesskey = '" . $this->session_id . "'");
                    if (!empty($session_data['data']) && $this->_time - $session_data['expiry'] <= $this->max_life_time)
                    {
                        $this->session_expiry = $session_data['expiry'];
                        $this->session_md5    = md5($session_data['data']);
                        $GLOBALS['_SESSION']  = unserialize($session_data['data']);
                        $GLOBALS['_SESSION']['user_id'] = $session['userid'];
                        $GLOBALS['_SESSION']['admin_id'] = $session['adminid'];
                        $GLOBALS['_SESSION']['user_name'] = $session['user_name'];
                        $GLOBALS['_SESSION']['user_rank'] = $session['user_rank'];
                        $GLOBALS['_SESSION']['discount'] = $session['discount'];
                        $GLOBALS['_SESSION']['email'] = $session['email'];
                    }
                    else
                    {
                        $this->session_expiry = 0;
                        $this->session_md5    = '40cd750bba9870f18aada2478b24840a';
                        $GLOBALS['_SESSION']  = array();
                    }
                }
            }
        }
      

  16.   

    这个是更新session的函数
        function update_session()
        {
            $adminid = !empty($GLOBALS['_SESSION']['admin_id']) ? intval($GLOBALS['_SESSION']['admin_id']) : 0;
            $userid  = !empty($GLOBALS['_SESSION']['user_id'])  ? intval($GLOBALS['_SESSION']['user_id'])  : 0;
            $user_name  = !empty($GLOBALS['_SESSION']['user_name'])  ? trim($GLOBALS['_SESSION']['user_name'])  : 0;
            $user_rank  = !empty($GLOBALS['_SESSION']['user_rank'])  ? intval($GLOBALS['_SESSION']['user_rank'])  : 0;
            $discount  = !empty($GLOBALS['_SESSION']['discount'])  ? round($GLOBALS['_SESSION']['discount'], 2)  : 0;
            $email  = !empty($GLOBALS['_SESSION']['email'])  ? trim($GLOBALS['_SESSION']['email'])  : 0;
            unset($GLOBALS['_SESSION']['admin_id']);
            unset($GLOBALS['_SESSION']['user_id']);
            unset($GLOBALS['_SESSION']['user_name']);
            unset($GLOBALS['_SESSION']['user_rank']);
            unset($GLOBALS['_SESSION']['discount']);
            unset($GLOBALS['_SESSION']['email']);        $data        = serialize($GLOBALS['_SESSION']);
            $this->_time = time();        if ($this->session_md5 == md5($data) && $this->_time < $this->session_expiry + 10)
            {
                return true;
            }        $data = addslashes($data);        if (isset($data{255}))
            {
                $this->db->autoReplace($this->session_data_table, array('sesskey' => $this->session_id, 'expiry' => $this->_time, 'data' => $data), array('data' => $data));            $data = '';
            }        return $this->db->query('UPDATE ' . $this->session_table . " SET expiry = '" . $this->_time . "', ip = '" . $this->_ip . "', userid = '" . $userid . "', adminid = '" . $adminid . "', user_name='" . $user_name . "', user_rank='" . $user_rank . "', discount='" . $discount . "', email='" . $email . "', data = '".$data."' WHERE sesskey = '" . $this->session_id . "'");
        }
      

  17.   

    文件的编码形式 不是文字的编码. 文件编码转换成一致的ansi.