2012-04-03 70 views
1

我注意到,當通過活動記錄的CI中的日期時間列進行排序時,它將該列視爲字符串或int。CI活動記錄,escapes&order_by日期時間列

實施例:

$this->db->limit(12); 
    $this->db->where('subscribed',1); 
    $this->db->join('profiles','profiles.user_id=users.id'); 
    $this->db->where('active',1); 
    $this->db->select('users.thumbUpload,users.vanity_url'); 
    $this->db->select('users.created_on as time'); 
    $this->db->order_by('time'); 
    $query = $this->db->get('users'); 

這是users.created_on是一個日期時間字段。首先,這是因爲活躍的記錄是在渲染time還是其他東西?如果是這樣,我能否以某種方式防止order_上的轉義?

另外,stackoverflow,請停止autocorrecting'datetime'到'日期時間'。它很煩人。

乾杯!

回答

0

當您將第二個參數設置爲false時,函數將不檢查並轉義字符串。試試這個

$this->db->select('users.created_on as time', FALSE); 

或爲您查詢使用

$this->db->order_by('users.created_on', 'DESC'); //or ASC 

而對於複雜的查詢

$this->db->query("query"); 
+1

是的,這是order_by似乎不能設置爲false。有沒有辦法解決這個問題,而不是將整個事情列在db-> query('foo')中? – 2012-04-03 15:24:21

+0

@MichaelWatson是它的。對於不能使用活動記錄提示的複雜查詢,只需調用db-> query('foo')' – safarov 2012-04-03 16:02:18

+0

也可以嘗試'db-> order_by(users.created_on)' – safarov 2012-04-03 16:02:49

0

根據該方法的CI(目前爲2.2)的核心文件的簽名,它沒有任何選擇允許選擇是否逃生。

// The original prototype of the order_by() 
public function order_by($orderby, $direction = '') { 
    // Definition 
} 

正如你看到沒有參數作爲參數列表$escape = true。這樣做的一個方法是破解這個核心文件我通常不會建議它,因爲如果您稍後將CI升級到新版本,那麼這些更改將會丟失,但如果您不打算這樣做,它可以使用它)。

要做到這一點,首先更改原型:

public function order_by($orderby, $direction = '', $escape = true) { 
    // Definition 
} 

再檢查條件的定義如下部分:

// Line 842 
if($escape){ 
    $part = $this->_protect_identifiers(trim($part)); 
}else { 
    $part = trim($part); 
} 

// Line 856 
if($escape){ 
    $orderby = $this->_protect_identifiers($orderby); 
}  

當你調用它,以防止逃逸:

$this->db->order_by($ORDERBY_CLAUSE, null, false);