2016-03-01 39 views
-1

我創建了一個簡單的類,旨在從MySQL DB中檢索職員的詳細信息。這裏是類:設置和訪問PHP類對象的屬性,其中的值已從類中的數據庫中檢索

class staff { 
    public function __construct($db, $id){ 
     $record = $db->prepare("SELECT * FROM staff WHERE id = :id"); 
     $record->execute(array(':id' => $id)); 
     foreach($record as $k=>$v){ 
      $this->$k = $v; 
     } 
    } 
} 

這裏是電話:

$staffMember = new staff($db, $uid); 
var_dump($staffMember); 

而且後續代碼var_dump給出了這樣:

object(staff)#7 (1) { 
    ["0"]=> 
    array(2) { 
    ["fname"]=> 
    string(4) "Mike" 
    [0]=> 
    string(4) "Mike" 
    } 
} 

到目前爲止好,我能看到的東西被檢索和組。但我對實現並不滿意,原因有兩個:

1)看起來數值是重複的,因爲我在返回的數組中有兩個「Mike」。爲什麼會發生這種情況,我該如何預防?

2)訪問值並不簡單,在主PHP文件我用的線沿線的東西:

$staffMember->{0}["fname"]; 

檢索工作人員名字的價值。這看起來不正確,我希望使用$ staffMember-> fname。是否有另一種方法會導致將檢索的DB值設置爲類/對象變量,而不是實際上是一個數組的單個屬性,訪問相當麻煩,甚至可能更難以操作?

我在此先感謝。

+0

'$ db'是一個'PDO'實例嗎? – deceze

+1

因爲你有關聯數組(fname)和數組數組(0),所以你有兩次相同的結果;他們實際上是相同的結果,但因爲您的請求不明確,所以兩個結果都會提供。 –

+0

是的。對不起,我應該澄清一點。 $ uid是在頁面的其他地方設置的用戶id值,對應於用戶名,DoB等所保存的DB中的記錄。 – MikeK

回答

1
foreach($record as $k=>$v) 

這個迭代所有行在結果集中。第一行是0,其中有幾個字段在$v。此外,您正在使用默認的PDO::FETCH_BOTH提取模式,該模式返回數字索引和名稱關聯的數據。

如果你只是期望返回一個記錄,按名稱做到這一點遍歷一個記錄的列:

foreach ($record->fetch(PDO::FETCH_ASSOC) as $k => $v) { 
    $this->$k = $v; 
} 

我認爲設置這樣的公共屬性可能不理想(將數據庫列名直接綁定到公共對象API),但這是另一回事......

+0

是的,這與上面的@Theavonguy的評論是一樣的,但是感謝你提供的代碼示例非常有用,它將標記爲幫助任何人遇到此問題的正確答案。 關於設置公共屬性與DB列具有相同的名稱,因爲PHP是所有服務器端多少這暴露你?有沒有更好的方法來實現我期望實現的目標? – MikeK

+0

這與揭露外界無關。它與分離問題有關。您應該將數據庫建模爲建模RDBMS數據庫的最佳方式。你應該建模你的對象的最佳方式,你可以建模你的對象。這兩者不是,也不一定關聯1:1。在RDBMS數據結構和內部使用的對象形式之間應該有一個「翻譯層」。考慮一個邏輯上是一件事但實際上存儲在數據庫的兩個表中的記錄。可以使代碼更簡單*,併爲您提供更長期的靈活性。 – deceze

+0

我想我明白你在說什麼,你的意見是關於代碼清晰度和可用性的? – MikeK

相關問題