unserialize函数错误

txbat0218 2011-10-09 04:39:42
ecshop用的是mysql,现在需要修改成mssql,原来正常运行的代码,出现unserialize错误,字符串格式化以后和serialize相同的字符串也不行,请高手帮忙看下
...全文
186 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
黄袍披身 2011-10-10
  • 打赏
  • 举报
回复
文件的编码形式 不是文字的编码. 文件编码转换成一致的ansi.
[Quote=引用 14 楼 txbat0218 的回复:]

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


这个后来怎么处理的,不要告诉我把页面的GBK换掉,这是二次开发,原有的东西要尽可能保留
[/Quote]
txbat0218 2011-10-10
  • 打赏
  • 举报
回复
这个是更新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 . "'");
}
txbat0218 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xuzuning 的回复:]
无法想象你在做什么!
#2 的代码在一系列的 unset 后 $data = serialize($GLOBALS['_SESSION']);
不知道还能剩下什么需要序列化的

#3 的 $GLOBALS['_SESSION'] = unserialize($session['data']); 中的 $session['data'] 又是从哪里来的?
[/Quote]


这个是从数据装入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();
}
}
}
}
txbat0218 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 phpnewnew 的回复:]
我曾经在页面编码上吃过这个亏测试了好久才弄清楚 原来在 gbk 编码的页面 序列化的字符串 不能够在 UTF-8里还原 否则出错,你可以检查一下是否存在这样的问题。
[/Quote]

这个后来怎么处理的,不要告诉我把页面的GBK换掉,这是二次开发,原有的东西要尽可能保留
xuzuning 2011-10-09
  • 打赏
  • 举报
回复
无法想象你在做什么!
#2 的代码在一系列的 unset 后 $data = serialize($GLOBALS['_SESSION']);
不知道还能剩下什么需要序列化的

#3 的 $GLOBALS['_SESSION'] = unserialize($session['data']); 中的 $session['data'] 又是从哪里来的?
sink 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 txbat0218 的回复:]

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

这个是什么意思?
[/Quote]
我没用过mssql,我的意思就是可能mssql的编码类似gbk之类的,你传给数据库的数据是utf8的,所以才产生这样的问题,仅仅是猜测,呵呵
黄袍披身 2011-10-09
  • 打赏
  • 举报
回复
我曾经在页面编码上吃过这个亏测试了好久才弄清楚 原来在 gbk 编码的页面 序列化的字符串 不能够在 UTF-8里还原 否则出错,你可以检查一下是否存在这样的问题。
txbat0218 2011-10-09
  • 打赏
  • 举报
回复
可能是编码的问题吧,mssql没有用过,不过mssql的编码应该不是utf8

这个是什么意思?
txbat0218 2011-10-09
  • 打赏
  • 举报
回复
//$session['data']=preg_replace('!s:(\d+):"(.*?)";!se',"'s:'.strlen('$2').':\"$2\";'",$session['data']);
把这个加上后前后是一致的,也不行
txbat0218 2011-10-09
  • 打赏
  • 举报
回复
$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
zongwuzong 2011-10-09
  • 打赏
  • 举报
回复
有些类型的数据不能被序列化,记得做过一个session保存购物车数据的东西,就遇到过循环的对象及一些数据需要序列化。
1、看看你的原来程序是否对mysql序列,有,去掉试试。
2、自己检测看看mmsql的有些类型不适合的,单独取出作一个数组。
sink 2011-10-09
  • 打赏
  • 举报
回复
可能是编码的问题吧,mssql没有用过,不过mssql的编码应该不是utf8
黄袍披身 2011-10-09
  • 打赏
  • 举报
回复
这样看太可怕了。
输出 serialize前的值 输出 serialize 后的值 然后把不能unserialize 的注明一下
txbat0218 2011-10-09
  • 打赏
  • 举报
回复
服务器操作系统: WINNT ()
Web 服务器: Microsoft-IIS/7.0
PHP 版本: 5.2.13 MSSQL 版本: 2039
编码: UTF-8
txbat0218 2011-10-09
  • 打赏
  • 举报
回复
$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'];
txbat0218 2011-10-09
  • 打赏
  • 举报
回复
$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']);
黄袍披身 2011-10-09
  • 打赏
  • 举报
回复
serialize & unserialize
举例

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧