反序列化数据

时间:2016-07-27 21:52:54

标签: php database

我有一些订单信息存储在名为“order_details”的数据库表行中。根据我迄今为止所做的研究,这些单元格包含一个序列化数组:

s:346:"{"total":50,"tax_perc":8.25,"shipping_total":20,"discount_total":0,"discount":"","pick_up":0,"items":[{"id":"0","amount":1,"available":1000,"price":50,"first_pet":50,"pet_count":1,"size":"4x6","type":"portrait","clothe":"93","total":50}],"size_found":false,"taxes_total":4.13,"grand_total":74.13}";

我尝试使用unserialize()但没有打印任何东西。让它序列化至少打印出细胞的内容。

当我使用unserialize()时,有什么关于为什么没有打印的想法?

另外,我正在尝试使用这些数据创建一个后端接口,所以假设unserialize()将组织这些数据,我需要能够只显示一个特定的元素(如ID)。那可能吗?或者它是否必须打印所有这些数据?

UPDATE 以下是我迄今为止的工作方式: (1)当有人下订单时,数据被序列化并抛入数据库,并向我和客户发送一封电子邮件 (2)对于我想要求的管理页面并显示所述序列化数据,我查询数据库以返回按id排序的相关表 (3)然后我有了这个,这意味着将数据抛出到UI的表格行中。

$mydata = $all_orders[$i]['order_details'];
$mydata = unserialize($mydata);
echo '<td>' . $mydata . '</td>';

此时我只是想更好地了解这些数据。我也希望能够对价格,身份证等进行排序。

提前感谢您的回复!

1 个答案:

答案 0 :(得分:2)

数据库中的字符串已经过JSON编码为字符串,然后被序列化。这就是为什么序列化字符串中的第一个字符是“s”(s表示后面的任何字符串,在您的情况下,长度为346个字符)。

unserialize()返回false的原因是因为已序列化的字符串包含未转义的双引号。当unserialize()运行时,它会失败,因为它使用前两组双引号来确定要反序列化的字符串。在您的情况下,unserialize()正在尝试反序列化以下字符串:

s:346:"{"

这会导致失败,因为两组双引号之间的字符串长度不是346个字符。

您不需要序列化已经过JSON编码的内容。选择其中一个编码选项(JSON编码或序列化),但不要同时选择两者,并坚持使用您选择的编码选项。