【问题标题】:Class query PDO property of non-object类查询非对象的PDO属性
【发布时间】:2013-07-20 19:33:59
【问题描述】:

我不明白我的错误,因为我确定有一个对象。请看下面的 print_r

注意:尝试在第 21 行获取 C:\xampp\htdocs\travel_mvc\cockpit\index.php 中非对象的属性

第 21 行和有:

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

我的 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
        )

)

在我的课上我有:

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);
    }
}

当我调用我的函数时:

$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>';

【问题讨论】:

  • 您的 print_r() 转储清楚地表明您没有对象:您有一个数组。
  • echo $row['tz_name']?
  • 不是这个问题的一部分,但如果您在 $data 数组中使用 whereand 条目,您的查询中将有一个双 WHERE。还有许多可用的库可以实现查询构建器 API。我建议使用其中之一,而不是自己编写。
  • 谢谢菲尔。你有查询生成器 api 的地址吗?我找到了一些但从未完成...谢谢
  • Doctrine DBAL 项目非常成熟。不过,您不需要使用完整的 ORM

标签: php pdo


【解决方案1】:

PDOStatement::fetchAll() 已经返回了一个数组,所以你只是无缘无故地双重嵌套了结果集。

在您的 model::find() 方法中,更改这些行...

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

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

您还可以删除 model $d 属性(不是您一直在使用它)。

【讨论】:

  • 感谢您的解决方案。完美工作;-)
猜你喜欢
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多