【问题标题】:PHP unserializing returns false when array elements are expected当需要数组元素时,PHP 反序列化返回 false
【发布时间】:2022-01-09 01:42:55
【问题描述】:

数据库表中的某些行在一列中包含序列化数据:

select * from phpbb_config where config_name like 'convert%';
+-------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+------------+
| config_name       | config_value                                                                                                                                       | is_dynamic |
+-------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+------------+
| convert_db_server | a:4:{s:4:\"dbms\";s:22:\"phpbb\\db\\driver\\mysqli\";s:6:\"dbhost\";s:9:\"127.0.0.1\";s:6:\"dbport\";s:0:\"\";s:6:\"dbname\";s:10:\"klein-putz\";} |          1 |
| convert_db_user   | a:2:{s:6:\"dbuser\";s:4:\"root\";s:8:\"dbpasswd\";s:0:\"\";}                                                                                       |          1 |
| convert_options   | a:2:{s:10:\"forum_path\";s:16:\"../../klein-putz\";s:7:\"refresh\";i:0;}                                                                           |          1 |
| convert_progress  | a:3:{s:4:\"step\";s:0:\"\";s:12:\"table_prefix\";s:6:\"phpbb_\";s:3:\"tag\";s:7:\"phpbb20\";}                                                      |          1 |
+-------------------+----------------------------------------------------------------------------------------------------------------------------------------------------+------------+

但是,当未序列化时,全部返回 false,而不是设置许多数组元素,这表明它们不是正确序列化的值。

代码行可以看这里:

https://github.com/phpbb/phpbb/blob/f8aa5fa34df41fcb5d493ea4e7e3931e7e9897ad/phpBB/install/convert/convertor.php#L96-L100

我听说当你序列化某些东西时,它基本上是 JSON。我通过一个 JSON 验证器运行这些,它们都失败了。只是不清楚为什么。

【问题讨论】:

    标签: php json serialization phpbb3


    【解决方案1】:

    您的数据库字符串中有多余的反斜杠。

    试试这个代码:

    <?php
    $data1 = 'a:3:{s:4:"step";s:0:"";s:12:"table_prefix";s:6:"phpbb_";s:3:"tag";s:7:"phpbb20";}';
    $data2 = 'a:3:{s:4:\"step\";s:0:\"\";s:12:\"table_prefix\";s:6:\"phpbb_\";s:3:\"tag\";s:7:\"phpbb20\";}';
    
    $test1 = unserialize($data1);
    $test2 = unserialize($data2);
    
    echo "<br>case1:";
    var_dump($test1);
    
    echo "<br>case2:";
    var_dump($test2);
    ?>
    

    如您所见,$data1 已正确反序列化,但 $data2 返回 false。

    【讨论】:

    • 非常感谢!这似乎是 phpBB 软件某处的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多