php序列化 我用php可以序列化对象的属性,但是却不能解序列化对象的属性,这是什么原因啊?有解决的方法吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 怎么加载对象的类定义啊?从数据库取出数据。$findAll=parent::select($this->_fields,array('where'=>array("a.id=b.proid AND a.id={$this->_R['id']}")));//此时需要反序列化字段info中的数据。$findAll[0]->info=unserialize($findAll[0]->info);然而却不能反序列化,返回false 我是这样处理的:php.ini中session.autostart=0//禁止在每个页面中使用class xx{};//类的定义session_start();对象不需要序列化和反序列化 比如:class Info{};//类的定义$obj=new Info();//创建对象d$=serialize( $obj ); //序列化对象update table ...// 存入数据库表中-------------------取数据时:class Info{};//类的定义,可将类的定义单独放到一个文件中,然后require进来select info from table;//从数据表中取数据$val= (Info)unserialize( info ); // 反序列化 这就是我序列化的串:a:3:{i:3;a:2:{i:0;s:6:"1-2台";i:1;s:7:"1000元";}i:4;a:2:{i:0;s:6:"3-5台";i:1;s:7:"1800元";}i:5;a:2:{i:0;s:6:"3-8台";i:1;s:7:"2400元";}}问题是这个串却不能反序列化,因为这个串是存在数据库的,我调用的时候,是用对象的方式,去反序列化这个字段。 unserialize(): Error at offset 29 of 135 bytes in ???他是 utf-8 编码的,当做 gbk 就要出错!$s = 'a:3:{i:3;a:2:{i:0;s:6:"1-2台";i:1;s:7:"1000元";}i:4;a:2:{i:0;s:6:"3-5台";i:1;s:7:"1800元";}i:5;a:2:{i:0;s:6:"3-8台";i:1;s:7:"2400元";}}';$s = iconv('gbk', 'utf-8', $s);print_r(unserialize($s));Array( [3] => Array ( [0] => 1-2台 [1] => 1000元 ) [4] => Array ( [0] => 3-5台 [1] => 1800元 ) [5] => Array ( [0] => 3-8台 [1] => 2400元 )) public function findAll(){ $this->_tables=array(DB_FREFIX.'goods a',DB_FREFIX.'goods_imgs b',DB_FREFIX.'brand c',DB_FREFIX.'nav d'); $this->_fields=array('a.id','a.name','a.more','a.sn','a.inventory','sendaddress','price_sale','price_et','discount','keyword','thumbnail','content','c.name as brandname','c.url','d.name as navname'); //array_push($this->_fields, 'p1small','p1big', 'p2small','p2big', 'p3small','p3big', 'p4small','p4big', 'p5small','p5big'); $findData= parent::select($this->_fields,array('where'=>array("a.id=b.proid AND a.nav=d.id AND a.id={$this->_R['id']}"))); $findData[0]->okSale=rand(10,1000); $findData[0]->content=htmlspecialchars_decode($selectData[0]->content); $findData[0]->freight=DISCOUNT; $findData[0]->more=unserialize($findData[0]->more);//此时就无法解序列化了,more字段就是一个序列串。 return $findData; } echo $findData[0]->more;贴出结果只要数据格式是正确的,就不会解不开! 这就是结果:a:3:{i:3;a:2:{i:0;s:6:"1-2台";i:1;s:7:"1000元";}i:4;a:2:{i:0;s:6:"3-5台";i:1;s:7:"1800元";}i:5;a:2:{i:0;s:6:"3-8台";i:1;s:7:"2400元";}} #13 不是已有示例了吗?格式说明:s:6:"1-2台" 中s 表示是字符串6 表示这个字符串的长度是 6"1-2台" 去掉两端的双引号就是字符串的内容了因为他指示的字符串长度为 6,所以这个序列化串原始的数据是 utf-8 的:1-2 长度是3,台 utf-8的长度是 3一共 6 个字节,如果原始数据是 gbk 的,那么长度就是 5 了如果你反序列化不成功,则表示你把 utf-8 的串转成了 gbk 的串了 NO,我贴出来的数据,是原始的数据,没有经过反序列化的,是直接从数据库中取出来的。如果我加unserialize($findData[0]->more);此时就是空的,也就是反序列化失败。 对呀!#18 的不就是序列化后的数据吗?要不你就再echo base64_encode($findData[0]->more);贴出结果 YTozOntpOjM7YToyOntpOjA7czo2OiZxdW90OzEtMuWPsCZxdW90OztpOjE7czo3OiZxdW90OzEwMDDlhYMmcXVvdDs7fWk6NDthOjI6e2k6MDtzOjY6JnF1b3Q7My015Y+wJnF1b3Q7O2k6MTtzOjc6JnF1b3Q7MTgwMOWFgyZxdW90Ozt9aTo1O2E6Mjp7aTowO3M6NjomcXVvdDszLTjlj7AmcXVvdDs7aToxO3M6NzomcXVvdDsyNDAw5YWDJnF1b3Q7O319此时的编码数据是直接从数据库中拿的序列化串,没有反序列化。 真奇怪,你们入库时为什么要做 html 转义呢?unserialize(html_entity_decode($findData[0]->more))就可以了你的数据base64解码后a:3:{i:3;a:2:{i:0;s:6:"1-2台";i:1;s:7:"1000元";}i:4;a:2:{i:0;s:6:"3-5台";i:1;s:7:"1800元";}i:5;a:2:{i:0;s:6:"3-8台";i:1;s:7:"2400元";}}html_entity_decode 后a:3:{i:3;a:2:{i:0;s:6:"1-2台";i:1;s:7:"1000元";}i:4;a:2:{i:0;s:6:"3-5台";i:1;s:7:"1800元";}i:5;a:2:{i:0;s:6:"3-8台";i:1;s:7:"2400元";}} 其实你早在 echo $findData[0]->more; 时就应该发现这个问题了只可惜,你只在浏览器中看了一下,却没有去看一下“网页源代码” 新建qq群 这个是什么原因产生的? 织梦里面怎么实现内容连载 dedecms 自定义搜索 不能使用autoindex php实现即时通信 请高手指点这几句代码什么意思 关于html2pdf的一个问题 %s %t %f %i %s %d %n 在discuz数据调取时该怎么用 求一段删除时根据条件做出不同处理的代码 php请求webservice接口报错,Fatal error: Uncaught SoapFault exception: [HTTP] Not Found 数组如何放入数据库中(数据库gbk编码) 求助!获取真实图片地址
从数据库取出数据。
$findAll=parent::select($this->_fields,array('where'=>array("a.id=b.proid AND a.id={$this->_R['id']}")));
//此时需要反序列化字段info中的数据。
$findAll[0]->info=unserialize($findAll[0]->info);然而却不能反序列化,返回false
php.ini中session.autostart=0//禁止在每个页面中使用
class xx{};//类的定义
session_start();对象不需要序列化和反序列化
比如:
class Info{};//类的定义
$obj=new Info();//创建对象
d$=serialize( $obj ); //序列化对象
update table ...// 存入数据库表中
-------------------
取数据时:
class Info{};//类的定义,可将类的定义单独放到一个文件中,然后require进来
select info from table;//从数据表中取数据
$val= (Info)unserialize( info ); // 反序列化
a:3:{i:3;a:2:{i:0;s:6:"1-2台";i:1;s:7:"1000元";}i:4;a:2:{i:0;s:6:"3-5台";i:1;s:7:"1800元";}i:5;a:2:{i:0;s:6:"3-8台";i:1;s:7:"2400元";}}问题是这个串却不能反序列化,因为这个串是存在数据库的,我调用的时候,是用对象的方式,去反序列化这个字段。
他是 utf-8 编码的,当做 gbk 就要出错!$s = 'a:3:{i:3;a:2:{i:0;s:6:"1-2台";i:1;s:7:"1000元";}i:4;a:2:{i:0;s:6:"3-5台";i:1;s:7:"1800元";}i:5;a:2:{i:0;s:6:"3-8台";i:1;s:7:"2400元";}}';
$s = iconv('gbk', 'utf-8', $s);
print_r(unserialize($s));Array
(
[3] => Array
(
[0] => 1-2台
[1] => 1000元
) [4] => Array
(
[0] => 3-5台
[1] => 1800元
) [5] => Array
(
[0] => 3-8台
[1] => 2400元
))
public function findAll(){
$this->_tables=array(DB_FREFIX.'goods a',DB_FREFIX.'goods_imgs b',DB_FREFIX.'brand c',DB_FREFIX.'nav d');
$this->_fields=array('a.id','a.name','a.more','a.sn','a.inventory','sendaddress','price_sale','price_et','discount','keyword','thumbnail','content','c.name as brandname','c.url','d.name as navname');
//array_push($this->_fields, 'p1small','p1big', 'p2small','p2big', 'p3small','p3big', 'p4small','p4big', 'p5small','p5big');
$findData= parent::select($this->_fields,array('where'=>array("a.id=b.proid AND a.nav=d.id AND a.id={$this->_R['id']}")));
$findData[0]->okSale=rand(10,1000);
$findData[0]->content=htmlspecialchars_decode($selectData[0]->content);
$findData[0]->freight=DISCOUNT;
$findData[0]->more=unserialize($findData[0]->more);//此时就无法解序列化了,more字段就是一个序列串。
return $findData;
}
贴出结果
只要数据格式是正确的,就不会解不开!
格式说明:
s:6:"1-2台" 中
s 表示是字符串
6 表示这个字符串的长度是 6
"1-2台" 去掉两端的双引号就是字符串的内容了因为他指示的字符串长度为 6,所以这个序列化串原始的数据是 utf-8 的:1-2 长度是3,台 utf-8的长度是 3
一共 6 个字节,如果原始数据是 gbk 的,那么长度就是 5 了
如果你反序列化不成功,则表示你把 utf-8 的串转成了 gbk 的串了
如果我加unserialize($findData[0]->more);此时就是空的,也就是反序列化失败。
echo base64_encode($findData[0]->more);
贴出结果
YTozOntpOjM7YToyOntpOjA7czo2OiZxdW90OzEtMuWPsCZxdW90OztpOjE7czo3OiZxdW90OzEwMDDlhYMmcXVvdDs7fWk6NDthOjI6e2k6MDtzOjY6JnF1b3Q7My015Y+wJnF1b3Q7O2k6MTtzOjc6JnF1b3Q7MTgwMOWFgyZxdW90Ozt9aTo1O2E6Mjp7aTowO3M6NjomcXVvdDszLTjlj7AmcXVvdDs7aToxO3M6NzomcXVvdDsyNDAw5YWDJnF1b3Q7O319此时的编码数据是直接从数据库中拿的序列化串,没有反序列化。
unserialize(html_entity_decode($findData[0]->more))
就可以了你的数据base64解码后
a:3:{i:3;a:2:{i:0;s:6:"1-2台";i:1;s:7:"1000元";}i:4;a:2:{i:0;s:6:"3-5台";i:1;s:7:"1800元";}i:5;a:2:{i:0;s:6:"3-8台";i:1;s:7:"2400元";}}html_entity_decode 后a:3:{i:3;a:2:{i:0;s:6:"1-2台";i:1;s:7:"1000元";}i:4;a:2:{i:0;s:6:"3-5台";i:1;s:7:"1800元";}i:5;a:2:{i:0;s:6:"3-8台";i:1;s:7:"2400元";}}
只可惜,你只在浏览器中看了一下,却没有去看一下“网页源代码”