我有这个查询,我想在我的PHP应用程序后端运行。在理论上,工作表是一个数据库,可以跟踪我们拥有的所有工作表。购买是一个数据库,用于跟踪哪些用户可以访问哪个工作表。我想要运行的查询被赋予用户的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 join命令之外。)。购买中的Uid(用户ID)表示用户已购买该表,而表中的Uid表示哪个用户拥有该表。
TL,DR:基本上,我在问我是否有理由花时间研究如何选择2方式?答案 0 :(得分:7)
主要好处是:
顺便说一句,如果您使用的是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。我从感情中开玩笑。
答案 1 :(得分:1)
查询绑定是最容易实现的,并且查询构建也是如此 - 并且不会像建筑物那样限制你。
$query = $this->db->query('SELECT something FROM table WHERE name1=? AND name2=?', array($name1, $name2);
$result = $query->result();