Php 使用活动记录生成查询的优缺点

Php 使用活动记录生成查询的优缺点,php,sql,codeigniter,Php,Sql,Codeigniter,我想在我的PHP应用程序后端运行这个查询。从概念上讲,sheet是一个数据库,它跟踪我们所有的sheet。Purchases是一个数据库,用于跟踪哪些用户有权访问哪张表。如果给我想要运行的查询一个用户id,我就可以得到他们应该访问的所有工作表。查询表格: select distinct s.wsid, s.name from sheets s, purchases p where s.wsid = p.wsid AND p.uid = *value*; 其中value是应用程序输入的内容

我想在我的PHP应用程序后端运行这个查询。从概念上讲,sheet是一个数据库,它跟踪我们所有的sheet。Purchases是一个数据库,用于跟踪哪些用户有权访问哪张表。如果给我想要运行的查询一个用户id,我就可以得到他们应该访问的所有工作表。查询表格:

select distinct s.wsid, s.name from sheets s, purchases p where 
s.wsid = p.wsid AND p.uid = *value*; 
其中value是应用程序输入的内容

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

备选方案1)

备选方案2)

所有CodeIgniter活动记录命令的源:

codeigniter.com/user\u guide/database/active\u record.html

以这种或那种方式做事,在性能或安全性方面有什么不同吗?用第二种方法做这件事对我来说似乎更困惑。。。这有点复杂,因为我不确定如何在这种编码风格中进行引用消歧,因为购买和工作表都有一个uid字段,但它们的含义不同(除了一开始不太熟悉SQL join命令)。购买中的Uid(用户id)表示用户已购买该工作表,而工作表中的Uid表示该工作表的所有者

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

主要的好处是:

  • 从数据库引擎中提取,库可以在其中处理 数据库特定的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的活动记录与其说是活动记录的实现,不如说是查询生成器。万一你想知道。如果将其视为查询生成器,则更有意义;)FWIW,我真的很喜欢CodeIgniter。我是开玩笑的。

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

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

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 :)
    }
$query = $this->db->query('SELECT something FROM table WHERE name1=? AND name2=?', array($name1, $name2);
$result = $query->result();