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; 时就应该发现这个问题了只可惜,你只在浏览器中看了一下,却没有去看一下“网页源代码” 跪求:PHP版个人博客 curl上传文件到远程服务器的问题 ecshop问题 求黄页源码 这个字符怎么得不到 大家说php不学框架行不行,直接用html与php混写中吗?(请明白人给我说下,谢谢) 想请人做一个网站,大家看看多少钱 plupload上传附件的控件在IE拖动功能无效 ESP8266WIFI 模块链接新浪云服务 提示HTTP/1.1 400 Bad Request thinkphp好像有个大D方法可以传变量到css 数组如何放入数据库中(数据库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元";}}
只可惜,你只在浏览器中看了一下,却没有去看一下“网页源代码”