用户
 找回密码
 入住 CI 中国社区
搜索
查看: 5067|回复: 4
收起左侧

$this->db->select('1', FALSE)是什么用法,为了安全?

[复制链接]
发表于 2013-7-10 08:44:37 | 显示全部楼层 |阅读模式
PHP复制代码
function is_email_available($email)     {
                $this->db->select('1', FALSE);
                $this->db->where('LOWER(email)=', strtolower($email));
                $this->db->or_where('LOWER(new_email)=', strtolower($email));
 
                $query = $this->db->get($this->table_name);
                return $query->num_rows() == 0;
        }
复制代码

发表于 2013-7-10 08:52:50 | 显示全部楼层
为了提高效率吧,因为如果没有select子句,CI会为你加载所有字段,但这里的情况是只需要获取行数就可以了,不需要选择任何字段,所以加了个select 1,当然也可以使用 $this->db->count_all_results() 直接获取行数。
 楼主| 发表于 2013-7-10 09:29:08 | 显示全部楼层
本帖最后由 viqecel 于 2013-7-10 09:32 编辑
PHP复制代码
SELECT COUNT(*) FROM `table` WHERE `column` = "value"
复制代码

也可以这样对吧.
那select 1 这种写法,依据是什么?聚集函数吗.1表示重命名的一个字段吗.他的作用我理解了,不是返回什么记录,只是返回记录数.
发表于 2013-7-10 10:31:51 | 显示全部楼层
减少字段
发表于 2013-7-10 16:40:29 | 显示全部楼层
本帖最后由 gogogo1027 于 2013-7-10 16:44 编辑

这个语法可接受一个可选的第二个参数。如果你把它设为FALSE, CodeIgniter 将不会使用反引号保护你的字段或者表名。这在进行复合查询时很有用。
正常情况下
PHP复制代码
 
$this->db->select('title, content, date');
$query = $this->db->get('mytable');
// Produces: SELECT title, content, date FROM mytable
 
复制代码



假如你使用复合查询,则将它第二个参数设置为FALSE,避免它把你的select()包含的SQL当成是一个字段来格式化。

PHP复制代码
 
$this->db->select("('SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4') AS amount_paid", FALSE);
$query = $this->db->get('mytable');
 
复制代码


符合查询的时候才用到,默认则不需要。

本版积分规则