0

我使用 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 次,我会计算必须删除的结果数。

为什么它不起作用?

4

1 回答 1

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');

如果您根据主键进行删除,则可以忽略使用的第二种 where 方法。

于 2013-10-20T18:28:47.813 回答