社区
基础编程
帖子详情
unserialize函数错误
txbat0218
2011-10-09 04:39:42
ecshop用的是mysql,现在需要修改成mssql,原来正常运行的代码,出现unserialize错误,字符串格式化以后和serialize相同的字符串也不行,请高手帮忙看下
...全文
226
17
打赏
收藏
unserialize函数错误
ecshop用的是mysql,现在需要修改成mssql,原来正常运行的代码,出现unserialize错误,字符串格式化以后和serialize相同的字符串也不行,请高手帮忙看下
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
举例
php
unse
ria
lize
数组,php
unse
ria
lize
函数
反序列话数组
有没有,遇到这种情况:使用se
ria
lize
函数
序列化一个数组后,然后想通过
unse
ria
lize
函数
反序话,得到该数组,可是确报错,得不到想要的结果。从网上搜索,发现很多网友都遇到相同的问题,好像说这是
unse
ria
lize
函数
的bug。不过,好在有人已经解决了,我就借花献佛,将他记录下来,供大家使用:1.假如,是utf-8的数据,请使用下面的
函数
反序列化(我没有验证,可以尝试下)functio...
php
unse
ria
lize
bool(false),php
unse
ria
lize
返回false的解决方法
php
unse
ria
lize
返回false的解决方法php 提供se
ria
lize
(序列化) 与
unse
ria
lize
(反序列化)方法。使用se
ria
lize
序列化后,再使用
unse
ria
lize
反序列化就可以获取原来的数据。$arr=array('name'=>'fdipzone','gender'=>'male');$str=se
ria
lize
($arr);//序列化echo...
mysql
unse
ria
lize
_
unse
ria
lize
()
unse
ria
lize
()(PHP 4, PHP 5, PHP 7)从已存储的表示中创建 PHP 的值说明
unse
ria
lize
(string$str):mixed
unse
ria
lize
()对单一的已序列化的变量进行操作,将其转换回 PHP 的值。参数$str序列化后的字符串。若被解序列化的变量是一个对象,在成功地重新构造对象之后,PHP 会自动地试图去调用__wakeup()成员
函数
(如果存在的...
长度问题:php
函数
unse
ria
lize
数据返回false问题分析
unse
ria
lize
的这个问题是由一个emlog论坛用户在使用时报错而发现的问题表现情况如下:emlog缓存的保存方式是将php的数据对象(数组)序列化(se
ria
lize
)后以文件的形式存放,读取缓存的时候直接反序列化(
unse
ria
lize
)缓存字符串即可读取数据,关于序列化和反序列化的原理请看我先前的文章《php
函数
se
ria
lize
()与
unse
ria
lize
()不完全研究》
php
unse
ria
lize
bool(false),php
unse
ria
lize
返回false的解決方法
php
unse
ria
lize
返回false的解決方法php 提供se
ria
lize
(序列化) 與
unse
ria
lize
(反序列化)方法。使用se
ria
lize
序列化后,再使用
unse
ria
lize
反序列化就可以獲取原來的數據。$arr = array('name' => 'fdipzone','gender' => 'male');$str = se
ria
lize
($arr); /...
基础编程
21,889
社区成员
140,337
社区内容
发帖
与我相关
我的任务
基础编程
从PHP安装配置,PHP入门,PHP基础到PHP应用
复制链接
扫一扫
分享
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章