反序列化PHP数组不起作用

时间:2017-08-24 18:14:22

标签: php mysql deserialization blob

我将以下序列化数组存储在MySQL longblob数据字段中:

Array
(
)

在PHP中,当我查询字段,对其进行反序列化并将其打印出来时,将打印以下空数组:

CREATE TABLE `order` (
  `state` varchar(255) CHARACTER SET ascii DEFAULT NULL,
  `data` longblob,
  `created` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

这是表create语句:

ftr.fvA

3 个答案:

答案 0 :(得分:1)

您的序列化数据无效。您绝不能手动编制序列化数据。

字符串被序列化为:

s:<i>:"<s>";

其中<i>是表示字符串长度<s>的整数,<s>是字符串值。

因此,在这种情况下,有效数据是:

a:1:{s:10:"attributes";a:1:{s:13:"Ticket Holder";a:1:{i:0;s:8:"Joe Blow";}}}

Joe Blow字符串长度为8,但在序列化字符串中定义为13.

请参阅:Structure of a Serialized PHP string

答案 1 :(得分:0)

在SELECT语句中将列转换为UTF8,然后对其进行反序列化。

CONVERT (data USING utf8)

我不确定为什么这是必要的。我猜这与utf8mb4_general_ci整理有关。

感谢所有帮助人员!

答案 2 :(得分:-1)

使用base64_encode

核心问题来自数据库完成的二进制编码以及它添加到存储值的额外字节。这会“破坏”从数据库中提取的数据并导致unserialize失败。为了帮助缓解此问题,您可以使用base64_encodebase64_decode,这样您就可以轻松地插入和提取数据。

// data is encoded before insert
$dataToInsert = base64_encode(serialize($myArray));

// decode the data before unserializing it
$dataToRead = unserialize(base64_decode($longblob));