社区
基础编程
帖子详情
unserialize函数错误
txbat0218
2011-10-09 04:39:42
ecshop用的是mysql,现在需要修改成mssql,原来正常运行的代码,出现unserialize错误,字符串格式化以后和serialize相同的字符串也不行,请高手帮忙看下
...全文
198
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
()
函数
php的se
ria
lize
()
函数
和
unse
ria
lize
()
函数
适用情境:se
ria
lize
()返回字符串,此字符串包含了表示value的字节流,可以存储于任何地方。这有利于存储或传递 PHP 的值,同时不丢失其类型和结构。比较有用的地方就是将数据存入数据库或记录在文件中的时候 se
ria
lize
()可处理处资源类型外所有的类型,也可以序列化对象 <?php $array = array(); $array['keys'] = 'www'; $array['values']='11111'; $a = se
ria
lize
($array); echo $a;
unse
t($array);
浅谈php
函数
se
ria
lize
()与
unse
ria
lize
()的使用方法
在php中se
ria
lize
()与
unse
ria
lize
()
函数
是一对
函数
,下面本文章就来为各位同学介绍se
ria
lize
()与
unse
ria
lize
()
函数
的使用例子,希望能帮助到各位。
PHP7 新特性:
unse
ria
lize
、 IntlChar、CSPRNG.md
在 PHP 中,`
unse
ria
lize
()`
函数
用于将已存储的序列化字符串转换回 PHP 的值。然而,`
unse
ria
lize
()`
函数
存在安全风险,因为它可能允许执行恶意代码或产生意外的行为,尤其是当反序列化的数据来自不可信的源时。 要安全地使用 `
unse
ria
lize
()`,你可以采取以下措施: 1. **验证和过滤输入**: - 确保你知道序列化的数据是如何生成的,并且它来自一个可信的源。 - 使用白名单验证来确保输入只包含预期的类和属性。 - 你可以尝试使用正则表达式或其他方法来检查序列化的字符串是否符合预期的格式。但是,请注意,这种方法可能并不完全可靠,因为序列化字符串的格式可能会随着 PHP 版本的更新而发生变化。 2. **使用安全的反序列化库**: - 考虑使用第三方库,如 `safe-
unse
ria
lize
`,它提供了更安全的反序列化功能。这些库通常通过限制允许反序列化的类和属性来降低风险。
非常好用的两个PHP
函数
se
ria
lize
()和
unse
ria
lize
()
使用se
ria
lize
()
函数
和
unse
ria
lize
()
函数
,这两个
函数
的用法真是绝配,一个是进行序列化存储,另一个则是进行序列化恢复,方便极了
信息安全_数据安全_9_ZN2018_WV_-_PHP_
unse
ria
lize
.pdf
信息安全_数据安全_9_ZN2018_WV_-_PHP_
unse
ria
lize
安全测试 数据分析 可信编译 水坑攻击 安全设计
基础编程
21,890
社区成员
140,347
社区内容
发帖
与我相关
我的任务
基础编程
从PHP安装配置,PHP入门,PHP基础到PHP应用
复制链接
扫一扫
分享
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章