CI активная запись, экранирование и столбец date_by order_by - PullRequest
1 голос
/ 03 апреля 2012

Я заметил, что при упорядочении по столбцу datetime в CI с активной записью он обрабатывает столбец как строку или как int.

Пример:

$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_by?

Кроме того, stackoverflow, пожалуйста, прекратите автозамену «datetime» на «date time».Это раздражает.

Ура!

Ответы [ 2 ]

0 голосов
/ 17 ноября 2014

Согласно сигнатуре метода в основных файлах 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);
0 голосов
/ 03 апреля 2012

Когда вы устанавливаете второй аргумент как false, функция не будет проверять и экранировать строку.Попробуйте это

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

Или для вашего запроса используйте

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

И для сложных запросов

$this->db->query("query");
...