【问题标题】:unserialize data in laravel在 laravel 中反序列化数据
【发布时间】:2018-06-15 23:48:33
【问题描述】:

我使用serialize 方法将我的购物车数据保存到orders 表中,现在在我的订单“查看”页面中,我想向用户显示他们的订单历史记录。

如何在 PHP 中将之前序列化的数据恢复为可用的对象/数组?

我保存数据的位置的代码 sn-p:$order->cart = serialize($cartItems);

我尝试返回订单索引视图的方法:

/**
 * Action to receive all orders from the current
 * logged-in user. This action will return the
 * 'front.orders' view with the orders compacted inside.
 *
 * @return orders view
 */
public function orders() {
    // get the orders from the current logged in user
    $orders = Order::where('user_id', '=', Auth::user()->id)->get();

    // view the `front.orders` page passing in the `orders` variable
    return view('front.orders', compact('orders'));
}

【问题讨论】:

    标签: php laravel serialization


    【解决方案1】:

    您可以使用map() 方法将unserialize 购物车属性用于整个集合:

    $orders = $orders->map(function($i) {
        $i->cart = unserialize($i->cart);
        return $i;
    });
    

    或者,您可以使用accessor 自动反序列化属性:

    public function getCartAttribute($value)
    {
        return unserialize($value);
    }
    

    或者只是unserialize Blade 中的数据:

    @foreach ($orders as $order)
        {{ unserialize($order->cart)->someData }}
    @endforeach
    

    【讨论】:

    • 如果我使用地图,我如何使用我的查询来只获取记录的用户订单而不是所有用户?
    • @mafortis 您显示的代码只会登录用户的订单。下单后使用地图即可。
    • 我收到unserialize(): Error at offset 0 of 91 bytes的错误
    • @mafortis 它与问题无关,因此如果您不自己处理,可以开始另一个答案。你可以从阅读this开始。
    • 现在可以正常工作了,这是我的刀片代码,@foreach($orderss as $order)<li>{{$order->cart}}</li>@endforeach 这是屏幕截图,ibb.co/mSU2nG 我如何正确获取信息?
    【解决方案2】:

    当然,您可以使用先前答案中的内置 unserialize() 函数。

    但是

    避免在代码中使用unserialize(),因为存在漏洞:

    https://www.notsosecure.com/remote-code-execution-via-php-unserialize/ https://www.php.net/manual/en/function.unserialize.php

    我会使用 Magento 1 中的安全简单库: https://github.com/bragento/magento-core/tree/1.9/lib/Unserialize

    $parser = new Unserialize_Parser();
    $parser->unserialize($yourStringWithArray)
    

    【讨论】:

      【解决方案3】:

      serialize 只是一个内置的、变量处理的 PHP 函数。与之对应的是unserialize

      【讨论】:

      • 这不是我所知道的,我想知道它如何在视图中返回我的数据?这就是我目前拥有的ibb.co/mSU2nG
      • 您必须将未序列化的数据保存在变量中 -> $data=unserialize($serializedData)。之后,您可以使用诸如$data["name"] 之类的索引来访问数据。此外,我看到你总是得到相同的数据。这只是您的测试数据的“问题”还是另一个问题?
      猜你喜欢
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 2021-08-31
      相关资源
      最近更新 更多