我使用CodeIgniter框架创建了一个网站。我有一个用户系统,我试图在我的数据库中只保留最后5次登录。 这是我写的代码:
$logins = array(
'uid' => $user['id'],
'time' => now(),
'ip' => $this->input->ip_address()
);
$this->db->insert('logins', $logins);
$this->db->where('uid', $user['id']);
$logins_no = $this->db->count_all_results('logins');
$logins_deleted = $logins_no - 5;
if ($logins_deleted > 0) {
$this->db->where('uid', $user['id']);
$this->db->order_by('time asc');
$this->db->limit($logins_deleted);
$this->db->delete('logins');
}
基本上,我在用户连接时插入日期和IP,然后从数据库中计算登录表中用户的所有记录。如果有超过5次登录,我会计算我必须删除多少结果。
为什么它不起作用?
答案 0 :(得分:0)
SQL不允许ORDER BY子句成为DELETE查询的一部分,因此您必须像Jeemusu建议的那样:
获取要删除的行的唯一标识符。你还没有指定你是否有一个主列(你应该)所以我们只是为了解释而使用时间列:
$query = $this->db->where('uid', $user['id'])->order_by('time asc')->limit(5)->get('logins');
$result = $query->result();
使用时间列的值创建一个数组:
$times = array();
foreach($result as $r) {
$times[] = $r->time;
}
现在使用Active Record的where_in方法删除这些行:
$this->db->where_in('time', $times)->where('uid', $user['id'])->delete('logins');
如果您根据主键进行删除,可以忽略第二种方法。