社区
基础编程
帖子详情
unserialize函数错误
txbat0218
2011-10-09 04:39:42
ecshop用的是mysql,现在需要修改成mssql,原来正常运行的代码,出现unserialize错误,字符串格式化以后和serialize相同的字符串也不行,请高手帮忙看下
...全文
195
17
打赏
收藏
unserialize函数错误
ecshop用的是mysql,现在需要修改成mssql,原来正常运行的代码,出现unserialize错误,字符串格式化以后和serialize相同的字符串也不行,请高手帮忙看下
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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中se
ria
lize
()和
unse
ria
lize
()
函数
- 当 `
unse
ria
lize
()` 遇到无法识别的格式或无效的序列化字符串时,它会返回 `false`,并可能生成一个
错误
。因此,在使用 `
unse
ria
lize
()` 前,最好先检查字符串是否有效。 - 序列化后的字符串可能包含恶意代码,...
浅谈php
函数
se
ria
lize
()与
unse
ria
lize
()的使用方法
在处理序列化数据时,必须保证使用的是正确的
函数
,否则可能会引发
错误
或安全问题。例如,使用
unse
ria
lize
()时,如果输入的字符串不是有效的序列化字符串,或者字符串是由不可信来源提供的,那么就可能引起代码执行...
PHP7 新特性:
unse
ria
lize
、 IntlChar、CSPRNG.md
- 可以通过修改`
unse
ria
lize
`
函数
的回调
函数
来处理潜在的危险类和
函数
。例如,可以在回调
函数
中检查类名并决定是否允许反序列化。 - 在PHP 7.4及更高版本中,可以使用`
unse
ria
lize
`的第二个参数来指定一个白名单,...
非常好用的两个PHP
函数
se
ria
lize
()和
unse
ria
lize
()
在使用 `
unse
ria
lize
()` 时,需要确保提供的字符串是由 `se
ria
lize
()` 生成的,否则可能会抛出
错误
。同时,为了提高安全性,应当避免反序列化不受信任的数据,因为恶意用户可能会构造特殊的序列化字符串来执行任意...
信息安全_数据安全_9_ZN2018_WV_-_PHP_
unse
ria
lize
.pdf
在本文中,我们将深入探讨与“信息安全”和“数据安全”相关的主题,特别是关于PHP `
unse
ria
lize
`
函数
的安全性问题。`
unse
ria
lize
`是PHP的一个内置
函数
,它用于从存储的表示形式创建PHP值。然而,这个功能在不适当...
基础编程
21,893
社区成员
140,347
社区内容
发帖
与我相关
我的任务
基础编程
从PHP安装配置,PHP入门,PHP基础到PHP应用
复制链接
扫一扫
分享
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章