Sql CI活动记录、转义和;按日期时间列排序

Sql CI活动记录、转义和;按日期时间列排序,sql,codeigniter,datetime,activerecord,sql-order-by,Sql,Codeigniter,Datetime,Activerecord,Sql Order By,我注意到,当在带有活动记录的CI中按datetime列排序时,它将该列视为字符串或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-&g

我注意到,当在带有活动记录的CI中按datetime列排序时,它将该列视为字符串或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是一个日期时间字段。首先,是因为活动记录正在渲染
时间
转义,还是因为其他原因?如果是这样的话,我能以某种方式阻止按命令逃跑吗

此外,stackoverflow,请停止将“datetime”自动更正为“date time”。真烦人


干杯

当您将第二个参数设置为false时,函数不会检查和转义字符串。试试这个

$this->db->select('users.created_on as time', FALSE);
或供您查询使用

$this->db->order_by('users.created_on', 'DESC'); //or ASC
对于复杂的查询

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

当您将第二个参数设置为false时,函数不会检查和转义字符串。试试这个

$this->db->select('users.created_on as time', FALSE);
或供您查询使用

$this->db->order_by('users.created_on', 'DESC'); //or ASC
对于复杂的查询

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

根据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);

根据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);

是的,这是顺序,似乎不能设置为错误。有没有办法避免在db->query('foo')中列出整件事?@MichaelWatson是的。对于无法使用活动记录提示的复杂查询,请仅使用
db->query('foo')
调用,并尝试使用
db->order\u by(users.created\u on)
Hmmm,按照您的建议规定表格并不能解决问题。我将在db->query()中列出它。不好意思,还有一点奇怪的order_by()不允许跳过逃逸,因为我敢肯定人们经常按日期时间订购。@MichaelWatson你确定它不起作用吗?也许你想要
DESC
order?是的,是order\u by似乎无法设置为false。有没有办法避免在db->query('foo')中列出整件事?@MichaelWatson是的。对于无法使用活动记录提示的复杂查询,请仅使用
db->query('foo')
调用,并尝试使用
db->order\u by(users.created\u on)
Hmmm,按照您的建议规定表格并不能解决问题。我将在db->query()中列出它。不好意思,还有一点奇怪的order_by()不允许跳过逃逸,因为我敢肯定人们经常按日期时间订购。@MichaelWatson你确定它不起作用吗?也许你想要
DESC
订单?