2017-02-10 72 views
0

我正在學習php,目前正在使用函數。 用兩個表創建一個簡單的數據庫:Category和News。php功能與查詢優化

此外,我創建了三個函數:get_news_title,get_news_image,get_news_text 每個函數返回 - 標題,圖像或全文文本。 現在它是設置這樣的:

function get_news_title($id) { 
    $sql = $this->conn->prepare("SELECT title from news WHERE id = :id"); 
    $sql->bindparam(":id", $id); 
    $sql->execute(); 
    $row=$sql->fetch(PDO::FETCH_ASSOC); 
    $title = $row["title"]; 
} 

function get_news_image($id) { 
    $sql = $this->conn->prepare("SELECT img from news WHERE id = :id"); 
    $sql->bindparam(":id", $id); 
    $sql->execute(); 
    $row=$sql->fetch(PDO::FETCH_ASSOC); 
    $img = $row["img"]; 
} 

function get_news_text($id) { 
    $sql = $this->conn->prepare("SELECT full_text from news WHERE id = :id"); 
    $sql->bindparam(":id", $id); 
    $sql->execute(); 
    $row=$sql->fetch(PDO::FETCH_ASSOC); 
    $text = $row["full_text"]; 
} 

每個函數包含查詢,但有可能是更好的辦法?在每一個函數中使用查詢是一種好的做法嗎?因爲如果我調用所有這些函數,則會有三個單獨的查詢運行。

而且它是使用這樣的一個好主意:如果你要堅持你的方法,你一定是$領域僅由你掌控

function get_news($id,$field) { 
    $sql = $this->conn->prepare("SELECT :field from news WHERE id = :id"); 
    $sql->bindparam(":id", $id); 
    $sql->bindparam(":field", $field); 
    $sql->execute(); 
    $row=$sql->fetch(PDO::FETCH_ASSOC); 
    $title = $row["title"]; 
} 
+1

您不能使用列名稱的參數。原因:如果數據庫不知道它應該使用的列或表等,那麼將如何編譯,優化查詢並創建執行計劃 – RiggsFolly

+0

爲什麼沒有一個函數執行的查詢可以將所有3列合爲一個去'從新聞選擇標題,新聞,full_text WHERE ID =:ID' – RiggsFolly

+0

@RiggsFolly我可以做到這一點,但爲了學習的目的,我這樣做。有沒有辦法在一個函數中執行查詢,然後從查詢中調用其他字段? – ChrisX32

回答

0

嘗試是這樣的:

 function get_news($id,array $fields) { 

     $fields = implode(',', $fields); 

     $sql = $this->conn->prepare("SELECT $fields from news WHERE id = :id"); 
     $sql->bindparam(":id", $id); 
     $sql->execute(); 
     $row=$sql->fetch(PDO::FETCH_ASSOC); 
     $title = $row["title"]; 
    } 
+0

謝謝,但一定要檢查@RiggsFolly有關安全的答案! – LBA

0

這是一件很奇怪的事情,但是當你說它是一個學習練習時,傳遞一個參數是你想選擇的列名非常簡單。

function get_news_column($id, $columnname) { 
    $sql = $this->conn->prepare("SELECT $columnname from news WHERE id = :id"); 
    $sql->bindparam(":id", $id); 
    $sql->execute(); 
    $row=$sql->fetch(PDO::FETCH_ASSOC); 
    $title = $row["title"]; 
} 


// called like this 

$title = get_news_column($id, 'Title'); 
$img = get_news_column($id, 'img'); 
$full_text = get_news_column($id, 'full_text'); 

我建議你添加一些錯誤檢查因爲這樣做,也很簡單,以通過不存在的列名,並將使查詢失敗。

如果您正在傳遞的列名是從用戶輸入(例如$ _POST或$ _GET字段)中檢索到的,那麼這會很危險。

+0

我的回答有什麼不同,而你的只支持一個列名? – LBA

+0

那麼只有你提到的真的。但是OP似乎一次只想要一列。就像我在答案中所說的那樣,這是一件很奇怪的事情,因爲它將以這種方式獲得3列的執行時間的三倍多。 – RiggsFolly

+0

hm,但是OP詢問是否運行3個查詢並不是問題 - 是的,所以我想給出一種方法來詢問只有一個查詢的1-3個字段。但是沒問題。 – LBA