【问题标题】:Pros and cons of building queries with Active Record使用 Active Record 构建查询的优缺点
【发布时间】:2011-11-22 22:09:33
【问题描述】:

我想在我的 PHP 应用程序后端运行这个查询。从概念上讲,工作表是一个数据库,可以跟踪我们拥有的所有工作表。 Purchases 是一个数据库,用于跟踪哪些用户可以访问哪些工作表。我要运行的查询给出了用户的 ID,我可以获得他们应该有权访问的所有工作表。查询形式:

select distinct s.wsid, s.name from sheets s, purchases p where 
s.wsid = p.wsid AND p.uid = *value*; 

其中 value 是应用程序输入的内容

在我看来,有两种方法可以让它在后端工作。

选项 1)

public function getPurchasedSheets($uid){
    if( is_numeric($uid) ){ //check against injections
        $query = "select distinct s.wsid, s.name from sheets s, purchases p 
            where s.wsid = p.wsid AND p.uid = ".$uid.";" ;
        return $this->db->query($query);
    } else {
        return NULL; //or false not quite sure how typing works in PHP
    }
}

选项 2)

public function getPurchasedSheets($uid){
    if( is_numeric($uid) ){ 
        $this->db->select('wsid, name'); 
        $this->db->distinct();
        $this->db->from('purchases');
        //not sure which order the join works in...
        $this->db->join('sheets', 'sheets.wsid = purchases.wsid');
        $this->db->where('uid ='.$uid);
        return $this->db->get();
    } else {
        return NULL; 
    }
}

所有 CodeIgniter Active Record 命令的来源:

codeigniter.com/user_guide/database/active_record.html

以一种或另一种方式做事是否存在某种性能或安全差异?第二种方式对我来说似乎更令人困惑......这有点复杂,因为我不确定如何在这种编码风格中进行参考消歧,因为购买和工作表都有一个 uid 字段,但它们意味着不同的东西(除了一开始对 SQL 连接命令不是很熟悉。)。购买中的 Uid(用户 id)表示用户购买了该工作表,而工作表中的 Uid 表示哪个用户拥有该工作表。

TL,DR:基本上,我问的是我是否有理由花时间研究如何以选项 2 的方式做事?

【问题讨论】:

    标签: php sql codeigniter


    【解决方案1】:

    主要好处是:

    • 数据库引擎的抽象,库可以处理 为您提供特定于数据库的 SQL 语法差异。相关的,如果你 曾经/想要更改您正在使用的数据库。理论上, 第二种形式应该仍然可以工作。
    • “活动记录”语法 自动为您转义参数。
    • 可读性,虽然 这是一个品味问题。

    顺便说一句,如果您在 PHP 5 环境中,该库支持方法链接:

    if( is_numeric($uid) ){ 
            return $this->db->select('wsid, name')
                                  ->distinct()
                                  ->from('purchases')
                                  ->join('sheets', 'sheets.wsid = purchases.wsid')
                                  ->where('uid ='.$uid)
                                  ->get();
                                  // nb. didn't check your join() syntax, either :)
        }
    

    可能跑题了:CodeIgniter 的 Active Record 更像是一个查询构建器,而不是 Active Record 的实现。如果你想知道。当被视为查询构建器时,它更有意义;) FWIW,我确实喜欢 CodeIgniter。我开玩笑的感情。

    【讨论】:

      【解决方案2】:

      查询绑定是最容易实现的,并且与查询构建所做的事情相同 - 并且不会像构建那样限制您。

      $query = $this->db->query('SELECT something FROM table WHERE name1=? AND name2=?', array($name1, $name2);
      $result = $query->result();
      

      http://codeigniter.com/user_guide/database/queries.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-02
        • 1970-01-01
        相关资源
        最近更新 更多