【发布时间】:2016-06-15 10:08:16
【问题描述】:
我正在在线应用程序上记录用户操作。所以,我有一个相当大(但不是那么大)的多维数组存储到数据库中。 为此,我使用 base64 编码/解码和序列化/反序列化。
这是我用来序列化数组的方法:
$this->detail = base64_encode(serialize($detailedInfo));
这里我是如何取回数据的:
$logDetail = unserialize(base64_decode($log->detail));
有时,反序列化会返回 false。
我进行了一些调试,发现当数组变大时,base64 编码或解码会截断数据。 这是一个较小数组上的 base64_decode 结果转储:
a:2:{s:8:"products";a:7:{i:15;a:5:{s:9:"idProduct";s:2:"15";s:3:"zuc";s:6:"110224";s:8:"oldValue";s:6:"15,000";s:5:"value";s:2:"17";s:9:"hoppValue";d:17;}i:837;a:5:{s:9:"idProduct";s:3:"837";s:3:"zuc";s:6:"322713";s:8:"oldValue";s:6:"15,000";s:5:"value";s:2:"17";s:9:"hoppValue";d:17;}i:2405;a:5:{s:9:"idProduct";s:4:"2405";s:3:"zuc";s:6:"849755";s:8:"oldValue";s:6:"15,000";s:5:"value";s:2:"17";s:9:"hoppValue";d:17;}i:2433;a:5:{s:9:"idProduct";s:4:"2433";s:3:"zuc";s:6:"855839";s:8:"oldValue";s:6:"15,000";s:5:"value";s:2:"17";s:9:"hoppValue";d:17;}i:2494;a:5:{s:9:"idProduct";s:4:"2494";s:3:"zuc";s:6:"921545";s:8:"oldValue";s:6:"15,000";s:5:"value";s:2:"17";s:9:"hoppValue";d:17;}i:2625;a:5:{s:9:"idProduct";s:4:"2625";s:3:"zuc";s:6:"971694";s:8:"oldValue";s:6:"15,000";s:5:"value";s:2:"17";s:9:"hoppValue";d:17;}i:2626;a:5:{s:9:"idProduct";s:4:"2626";s:3:"zuc";s:6:"971769";s:8:"oldValue";s:6:"15,000";s:5:"value";s:2:"17";s:9:"hoppValue";d:17;}}s:5:"dates";a:3:{s:4:"post";a:2:{s:7:"dtStart";a:1:{i:0;s:10:"06/06/2016";}s:5:"dtEnd";a:1:{i:0;s:10:"08/08/2016";}}s:4:"hopp";a:2:{s:7:"dtStart";a:1:{i:0;s:10:"2016-06-06";}s:5:"dtEnd";a:1:{i:0;s:10:"2016-08-08";}}s:5:"weeks";a:11:{i:0;a:2:{s:5:"first";s:10:"2016-06-06";s:4:"last";s:10:"2016-06-12";}i:1;a:2:{s:5:"first";s:10:"2016-06-13";s:4:"last";s:10:"2016-06-19";}i:2;a:2:{s:5:"first";s:10:"2016-06-20";s:4:"last";s:10:"2016-06-26";}i:3;a:2:{s:5:"first";s:10:"2016-06-27";s:4:"last";s:10:"2016-06-30";}i:4;a:2:{s:5:"first";s:10:"2016-07-01";s:4:"last";s:10:"2016-07-03";}i:5;a:2:{s:5:"first";s:10:"2016-07-04";s:4:"last";s:10:"2016-07-10";}i:6;a:2:{s:5:"first";s:10:"2016-07-11";s:4:"last";s:10:"2016-07-17";}i:7;a:2:{s:5:"first";s:10:"2016-07-18";s:4:"last";s:10:"2016-07-24";}i:8;a:2:{s:5:"first";s:10:"2016-07-25";s:4:"last";s:10:"2016-07-31";}i:9;a:2:{s:5:"first";s:10:"2016-08-01";s:4:"last";s:10:"2016-08-07";}i:10;a:2:{s:5:"first";s:10:"2016-08-08";s:4:"last";s:10:"2016-08-14";}}}}
这里反序列化工作正常!
当数组较大时,它会被截断(由于正文字符数限制,只是字符串行的结尾):
(...) a:5:{s:9:"idProduct";s:4:"2237";s:3:"zuc";s:6:"712854";s:8:"oldValue";s:6:"12,000";s:5:"value";s:2:"15";s:9:"hoppValue";d:15;}i:2267;a:5:{s:9:"idProduct";s:4:"2267";s:3:"zuc";s:6:"712954";s:8:"oldValue";s:6:"12,000";s:5:"value";s:2:"15";s:9:"hoppValue";d:15;}i:2285;a:5:{s:9:"idProduct";s:4:"2285";s:3:"zuc";s:6:"712975";s:8:"oldValue";s:6:"12,000";s:5:"value";s:2:"15";s:9:"hoppValue";d:15;}i:2287;a:5:{s:9:"idProduct";s:4:"2287";s:3:"zuc";s:6:"712979";s:8:"oldValue";s:6:"12,000";s:5:"value";s:2:"15";s:9:"hoppValue";d:15;}i:2312;a:5:{s:9:"idProduct";s:4:"2312";s:3:"zuc";s:6:"753212";s:8:"oldValue";s:6:"12,000";s:5:"value";s:2:"15";s:9:"hoppValue";d:15;}i:2317;a:5:{s:9:"idProduct";s:4:"2317";s:3:"zuc";s:6:"754455";s:8:"oldValue";s:6:"12,000";s:5:"value";s:2:"15";s:9:"hoppValue";d:15;}i:2324;a:5:{s:9:"idProduct";s:4:"2324";s:3:"zuc";s:6:"757439";s:8:"oldValue";s:6:"12,000";s:5:"value";s:2:"15";s:9:"hoppValue";d:15;}i:2336;a:5:{s:9:"idProduct";s:4:"2336";s:3:"zuc";s:6:"759302";s:8:"oldValue";s:6:"12,000";s:5:"value";s:2:"15";s:9:"hoppValue";d:15;}i:2338;a:4:{s:9:"idProduct";s:4:"2338";s:3:"zuc";s:6:"759302";s:8:"oldValue";s:6:"12,000";s:5:"value";s:2:"15";}i:2343;a:5:{s:9:"idProduct";s:4:"2343";s:3:"zuc";s:6:"765495";s:8:"oldValue";s:6:"12,000";s:5:"value";s:2:"15";s:9:"hoppValue";d:15;}i:2351;a:5:{s:9:"idProduct";s:4:"2351";s:3:"zuc";s:6:
然后,反序列化返回 false。
我做错了吗?要编码/解码的数组的大小是否有限制(在任何地方都没有找到任何信息)
这是一个 logDetail 数组的例子(一个小例子,有效):
Array
(
[products] => Array
(
[15] => Array
(
[idProduct] => 15
[zuc] => 110224
[oldValue] => 17,000
[value] => 20
[hoppValue] => 20
)
[837] => Array
(
[idProduct] => 837
[zuc] => 322713
[oldValue] => 17,000
[value] => 20
[hoppValue] => 20
)
[2405] => Array
(
[idProduct] => 2405
[zuc] => 849755
[oldValue] => 17,000
[value] => 20
[hoppValue] => 20
)
[2433] => Array
(
[idProduct] => 2433
[zuc] => 855839
[oldValue] => 17,000
[value] => 20
[hoppValue] => 20
)
[2494] => Array
(
[idProduct] => 2494
[zuc] => 921545
[oldValue] => 17,000
[value] => 20
[hoppValue] => 20
)
[2625] => Array
(
[idProduct] => 2625
[zuc] => 971694
[oldValue] => 17,000
[value] => 20
[hoppValue] => 20
)
[2626] => Array
(
[idProduct] => 2626
[zuc] => 971769
[oldValue] => 17,000
[value] => 20
[hoppValue] => 20
)
)
[dates] => Array
(
[post] => Array
(
[dtStart] => Array
(
[0] => 06/06/2016
)
[dtEnd] => Array
(
[0] => 08/08/2016
)
)
[hopp] => Array
(
[dtStart] => Array
(
[0] => 2016-06-06
)
[dtEnd] => Array
(
[0] => 2016-08-08
)
)
[weeks] => Array
(
[0] => Array
(
[first] => 2016-06-06
[last] => 2016-06-12
)
[1] => Array
(
[first] => 2016-06-13
[last] => 2016-06-19
)
[2] => Array
(
[first] => 2016-06-20
[last] => 2016-06-26
)
[3] => Array
(
[first] => 2016-06-27
[last] => 2016-06-30
)
[4] => Array
(
[first] => 2016-07-01
[last] => 2016-07-03
)
[5] => Array
(
[first] => 2016-07-04
[last] => 2016-07-10
)
[6] => Array
(
[first] => 2016-07-11
[last] => 2016-07-17
)
[7] => Array
(
[first] => 2016-07-18
[last] => 2016-07-24
)
[8] => Array
(
[first] => 2016-07-25
[last] => 2016-07-31
)
[9] => Array
(
[first] => 2016-08-01
[last] => 2016-08-07
)
[10] => Array
(
[first] => 2016-08-08
[last] => 2016-08-14
)
)
)
)
【问题讨论】:
-
能否提供
$detailedInfo中的数据示例? -
在上面的例子中,我只有 7 个产品。导致 base64_decode(或者可能是编码)截断字符串的示例是当我有更多(200 个左右)产品时......
-
只是一个想法......我们现在有点痴迷于 base64 编码一切。你确定你需要那个额外的步骤吗?大多数数据库为二进制数据提供列类型。至于您共享的代码,无法知道哪个功能失败了。你确定是
unserialize()而不是base64_decode()了吗? -
两者之间会发生什么?您是将数据存储在某处还是通过可能截断数据的方式传输数据?
标签: php serialization base64 decode