2012-07-29 61 views
1

假設你有一個類,具有一定的特性,那你已經盡力使這些屬性會在你可能適合的每一行的方式匹配數據庫中的列名一個數據庫到你的類對象中。高效的方式

的方式,我通常做到這一點,是通過創建一個方法$class->get_all()查詢數據庫匹配特定查詢的所有行。從資源集中,我創建了幾個sql對象,並使用mysql_fetch_object($ resource)將它們存儲在一個數組中,然後返回。基本上,這樣的事情經常發生:

<?php 
    while($row = mysql_fetch_object($result_set)){ 
     $class->id = $row->id; 
     $class->name = $row->name; 
     $class->birthdate = $row->birthdate; 

     $output[] = $class; 
    } 

    return $output; 
?> 

...這意味着我有2個對象($行和$類),具有相同的屬性,我複製他們的相互轉化。

有沒有辦法來優化呢?就像,而不是將值從一個複製到另一個,可能將它們設置爲指向同一個sql對象屬性的指針?

+3

請不要使用'mysql_ *'函數編寫新代碼。他們不再維護,社區已經開始[棄用程序](http://goo.gl/KJveJ)。請參閱* [紅盒子](http://goo.gl/GPmFd)*?相反,您應該瞭解[準備好的語句](http://goo.gl/vn8zQ)並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli的)。如果你不能決定哪些,[這篇文章](http://goo.gl/3gqF9)會幫助你。如果你選擇PDO,[這裏是很好的教程](http://goo.gl/vFWnC)。 – 2012-07-29 18:51:21

+0

我做多一點挖掘和感謝法扎德(從SO),一些有趣的事情上來:由於PHP經常工作在「按值傳遞」,而不是「按引用傳遞」,代碼顯然會運行速度較慢。爲了緩解這種情況,PHP解釋器中似乎有一個功能(類似lazy-copy),它將變量值設置爲指向另一個變量的指針。這意味着上面的代碼(儘管棄用)並不像低效的,因爲我想,因爲基本上$類 - > ID =「任何值是$行向> ID」。 :) – Tobias 2012-07-29 19:29:38

+0

編號'$ row-> id'包含文字ID(一個整數)。它是通過價值傳遞的,而不是通過引用。如果你要傳遞整個'$ row'對象,那你就是對的。你最初的假設是正確的。 – 2012-07-29 19:31:58

回答

2

隨着PDO:

<?php 

    $pdo = new PDO("mysql:host=localhost;dbname=database_name", "user", "pass"); 
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, PDO::ERRMODE_EXCEPTION); 
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
    $stmt = $pdo->query("SELECT `id`, `username`, `password` FROM `whatever`"); 

    while ($class = $stmt->fetchObject("YourClassNameHere")) { 
     /* 
     * $class now holds an object of type YourClassNameHere 
     * With all properties set properly. 
     */ 
    } 

注:這是一個簡化的例子。在生產代碼中,您可能需要考慮用戶輸入,在這種情況下,您使用準備好的語句。這不會改變您應該獲取結果的方式。

+0

嗨真相,感謝您的意見。它看起來像PDO擴展考慮了現有的類結構。我聽說過PDO,但從來沒有真正使用它,因爲目前沒有理由。出於好奇:是否有可能在不使用PDO的情況下實現最終結果? – Tobias 2012-07-29 19:13:27

+0

@Tobias:可能是看看這看起來好多麼簡單。沒有設置,沒有實例化。 – 2012-07-29 19:17:47