2015-09-27 77 views
0

六年前,我開始了一個新的PHP OOP項目,沒有任何經驗,所以在我走時我只是補充了它。無論如何,我發現我相當強大的MySQL服務器有時候會陷入過於容易,想知道什麼是最好的方式來限制某些分貝活動,當我想出了這個,作爲一個例子...PHP OOP高效的DB讀取減少

private $q_enghours; 
public function gEngHours() { 
    if (isset($this->q_enghours)) { 
    } else { 
     $q = "SELECT q_eh FROM " . quQUOTES . " WHERE id = " . $this->id; 
     if ($r = $this->_dblink->query($q)) { 
      $row = $r->fetch_row(); 
      $r->free(); 
      $this->q_enghours = $row[0]; 
     } 
     else { 
      $this->q_enghours = 0; 
     } 
    } 
    return $this->q_enghours; 
} 

這似乎應該是有效的,大大減少必要的讀取到db。如果填充對象屬性,則不需要訪問db。請注意,有幾乎所有的類都有相同的「getter」訪問例程。我只在一個地方實施了這種改變,並且想知道是否有這樣的「最佳實踐」,我可能在我重寫所有課程之前錯過了這個「最佳實踐」。

+0

讓我們從你的代碼100%開放給SQL注入開始(綁定你的變量,不要將它們粘貼到SQL中!)。 – h2ooooooo

+0

雖然有效,但這並不適用於我問的問題。我在應用程序的不同部分處理了SQL注入。 – DevlshOne

回答

2

我想說這個問題是基於錯誤的前提。

如果你想處理「容易陷入困境」的數據庫,那麼你必須挖掘特殊原因,而不是隻是猜測。這些小事如此關心,實際上並沒有什麼區別。您必須配置文件您的整個應用程序,並找到真正的原因。

如果你想減少大量的讀取,然後讓你的對象映射某些數據庫記錄,通過讀取記錄並填充所有屬性一次,在創建對象。構造函數是爲它製作的。

作爲一個側面說明,你真的需要一個好的數據庫的包裝,只是減少你寫的每個數據庫調用的代碼量,因此,這段代碼可以寫成

public function gEngHours() { 
    if (!isset($this->q_enghours)) { 
     $this->q_enghours = $this->db->getOne("SELECT q_eh FROM ?n WHERE id = ?", quQUOTES, $this->id); 
    } 
    return $this->q_enghours; 
} 

其中getOne ()方法正在完成運行查詢,獲取行,從中獲取第一個結果以及許多其他想法,如正確的錯誤處理和使查詢安全的所有工作。

+0

我不是DBA,所以我沒有必要的知識鑽入mySQL日誌並找出我的根源。我已經調整了每個可以找到好信息的參數。至於* db *包裝,我仍然在做一個完整的重寫..只是爲了消除已經寫好的代碼。 – DevlshOne

+0

而且,是的,有幾個地方我一次獲取整個對象,但對於只需要關於對象的特定信息的地方,我使用這些類。 – DevlshOne