2013-03-07 29 views
0

我正在codeigniter中實現一個聊天系統,所以現在我想顯示在線的朋友。現在我想知道如何找到在線的朋友的計數/名稱,我有一個ci_sessions表,我正在存儲會話,codeigniter自動存儲它你知道它。我有一個表調用的朋友,我有我的朋友表的結構清單是這個在線尋找朋友從ci_sessions

id  user_id  friend_id 
    1   1    2 
    2   1    3 
    3   1    4 

這樣。所以我想根據朋友表從ci_session知道在線用戶。所以我用這個視圖或HTML

<?php 

     $this->db->where("user_data <>",""); 
     $query = $this->db->get('ci_sessions'); 
     $result=$query->result(); 

     foreach ($result as $row) 
     { 
      $user_data=$row->user_data; 
      foreach (unserialize($user_data) as $k => $v) 
      { 
       // here is something will be done if i m not wrong 
      } 

     } 


    ?> 

想我所有的朋友都在網上,所以我如何才能找到自己的計數/姓名/身份證。謝謝。

+1

是否存儲該表的ci_session有一個用戶id列? – 2013-03-07 08:34:13

+0

不,它存儲在user_data中,如果我們反序列化,那麼我們可以得到它 – 2013-03-07 08:43:23

回答

1

我已經加入usir_id做過一個在ci_sessions表中加入colum,然後通過這個查詢加入,但是首先你應該讓你的會話庫和一點點代碼在builit中,可以在系統/庫 發現會話時的第一您查看這篇文章,以改變和U將得到的想法如何做到這一點 Find Online Friends using ci_sessions

然後使用此代碼獲取數據。我在我看來用它。你可以隨意使用它。

$data = array(); 

    $this->db->select('*'); 
    $this->db->from('ci_sessions'); 
    $this->db->join('users', 'users.user_id=ci_sessions.user_id'); 
    $this->db->join('friends', 'friends.user_id=ci_sessions.user_id or friends.sender_id=ci_sessions.user_id'); 

    $this->db->where('ci_sessions.user_id !=', $this->session->userdata('user_id')); 
    $this->db->where('friends.sender_id', $this->session->userdata('user_id')); 
    $this->db->or_where('friends.user_id', $this->session->userdata('user_id')); 
    $this->db->where('users.user_id !=' , $this->session->userdata('user_id')); 

    $this->db->where('friends.status', 1); 

    $this->db->where('user_data !=', ''); 


    $query = $this->db->get(); 
    $num_rows = $query->num_rows(); 

然後用這個來顯示朋友的姓名,你可以改變你想要的。

   <?php 

      if ($num_rows <= 0){?> 

      foreach ($query->result() as $row) 
      { 
       $udata = unserialize($row->user_data); 
       /* put data in array using username as key */ 
       $data[$udata['name']] = $udata['name']; 

       $time=$row->last_activity; 
       $timeOut = time() - 150; 

       if ($time >= $timeOut) 
       { //display name} else 
         echo $data[$udata['name']]; 

       } 

     }} ?> 
+0

我花了很多時間來找到這種類型的點解決方案。謝謝@Aysha Ali ... – 2013-03-08 16:50:40

1

東西

SELECT 
    user.name 
FROM users 
WHERE user_ID IN(SELECT friend_ID FROM friends WHERE user_ID='$current_user') AND 
     user_ID IN(SELECT user_ID FROM ci_sessions)` 

應該工作。

然後用$db->num_rows;來計數。

UPDATE

這運行的每個用戶對象創建時間:

UPDATE users SET last_activity=NOW() WHERE entity_ID=? 

然後使用該查詢:

SELECT 
    entities.UUID, 
    users.entity_ID, users.first_name, users.last_name, userinfo.image_ID 
FROM users 
LEFT JOIN entities ON entities.ID=users.entity_ID 
LEFT JOIN friends ON users.entity_ID=friends.user_ID_1 OR 
        users.entity_ID=friends.user_ID_2 
LEFT JOIN userinfo ON users.entity_ID=userinfo.user_ID 
WHERE 
    (friends.user_ID_1=? OR friends.user_ID_2=?) AND friends.approved=1 AND 
    users.entity_ID!=? AND (TIMESTAMPDIFF(MINUTE, users.last_activity, CURRENT_TIMESTAMP) < 15) 
ORDER BY first_name DESC 
+0

ci_sessions中沒有用於user_id的列 – 2013-03-07 08:45:55

+0

然後將其反序列化並在查詢中使用它或修改代碼或以其他方式使用它(我將發佈「我的方式「在我的答案)。 – AmazingDreams 2013-03-07 08:48:59