2014-03-28 58 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

當然,如果您的表中的屬性與列名不匹配,它仍然可能會導致問題,但它可以爲您簡化一些事情 –