了解“尝试获取非对象的属性”并防止出现这种情况 - php

首先,我想为此线程道歉,并且我知道SO上有很多类似的线程。在阅读了它们之后,我无法真正理解我的网站中发生了什么。框架是Laravel-4.2

几个小时的网站就可以了,一切都很好。现在,当我尝试访问它们时,很少有页面显示Trying to get property of non-object。并非所有页面..只有2-3页。

例如,这在我的控制器中显示所有订单。

public function orders() {

    $orders = Order::select('*')->orderBy('order_id', 'DESC')->paginate(5);
    return View::make('site.admin.orders', [
        'orders' => $orders
    ]);
}

这是我的看法

@foreach($orders as $order)
<tr>
    <td class="text-center">{{ $order->order_id }}</td>
    <td class="text-center">{{ $order->user->username }}</td>

    // few more <td>`s
</tr>
@endforeach

错误出现在第一个<td>上:

<td class="text-center">{{ $order->order_id }}</td>

完全相同的代码可以在其他站点上工作(此副本)。我知道在这种情况下,我可以将$order->order_id更改为$order['order_id'] ...

为什么会这样呢?怎么预防呢?我不了解此错误的性质。对我来说,这很奇怪,因为它可以在网站的精确副本上工作。

更新:这是我的模型:

public function getOrderData($data) {

    $dataArray = json_decode($data, true);
    $data = json_decode($data);
    $arrayKeys = array_keys($dataArray);
    $arrayKeys = array_filter($arrayKeys, function($value) {
        return ($value !== 'shipping');
    });
    $productIds = implode(',', $arrayKeys);


    $products = DB::table('products')
        ->leftjoin('category', 'products.category_id', '=', 'category.category_id')
        ->leftjoin('sub_category', 'products.sub_cat_id', '=', 'sub_category.sub_cat_id')
        ->where('product_id',$productIds)
        ->get();            

    foreach ($products as $item) {
        if(!in_array($item->product_id, $arrayKeys)) continue;
        $dataArray[$item->product_id]['category'] = $item->category_name;
        $dataArray[$item->product_id]['sub_category'] = $item->sub_cat_name;

    }
    return json_decode(json_encode($dataArray)); 
}

参考方案

“试图获取非对象的属性”,这意味着您正在尝试获取
不存在的东西

。在OOP的类中,对象和对象具有与之关联的属性。您可以访问这些属性(如果存在)。

就您而言,它不存在。要克服此问题,请在访问以下值之前使用isset():

isset($order->order_id) ? $order->order_id : 'NA';

在这种情况下,如果该属性不存在,则代码不会引发错误,而是会进入其他部分并打印NA

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…

PHP PDO组按列名称查询结果 - php

以下PDO查询返回以下结果:$db = new PDO('....'); $sth = $db->prepare('SELECT ...'); 结果如下: name curso ABC stack CDE stack FGH stack IJK stack LMN overflow OPQ overflow RS…

PHP-全局变量的性能和内存问题 - php

假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…

验证IBAN PHP - php

在设计新平台时,我们尝试集成IBAN编号。我们必须确保IBAN已经过验证,并且存储在数据库中的IBAN始终正确。那么验证数字的正确方法是什么? 参考方案 正如我在其他问题中解释的逻辑一样,我尝试自己创建一个函数。根据Wikipedia文章中解释的逻辑,在下面找到合适的功能。国家特定验证。它适合吗http://en.wikipedia.org/wiki/Int…

PHP:对数组排序 - php

请如何排序以下数组Array ( 'ben' => 1.0, 'ken' => 2.0, 'sam' => 1.5 ) 至Array ( 'ken' => 2.0, 'sam' => 1.5, 'ben' =&…