反序列化数据

3

我有一些订单信息存储在名为“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)。是否可能?还是它必须打印所有数据?

更新: 以下是我的工作方式: (1)当有人下订单时,数据被序列化并抛到数据库中,并向我和客户发送电子邮件 (2)对于我希望询问和显示所述序列化数据的这个管理页面,我查询数据库以返回按id排序的相关表格 (3)然后我有了这个,它旨在将该数据投入UI上的表行。

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

目前我只是想更好地了解那些数据,希望能够对价格、ID等进行排序。

提前感谢您的回复!


2
你是如何反序列化数据的?展示一下代码!因为看起来你已经将一些 JSON 序列化了(而且毫无意义)。 - Mark Baker
unserialize()在失败时返回布尔值FALSE,这会被打印/回显为空字符串(例如不可见)。你需要使用var_dump()来代替。 - Marc B
@MarkBaker 我更新了问题并展示了一些代码。如果您需要查看更多,请告诉我。 - coatandtails
@MarkBaker 另外,var_dump() 打印出 "bool(false)"。 - coatandtails
1个回答

2
您的数据库中的字符串已被JSON编码为字符串,然后进行了序列化。这就是为什么序列化字符串中的第一个字符是"s"(s表示接下来是一个字符串,在您的情况下,长度为346个字符)的原因。 unserialize()返回false的原因是被序列化的字符串包含未转义的双引号。当unserialize()运行时,它会失败,因为它使用前两组双引号来确定要反序列化的字符串。在您的情况下,unserialize()正试图反序列化以下字符串:
s:346:"{"

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

如果已经对某物进行了JSON编码,就不需要再对其进行序列化。选择其中一种编码选项(JSON编码或序列化),但不要同时使用两种,并坚持您所选择的那种。


谢谢David!我会试一试。 - coatandtails

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接