0

codeigniterでチャットシステムを実装しているので、オンラインの友達を表示したいです。オンラインの友達の数/名前を見つける方法を知りたいのですが、セッションを保存しているci_sessionsテーブルがあり、codeigniter自動保存でそれについて知っています。テーブルコールの友達がいて、そこには友達のリストがあり、テーブルの構造はこれです

 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 
            } 

        }


    ?> 

私のすべての友達がオンラインだとしたら、どうすれば彼らの数/名前/IDを見つけることができますか. ありがとう。

4

2 に答える 2

1

ci_sessionsテーブルにusir_idcolumを追加し、このクエリでこれを結合することでこれを実行しましたが、最初にuでセッションライブラリを作成する必要があり、最初に表示したシステム/ライブラリで見つけることができるセッションで少しコードが変更されますこれを変更するこの記事とuは、 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']];

               }

        }} ?>
于 2013-03-08T16:19:50.057 に答える
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 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
于 2013-03-07T08:35:01.153 に答える