2017-04-06 91 views
2

中重複類似的查詢我在學習,並且仍然在努力獲得許多OOP概念的懸念,所以請在閱讀/回答問題時記住這一點。PHP OOP避免不得不在方法

所以面向對象編程的主要目的之一就是不要重複自己的權利。但是,當我創建方法時,我經常發現自己在查詢數據庫時重複相同的語句。從下面的代碼可以看出,我從創建的類中取得了下面的代碼。

function getCategory() 
    { 
     $sql = "SELECT * FROM jobs"; 
     $stmnt = $db->prepare($sql); 
     $stmnt->execute(); 
     $results = $stmnt->fetchAll(); 

     foreach ($results as $result) { 
      $cat[] = $result['category']; 
     } 
     return $this->category = $cat 
    } 
    function selectCategory($selectedCategory){ 
     $sql = "SELECT * FROM jobs 
     WHERE category =:category"; 
     $stmnt = $db->prepare($sql); 
     $stmnt->bindValue(':category', $selectedCategory); 
     $stmnt->execute(); 
     $results = $stmnt->fetchAll(); 
     foreach($results as $result){ 
      $result= array('category' => $result['category'], 'headline' => $result['headline']); 
     } 
     return $this->category = $result 
    }// selectCategory 

我的問題。

有沒有辦法/ 我應該怎麼做才能避免在我的方法中不斷寫入相同的數據庫查詢?我覺得我有點深度,但它不會阻止我嘗試。任何幫助,建議歡迎(請記住我是初學者)

+0

我不是很瞭解你...即時嘗試避免必須反覆寫入選擇語句!如果我的知識缺乏,但我不明白你的建議如何可以幫助我解決問題 –

+0

@PHPglue我發現自己寫這樣的'$ sql =「選擇*從作業 WHERE category =:category」類似的語句。 $ stmnt = $ db-> prepare($ sql); $ stmnt-> bindValue(':category',$ selectedCategory); $ stmnt-> execute();'在我的很多方法中(因此我重複了很多代碼)並尋找一種方法我可以如何避免它 –

+0

對我而言,OOP有助於避免在客戶端重複自己,意思是說,當你實際使用類(作爲對象)時。所以你必須編寫類似的方法,但它們並不完全相同,但使用相同的「格式」或「設計」,這只是爲了避免使用SQL的東西搞亂索引文件。在任何情況下,我只會這樣做,將數據保存在類變量(選擇),插入,更新和從我的數據庫中刪除,然後所有其他方法來源於變量,所以我不需要做太多的SQL,不要再重複自己,最多4次。 – Zeke

回答

2

您可以運行查詢獲取所有數據,然後使用PHP從提取的數據中提取數據。

但我不喜歡它,它效率不高。

你有2個不同的查詢,所以你需要調用,只是提高你的代碼多一點,你可以做這樣的模式:

class Category 
{ 
    private $db; 

    public function __construct(PDO $db) 
    { 
     $this->db = $db; 
    } 


    function getAll() 
    { 
     return $this->db->query('SELECT * FROM jobs'); 
    } 

    function getByCategory($category){ 
     $stmt = $this->db->prepare(
      "SELECT * FROM jobs WHERE category =:category" 
     ); 
     $stmt->bindValue(':category', $category); 
     $stmt->execute(); 
     return $stmt->fetchAll(); 
    } 
} 

這是完全正常的,這是不是真的重複

+0

謝謝你,先生,如果我可以的話,一個問題。在getCaregory()方法中,你將如何處理來自'return $ stmnt-> fetchAll()'的數據?你會創建一個不同的方法來處理這些數據,或者你會在'getCategory()'方法中處理數據處理嗎? –

+0

不要在模型內部處理數據,這應該在外部完成,由控制器或其他東西來完成 – meda

+0

好的,我得到你!非常感謝你 –