Code Igniter - Попытка получить свойство не объекта - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь реализовать функциональность корзины в codeigniter. В моем контроллере у меня есть общедоступная функция add, а в моей модели - общедоступная функция get для извлечения данных из базы данных в соответствии с выбранным продуктом.

вот мой контроллер

public function add() {
    $id = $this->input->post('id');
    $product = $this->products_model->get($id);

    echo "<pre>";
    print_r($product);  die();

    $data = array(
      'id' => $id,
      'name' => $product->pro_name,
      'qty' => 1,
      'price' => $product->pro_price
    );
    $this->cart->insert($data);
  }

и вот моя модель

public function get($id) {
  $results = $this->db->get_where('products', array('pro_id' => $id));
  return $results->result_array();
}

Когда я print_r($product), я получаю такой массив.

Array
(
    [0] => Array
        (
            [pro_id] => 1
            [pro_name] => Beef Carrot & Pea Food
            [pro_price] => 150.00
            [pro_image] => 1.png
        )

)

Но когда я пытаюсь вставить в массив данных, я получаю эту ошибку.

A PHP Error was encountered

Severity: Notice

Message: Trying to get property of non-object

Filename: controllers/cart.php

Line Number: 11

Backtrace:

File: E:\xampp\htdocs\ci\dogschew\application\controllers\cart.php
Line: 11
Function: _error_handler

File: E:\xampp\htdocs\ci\dogschew\index.php
Line: 315
Function: require_once

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Вам необходимо получить доступ к значениям, используя синтаксис массива, а не синтаксис объекта

$product->pro_name вместо этого используйте $product['pro_name']

0 голосов
/ 03 июля 2018

Вы возвращаете массив, а не объект. Следовательно, $product будет содержать массив ...

Как говорит ошибка:

Trying to get property of non-object

Попробуйте это:

$data = [
    'id' => $id, 
    'name' => $product[0]['pro_name'], 
    'qty' => 1, 
    'price' => $product[0]['pro_price']
];

... или еще лучше, используйте метод row() в методе get() вашей модели, например:

public function get($id)
{
    $results = $this->db->get_where('products', [
        'pro_id' => $id
    ]); 

    return $results->row();
}

Используя это, вы теперь можете иметь:

$data = [
    'id' => $id, 
    'name' => $product->pro_name, 
    'qty' => 1, 
    'price' => $product->ipro_price
];

Источник: https://www.codeigniter.com/user_guide/database/results.html#result-rows

0 голосов
/ 03 июля 2018

Надеюсь, это поможет вам:

Поскольку вы используете один элемент с объектом в вашем контроллере, поэтому вы должны использовать row() вместо result_array();

Ваша модель должна быть такой:

public function get($id) 
{
  $results = $this->db->get_where('products', array('pro_id' => $id));
  return $results->row();
}

Ваш контроллер должен быть таким:

Распечатайте $data на контроллере, чтобы проверить, есть ли у него данные;

public function add() 
{
     $id = $this->input->post('id');
     $product = $this->products_model->get($id);

     $data = array(
       'id' => $id,
       'name' => $product->pro_name,
       'qty' => 1,
       'price' => $product->pro_price
     );
     print_r($data); die();
     $this->cart->insert($data);
}

Для более: https://www.codeigniter.com/user_guide/database/results.html

...