-3

I not understand my error because I'm sure to have an oject.Look my print_r below:

Notice: Trying to get property of non-object in C:\xampp\htdocs\travel_mvc\cockpit\index.php on line 21

And line 21 and Have:

echo $row->tz_name.'<br>';

My print_r:

Array
(
    [0] => stdClass Object
        (
            [tz_name] => Africa/Abidjan
        )

    [1] => stdClass Object
        (
            [tz_name] => Africa/Accra
        )

    [2] => stdClass Object
        (
            [tz_name] => Africa/Addis_Ababa
        )

    [3] => stdClass Object
        (
            [tz_name] => Africa/Algiers
        )

    [4] => stdClass Object
        (
            [tz_name] => Africa/Asmara
        )

)

In my class I have :

class model{
    private $fields = '*';
    private $table = '';
    private $where = '';
    private $and = '';
    private $limit = '';
    private $order = '';
    private $type_order = 'DESC';
    private $d = array();

    public function find($data = array()){
        if(isset($data['fields'])){
            $this->fields = $data['fields'];
        }
        $this->table = $data['table'];
        if(isset($data['where'])){
            $this->where = ' WHERE '.$data['where'];
        }
        if(isset($data['and'])){
            $this->and = ' WHERE '.$data['and'];
        }
        if(isset($data['limit'])){
            $this->limit = ' LIMIT '.$data['limit'];
        }
        if(isset($data['order'])){
            $this->order = ' ORDER BY '.$data['order'].$type_order;
        }
        $query = Db::getInstance()->prepare('SELECT '.$this->fields.' 
                                             FROM '.$this->table.$this->where.
                                             $this->and.$this->order.$this->limit.'');
        $query->execute();
        while($data = $query->fetchAll(PDO::FETCH_OBJ)){
            $d[] = $data;
        }
        return($d);
    }
}

And when I call my function:

$model = new model();
$sql = $model->find(array(
    'fields'=>'tz_name',
    'table'=>'times_zones',
    'limit'=>5
));
foreach($sql as $row):
    echo $row->tz_name.'<br>';
endforeach;
echo '<pre>';
print_r($row);
echo '</pre>';
tereško
  • 58,060
  • 25
  • 98
  • 150
  • 2
    Your print_r() dump clearly shows you don't have an object: you have an array. – Álvaro González Jul 22 '13 at 06:35
  • `echo $row['tz_name']`? – Joachim Isaksson Jul 22 '13 at 06:36
  • Not part of this problem but you will have a double `WHERE` in your query if you use the `where` and `and` entries in the `$data` array. There are also many libraries available that implement a query builder API. I recommend using one of these instead of writing your own. – Phil Jul 22 '13 at 06:42
  • Thank'x Phil. Do u have an address for query builder api? I find some but never finished... Thx – user2584229 Jul 22 '13 at 07:58
  • The [Doctrine DBAL](http://www.doctrine-project.org/projects/dbal.html) project is very mature. You don't need to use the full ORM though – Phil Jul 23 '13 at 01:36

1 Answers1

1

PDOStatement::fetchAll() already returns an array so you're just double-nesting the result set for no reason.

In your model::find() method, change these lines...

while($data = $query->fetchAll(PDO::FETCH_OBJ)){
    $d[] = $data;
}
return($d);

to

return $query->fetchAll(PDO::FETCH_OBJ);

You can also remove the model $d property (not that you were using it anyway).

Phil
  • 157,677
  • 23
  • 242
  • 245