Codeigniter,Active Record不接受WEEK参数

时间:2014-05-13 15:30:50

标签: mysql codeigniter

似乎Active Record(Codeigniter)不接受WEEK参数,我不明白为什么?! Whern我删除'3',我的查询工作正常!

$this->db->select('WEEK(insere_le,3) AS semaine, COUNT(*) AS nombre')
                    ->from($this->table_name)
                    ->where(array(
                        'type_anomalie' => "Dérogation",
                        'YEAR(insere_le)' => $year
                    ))
                    ->group_by('WEEK(insere_le,3)')
                    ->get()
                    ->result_array();

此查询在执行时显示以下字符串:

SELECT WEEK(insere_le, `3)` AS semaine, COUNT(*) AS nombre FROM (`aero_anomalie_montage`) WHERE `type_anomalie` = 'Dérogation' AND YEAR(insere_le) = '2014' GROUP BY WEEK(insere_le, `3)`

如您所见,它在数字3之前和括号之后添加了撇号

3 个答案:

答案 0 :(得分:1)

您的语法看起来有点困惑。为什么不把它们放在两个不同的选择中(如果可能的话......)?

我不知道这是否会有所帮助,但我发现了这一点,它会阻止它完全添加反引号。

  

$ this-> db-> select()接受可选的第二个参数。如果你设置   它为FALSE,CodeIgniter不会试图保护你的领域或表   带反叛的名字。如果您需要复合选择,这非常有用   言。

http://ellislab.com/codeigniter/user-guide/database/active_record.html

答案 1 :(得分:1)

嗯,如果你看一下活跃的rec类(system/core/database/DB_active_rec.php),你会在function select()中找到它:

if (is_string($select))
{
    $select = explode(',', $select);
}

所以你选择做的事实上是将你的字符串爆炸成如下数组:

array(
    WEEK(insere_le,
    3) AS semaine,
    COUNT(*) AS nombre
);

然后处理这个。

这看起来像是活跃记录类开发人员的疏忽,可能无法通过逃避价值来解决......

另一方面,它实际上在上面之前检查了它的字符串..所以可以试试这个:

$this->db->select(array('WEEK(insere_le,3) AS semaine', 'COUNT(*) AS nombre'))...

group_by(array('WEEK(insere_le,3)'))...

相同

所以最终结果将是:

$this->db->select(array('WEEK(insere_le,3) AS semaine', 'COUNT(*) AS nombre'))
                    ->from($this->table_name)
                    ->where(array(
                        'type_anomalie' => "Dérogation",
                        'YEAR(insere_le)' => $year
                    ))
                    ->group_by(array('WEEK(insere_le,3)'))
                    ->get()
                    ->result_array();

答案 2 :(得分:0)

你试过这个吗?:

$this->db->select("WEEK(insere_le,3) AS semaine, COUNT(*) AS nombre", FALSE);