2017-02-10 48 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