2014-03-19 28 views
1

當你有對象屬性來自mySQL查詢時,是否有一種簡單的方法可以在php中創建一個對象數組?帶有mySQL的PHP​​對象數組

我的代碼如下,以示你我在做什麼。我可能很遙遠,因爲我根本不習慣使用PHP,而且出於某種原因我無法理解它。

public function loadMeals(){ 
    $stmt = $this->conn->prepare("SELECT id, dishName, ingredients FROM meals"); 
    $stmt->execute(); 
    $stmt->bind_result($id, $dishName, $ingredients); 
    $meals = array(); 
    while ($stmt->fetch()) { 

     $this->id = $id; 
     $this->dishName = $dishName; 
     $this->ingredients = $ingredients; 
     $meals[] = $this; 
    } 
    return $meals; 
} 

請記住,這是所有的一類餐食。

謝謝你們。

+0

你可以從'Meal'類中發佈'__construct()'嗎? –

+1

好的謝謝 - 我想驗證你的構造函數沒有使用額外的參數,所以Meal可以很容易地實例化。 –

回答

1

基於你如何使用它(創建Meal對象的數組,該方法應被聲明爲static方法,稱爲無$this上下文中的環可以創建。通過new self()Meal對象和附加到陣列之前設置相應的屬性。

如果你仔細想想,這種方法的目的不是爲了作用於單一Meal,因此它是有道理的,它是static

由於它被稱爲無$this背景下,您將需要通過庫MySQLi連接作爲參數

public static function loadMeals($conn) { 
    // Do the query/fetch like you already have 
    // except that $conn is a local param, not a class prop. 
    $stmt = $conn->prepare("SELECT id, dishName, ingredients FROM meals"); 
    $stmt->execute(); 
    $stmt->bind_result($id, $dishName, $ingredients); 
    $meals = array(); 
    while ($stmt->fetch()) { 
     // Create a new Meal object 
     $meal = new self(); 
     // And set its properties 
     $meal->id = $id; 
     $meal->dishName = $dishName; 
     $meal->ingredients = $ingredients; 

     // Append it to the array 
     $meals[] = $meal; 
    } 
    // Return it 
    return $meals; 
} 

要使用它,在類的外部:

// Call the function statically. 
// You'll need to pass the database connection to it 
$meals = Meal::loadMeals($conn); 

我將指出儘管在做prepare()/execute()的習慣是非常好的,但實際上並不需要它,因爲您沒有將任何輸入傳遞給查詢。您可以致電$conn->query(),從MySQLi的bind_result()變量引用中消除一些複雜性。

$result = $conn->query("SELECT id, dishName, ingredients FROM meals"); 
if ($result) { 
    // Fetch and instantiate a Meal object in one go. 
    while ($meal = $result->fetch_object('Meal')) { 
    $meals[] = $meal; 
    } 
} 
+0

快速的問題,你可以回答。我習慣於在類文件開頭列出屬性的其他語言,然後通常在構造函數中設置它們。爲什麼這通常不會在PHP中完成(至少在我們的例子中),爲什麼自己更喜歡? – Requiem

+0

@Requiem在PHP中,您也可以在類的開頭列出屬性。但這是一個靜態方法。它的工作是列出_all_'Meal's,而不是在_single_ meal對象上執行動作,這將需要實例化該對象並直接調用它。 'self'關鍵字引用了當前類的類名,所以它與本類上下文中的'$ meal = new Meal()'相同。 –

+0

當然,還有其他方法可以使用Factory模式構建「獲取所有對象」方法,而不是直接在此方法中調用「新Meal()」。儘管如此,OO設計更深入。 –

-1

對於PDO:

public function loadMeals(){ 
    $stmt = $this->conn->prepare("SELECT id, dishName, ingredients FROM meals"); 
    $stmt->execute(); 
    $meals = array(); 
    while ($obj = $stmt->fetch(PDO::FETCH_OBJ)) { 
     $meals[] = $obj; 
    } 
    return $meals; 
} 

或$膳食= $ stmt-> fetchObject( 'MyMeal',$ ctor_args);請參閱PHP手冊中的this。還要注意關於那裏的構造函數的第一個註釋,以期望使用這可能導致的意外結果。

+0

這是MySQLi,而不是PDO,OP正打算返回'Meal'對象,而不是通用'stdClass'。 –

+0

@MichaelBerkowski沒有注意到bind_result。我的錯。 – Ivarpoiss

0

這可能是一個短期的解決您的問題,但考慮抓住與數據庫的元素時使用mysql_fetch_assoc

有關詳細閱讀和例如: mysql_fetch_assoc documentation from php.net

+0

爲什麼你推薦一個在你提供的鏈接中有一個巨大的棄用警告的函數? – Andy