0

CodeIgniter フレームワークを使用して Web サイトを作成しました。ユーザー システムがあり、データベースに最後の 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');

主キーに基づいて削除する場合は、使用される 2 番目の where メソッドを無視できます。

于 2013-10-20T18:28:47.813 に答える