2014-03-28 55 views
0

我有一个包含一些实例变量的类:理解PDO类初始化

class MyClass 
{ 
    public $id; 
    public $name; 
} 

和含有次以上字段+一些附加字段像的updated_at一个MySQL表。我尝试实例使用PDO,并将其转换成JSON数组使用下面的代码上面的类的对象:

$statement = $pdo->prepare('SELECT * FROM `mytable`'); 
$statement->execute(); 
$statement->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'MyClass'); 
$objects = $statement->fetchAll(); 

echo json_encode((array) $objects); 

现在看来,结果数组还包含附加字段虽然他们不是我的课的一部分定义:

[{"id": 5, "name":"a name", "updated_at":"<timestamp>", "created_at":"<timestamp>"}] 

这是怎么回事,最好的办法是避免这种情况? 在此先感谢。

+0

你为什么需要这门课? –

+0

数据将在其实际打印出来之前被修改 – danijoo

+0

您的'SELECT * FROM mytable'没有做任何事情来限制返回的列......'*'表示获取所有列,并且仅仅因为您有一些属性定义在类不会自动使数据库意识到您只希望匹配这些属性名称的列。如果你只想返回id和name,那么你的SQL语句需要强制执行。 –

回答

0
class MyClass 
{ 
    public $id; 
    public $name; 


    protected function setSelection() { 
     return implode(
      ',', 
      array_map(
       function ($value) { 
        return '`'.$value.'`'; 
       }, 
       array_keys(get_object_vars($this)) 
      ) 
     ); 
    } 

    public function getData() { 
     .... 
     $statement = $pdo->prepare(
      'SELECT ' . $this->setSelection() . ' FROM `mytable`' 
     ); 
     .... 
    } 
} 
+0

谢谢!比我的方法更好地将15个字段的名称写入语句中:> – danijoo

+0

当然,如果您的表中的属性与列名不匹配,它仍然可能会导致问题,但它可以为您简化一些事情 –