社区
基础编程
帖子详情
unserialize函数错误
txbat0218
2011-10-09 04:39:42
ecshop用的是mysql,现在需要修改成mssql,原来正常运行的代码,出现unserialize错误,字符串格式化以后和serialize相同的字符串也不行,请高手帮忙看下
...全文
186
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
错误
日志的获取方法
在PHP中
错误
日志的获取方法有很多种,下面我给大家简单介绍下遇到此类问题如何解决,下面通过代码给大家展示下,希望能够帮助到大家。 <?php error_reporting (0); register_shutdown_function($err = 'my_error_handler') OR set_error_handler($err,E_ALL); // 同时注册两个
函数
. //
函数
参数
错误
$original =
unse
ria
lize
( array(423142,2134234)); // 不可对0除 echo 1/0; // 不存在的数组索引 echo $_GET['aa'
redux:R的Redis客户端
还原 redux提供了与Redis的接口。 提供两个接口; 一个低级接口(允许执行几乎没有接口的任意Redis命令)和一个具有与数百个Redis命令都匹配的API的高级接口。 除了支持Redis命令, redux支持: 流水线:在单个Redis往返中执行多个命令,这可以大大提高性能,尤其是在高延迟连接上。 套接字连接:可以通过unix套接字(如果已配置Redis的话)连接到本地运行的Redis实例,以实现更快的通信。 灵活的序列化:序列化Redis命令的任何部分,包括键和字段。 通过object_to_bin / bin_to_object支持二进制序列化,它们是se
ria
lize
/反
unse
ria
lize
精简包装 subscriptions :创建一个简单的阻止订阅客户端,将回调
函数
应用于收到的每条消息。
错误
处理:每个Redis
错误
都会变成R
错误
。 redux还提供了的
php
unse
ria
lize
()
函数
,php
unse
ria
lize
函数
出错,很奇怪?
$test_str = "code|s:5:\"ZH9JC\";state|s:10:\"wn4rzbnxpp\";";var_dump(
unse
ria
lize
($test_str));这是代码,简单的字符串,但还是出错。。。回复内容:$test_str = "code|s:5:\"ZH9JC\";state|s:10:\"wn4rzbnxpp\";";var_dump(
unse
ria
lize
($...
PHP序列化中se
ria
lize
与
unse
ria
lize
函数
在php中,序列化用与存储或传递php的值的过程,同时不丢失其结构和数据类型。
函数
包括se
ria
lize
()、
unse
ria
lize
();魔术方法包括__sleep() wakeup();预定义接口Se
ria
lizable; 目录 【1】se
ria
lize
()与
unse
ria
lize
() 【2】各种变量的序列化结果 【3】序列化对象 【4】序列化对象中的__sleep()魔术方法 ...
php se
ria
lize
漏洞,PHP序列化
函数
unse
ria
lize
/se
ria
lize
在漏洞挖掘中的利用
刚做PHP代码审计不久,之前有听说过
unse
ria
lize
的问题,不过都没有仔细去深入研究过。正好这段时间在审计某系统的时候看到了使用
unse
ria
lize
函数
,便花了点时间去研究了下。同时也特别感谢下在过程中给我提供不少帮助的黑哥黑友们。
unse
ria
lize
函数
功能和用法就没必要详细说了,毕竟这个不是本文的重点,而且官方的手册专业了点,有点难懂。不了解的朋友可以自信先去baidu搞清楚seri...
基础编程
21,887
社区成员
140,364
社区内容
发帖
与我相关
我的任务
基础编程
从PHP安装配置,PHP入门,PHP基础到PHP应用
复制链接
扫一扫
分享
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章