【问题标题】:base64_decode truncates array causes unserialize to return falsebase64_decode 截断数组导致反序列化返回 false
【发布时间】: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
                        )

                )

        )

)

【问题讨论】:

  • 这篇文章可能对你有帮助davidwalsh.name/php-serialize-unserialize-issues
  • 能否提供$detailedInfo中的数据示例?
  • 在上面的例子中,我只有 7 个产品。导致 base64_decode(或者可能是编码)截断字符串的示例是当我有更多(200 个左右)产品时......
  • 只是一个想法......我们现在有点痴迷于 base64 编码一切。你确定你需要那个额外的步骤吗?大多数数据库为二进制数据提供列类型。至于您共享的代码,无法知道哪个功能失败了。你确定是unserialize()而不是base64_decode()了吗?
  • 两者之间会发生什么?您是将数据存储在某处还是通过可能截断数据的方式传输数据?

标签: php serialization base64 decode


【解决方案1】:

看起来很严重,我没有遇到这个问题

基本上我会复制您的数据并将其放入您的序列化和 base64 的想法中 我编写了这段代码,它可以工作......

<?php 

$products = [];
$dates = ['post' =>
            ['dtStart' =>
                [0 => '06/06/2016'], 
            'dtEnd' => 
                [0 => '08/08/2016']
            ]
            ,'hopp' => 
            ['dtStart' =>
                [0 => '2016-06-06'], 
            'dtEnd' => 
                [0 => '2016-08-08']
            ]
        ];

for($i = 0, $l = 11; $i < $l; $i++){
    $dates['weeks'][] = ['first' => '2016-06-06', 'last' => '2016-06-12'];
}

for($j = 0, $m = 7; $j < $m; $j++){
    $products[$j] = [
        'idProduct' => $j,
        'zuc' => random_int ( 100000 , 999999 ),
        'oldValue' => random_int ( 1 , 50 ),
        'value' => random_int ( 1 , 50 ),
        'hoppValue' => random_int ( 1 , 50 )
    ];
} 

$data = ['products' => $products, 'dates' => $dates];

ob_start();
var_dump($data);
$firstResult = ob_end_clean();

$rawData = base64_encode(serialize($data));

ob_start();
var_dump(unserialize(base64_decode($rawData)));
$secondResult = ob_end_clean();

var_dump(strcmp($firstResult, $secondResult)); 

结果是int(0) PHP.net 说:Returns &lt; 0 if str1 is less than str2; &gt; 0 if str1 is greater than str2, and 0 if they are equal. 这意味着没有区别。我认为您的输出已被修剪或数据库修剪了数据,请尝试弄清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2011-10-04
    • 1970-01-01
    相关资源
    最近更新 更多