2013-10-25 69 views
1

我在努力學習OOPHP,我想我到了那裏。我只是不知道輸出多個數據庫行的最佳方式是什麼。PHP OOP:處理來自數據庫的多行輸出,最好的辦法呢?

我試着通常做函數內輸出第一方法,但我認爲這種失敗的OOP的目的。

我也試過在類中設置一個public $list數據庫查詢將所有數據推送到然後遍歷代碼之外的數據,但理想情況下我想從查詢中創建對象的多個實例並使用它們的公共變量(我的測試用例中的id,name和eyecolour)來獲取數據,這樣數據總是來自同一個地方。但是,如何從類中的查詢創建多個對象,然後如何通過循環來顯示它們,以及如何區分它們或僅針對具有特定值的特定對象?

我已經經歷了多個主題拖網,但他們似乎都專注於問題的具體情況。我想從這個簡單的意義上了解它,然後我可以將它應用到更大的項目中。

這裏是我一直在玩弄代碼:

class Ignition { 

public function dataConnection() { 
    return new PDO('mysql:host=localhost;port=8889;dbname=oop_testing','root','root',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 
    } 

} 


class People { 

private $db; 

// Each person has a 
public $id; 
public $name; 
public $eyecolour; 
public $list = array(); 

public function __construct() { 
    $this->db = new Ignition(); 
    $this->db = $this->db->dataConnection(); 
} 

public function getList() { 
    echo "People:<br /><br />"; 
    $sql = $this->db->prepare("SELECT * FROM people"); 
    $sql->execute(); 
    //$this->list = $sql->fetch(PDO::FETCH_ASSOC); 
    while($person = $sql->fetch(PDO::FETCH_ASSOC)) { 
     array_push($this->list, $person); 
    } 


    /*while($person = $sql->fetch(PDO::FETCH_ASSOC)) { 
     echo $person['name'] . "<br />"; 
    }*/ 
} 

public function getIndividual($search, $by = "id") { 
    $sql = $this->db->prepare("SELECT * FROM people WHERE $by = :search"); 
    //$sql->bindParam(":by", $by); 
    $sql->bindParam(":search", $search); 
    $sql->execute(); 
    $individual = $sql->fetch(PDO::FETCH_ASSOC); 
    $this->id = $individual['id']; 
    $this->name = $individual['name']; 
    $this->eyecolour = $individual['eyecolour']; 
} 

} 


$people = new People(); 
$people->getList(); 

/*echo "<pre>"; 
var_dump($people->list); 
echo "</pre>";*/ 

foreach ($people->list as $person) { 
    echo $person['name']; 
} 

$people->getIndividual(1); 
echo "<br />Name: " . $people->name; 
echo "<br />Eye Colour: " . $people->eyecolour; 

回答

2

居然會得到人們的列表中的最佳選擇對象,您是如何做到這一點是由你。我將利用PDO :: FETCH_CLASS和使用靜態函數是這樣的:

class People { 
    public $id; 
    public $name; 
    public $eyecolour; 

    public function display() { 
     echo "Id: {$this->id} name: {$this->name} eyecolour: {$this->eyecolour} <br>"; 
    } 

    public static function get() { 
     $result = self::db()->prepare("select * from people limit 1"); 
     $result->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE,'People'); 
     $result->execute(); 
     return $result->fetch(); 
    } 

    public static function getall() { 
     $result = self::db()->prepare("select * from people"); 
     $result->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE,'People'); 
     $result->execute(); 
     return $result->fetchAll(); 
    } 

    public static function db() { 
     return new PDO("mysql:host=127.0.0.1;dbname=mydb", 'root', '', array(PDO::ATTR_PERSISTENT => true)); 
    } 
} 


$person = People::get(); 
$person->display(); 
$all_people = People::getall(); 

foreach($all_people as $single_person) { 
    //$single_person is an instance of People 
    $single_person->display(); 
} 

很明顯,你可以添加搜索條件到get()getall()方法就像你在你的函數都有。我只是以此爲例。

+0

這似乎適用於我想要的功能。那麼'FETCH_CLASS'是否會根據數據庫列名填充屬性? – Adam

+0

是的,如果你想要而不是這種方法,你可以得到結果作爲一個簡單的數組,並創建一個函數,設置對象的值。全部取決於情況和你在做什麼。 – Pitchinnate

+0

沒有,這是完美的,我想要的,謝謝! – Adam

1

爲了實踐OO,你可以在類別設置的所有變量private(即使想使用public)開始,僅使用存取器功能。有了這條規則,因爲我們很懶惰,所以我們更有可能將代碼放在正確的地方(在課堂內)。

此外,一個好的規則是,在現實生活中一個對象應該是一個階級。

在這種特定的情況下,我會創建一個名爲Person一個人(眼睛顏色,身高等)的不同屬性的類。該People類可以從它從數據庫中檢索創建Person對象,並將它們存儲在一個數組(也許ID或名稱索引)。

Person類可以將數據庫中的整行作爲它的構造函數的參數,然後它必須執行設置/檢查所有變量本身的骯髒工作。這對懶惰和OO(沒有setter功能)很有好處。

您可能在People中有訪問函數,它返回Person(搜索名稱,ID等)。

+0

這很有道理,我會給它一個去。我如何去創建另一個類中的對象?然後,我如何以任何腳本訪問它們? – Adam

+0

您可以在同一個作用域(文件作用域)中定義兩個類「Person」和「People」對象。在'People'裏面,如果你從DB中逐行讀取,你可以執行'$ person = new Person($ row);'(使'Person'的'__construct()'能夠將整行作爲參數並從中設置其內部屬性)。然後,您可以執行'array_push($ this-> list,$ person)'以便稍後保存該人員。 – Atle

+0

這就是我原本想做的事情,看起來有點亂! – Adam