2012-09-30 54 views
1
<?php 

class User { 

// properties 

public $table = 'users'; 
public $id; 
public $username ; 
public $password ; 
public $first_name ; 
public $last_name ; 

以上(id,username ...,last_name)是MySQL數據庫中用戶表的列。在獲取(我正在使用PDO)用戶表中使用id的特定記錄後,如何動態地將所有記錄分配到它們各自的屬性(一個函數可能有助於搜索所有可用屬性並搜索結果中的那些屬性關聯數組,然後將這些特定值分配給它們各自的屬性)?如何使用MySQL數據庫中的記錄動態分配類屬性?

// methods 

public function set_user($id){ 
    global $dbh; 
    // sql 
    $sql = "SELECT * FROM $this->table WHERE id = {$id}"; 
    // return result array 
    $result_arr = $dbh->pdo_query_fetch($sql); 
} 

$result_arr包含ID,用戶名,密碼,如first_name和last_name的關聯數組。

注意:這裏pdo_query_fetch()是用戶定義的函數。

+1

當某人放棄全局變量'$ dbh'時要小心,否則您的對象將無法再工作。相反,在創建對象或使用setter方法時注入PDO連接,這樣更節省時間,並且以後可以更容易地進行更改。 – hakre

回答

4

您使用的PDO,它具有與PDO::FETCH_INTO

PDO::query (string $statement , int $PDO::FETCH_INTO , object $object) 

PDO::queryDocs

這可能是你的「自己的」數據庫類然後是「擁有」你,因爲你開始封裝太早。這可能需要您爲$dbh類添加一個附加功能,或者您可能想要開始重構。

+0

請用一個例子稍微詳細一點。 –

+1

您可以在相關問題中找到示例:http://stackoverflow.com/questions/7282962/php-pdo-do-the-fetch-styles-fetch-class-and-fetch-into-fetch-into-private-對象,它也演示了其他獲取模式之一。在http://stackoverflow.com/questions/747847/how-can-i-simply-return-objects-in-pdo和http:// stackoverflow等其他問題中也有各種類似的例子。com/questions/7986167/pdo-fetchobject-into-object-attributes -op-in-php – hakre

+2

你的方式更甜美,我刪除我的答案和+1 –

2

我建議增加一個方法到您的用戶等級:

public function Assign($vars = array()) 
{ 
    if(is_object($vars)) { 
     $this->Assign(get_object_vars($vars)); 
     return; 
    } 

    foreach ($vars as $key => $value) 
     if (property_exists($this, $key)) 
     $this->$key = $value; 
} 

有了這個方法,你可以從另一個對象,或陣列到現有的對象設置屬性。

您可以使用它像這樣:

myUser = new User(); 
myUser->Assign($result_arr); 
1

您可以使用get_object_vars

$properties = get_object_vars($this); 
foreach ($properties as $property => $property_value) { 
    if (isset($result_arr[$property])) 
    $this->$property = $result_arr[$property]; 
} 
1

最好是使用帶有PDOStatement::fetchObjectdocs)或PDO::queryPDO::FETCH_INTO標誌(docs),但如果沒有辦法做到這一點對於一些原因:

foreach ($result_arr as $key => $value) { 
    if (property_exists($user, $key)) { 
     $user->$key = $value; 
    } 
} 

還可以延長用戶類__set:

public function __set($key, $value) { 
    // do nothing 
} 

它會被稱爲在每個非訪問屬性調用(私有或沒有定義)

相關問題