【问题标题】:Mysql friends online displaymysql好友在线展示
【发布时间】:2013-04-12 03:59:06
【问题描述】:

好的,所以我到处搜索如何解决这个问题。我试图向在线用户展示,但不是所有用户,只有在你的朋友列表中的人。

所以我有一个名为 users_online 的表,当用户登录我的网站时,该表中会自动创建 1 行,其中包含日期、ip、名称、user_id 和friend_array(所有用户的朋友都保存在其中)

例如,我登录我的网站并在 users_online 表中创建行。我只想在线查看我的朋友,这些朋友存储在friend_array列中(1,5,16,5(那是朋友的ID号))。我如何从friends_array列中获取数据并查看记录了其中的哪一个ID目前,这意味着哪些 id 存在于 user_online 表中并显示在我的个人资料中?

我希望这不是令人困惑的问题......

这就是我的代码..online.php 文件中的所有商店:

// Checking wheter the visitor is already marked as being online:
$inDB = mysql_query("SELECT user_id FROM users_online WHERE user_id=".$userid);

if(!mysql_num_rows($inDB))
{
    // Selects some data required to insert into users_online table from users table
    $DB = mysql_query("SELECT img,fname,friend_array FROM users WHERE user_id=".$userid);
    while($row=mysql_fetch_assoc($DB))
    {
    $img = $row['img'];
    $fname = $row['fname'];
    $farray = $row['friend_array'];
    }
    mysql_query("   INSERT INTO users_online (user_id,ip,img,fname,friend_array)
                    VALUES(".$userid.",'".$intIp."','".$img."','".$fname."','".$farray."')");
}
else
{
    // If the visitor is already online, just update the dt value of the row:
    mysql_query("UPDATE users_online SET dt=NOW() WHERE user_id=".$userid);
}


// Counting all the online visitors:
// Thats where i need to work out with friend array..
// I need to display all online friends only
list($totalOnline) = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM users_online"));


// Outputting the number as plain text:
echo $totalOnline;

【问题讨论】:

  • 考虑将朋友列放到另一个表中,并将每个朋友存储一个新行,而不是在数组中。也不要在每次登录时插入新行,而是更新当前时间戳值。你也可以使用INSERT .... ON DUPLICATE KEY UPDATE online = NOW()
  • 我也想过这个问题。创建另一个表并只使用 id、user_id 和 friends_id..

标签: php mysql arrays


【解决方案1】:
<?php
    $friends = array(1,5,16); // Array of friends
    $friendIDs = implode(',', $friends); // Turns array into string for SQL select statement

    // Gets only friends info from DB
    $sql = "
        SELECT date, ip, name, user_id
        FROM users_online
        WHERE user_id IN (".$friendIDs.")";
?>

【讨论】:

  • 虽然在 user_online 表下线时不删除条目,但在他们离开后您将无法获得预期的结果...
【解决方案2】:

各位大佬解决了!谢谢你的帮助!

//Selecting an array from db
$DB = mysql_query("SELECT friend_array FROM users_online WHERE user_id=".$userid);
    while($row=mysql_fetch_assoc($DB))
    {
    $friend_array = $row['friend_array'];
    $friends = array($friend_array); // Array of friends
    $friendIDs = implode(',', $friends);
    }
// Counting all the online friends:

list($totalOnline) = mysql_fetch_array(mysql_query("
        SELECT COUNT(*)
        FROM users_online
        WHERE user_id IN (".$friendIDs.")"));


// Outputting the number as plain text:
echo $totalOnline;

输出是 1 个在线用户,因为我使用 2 个浏览器登录,并且在 users_online 表中创建了 2 行,id 为 1 和 2..id 1 在数组 (2,5,16) 中有 3 个朋友,用户使用id 2 有 (1,3)..所以在每个浏览器中的输出都是 1..Uray!我希望这个问题对某人有所帮助..顺便说一句,我在 msql 表上使用更新功能,如果用户注销,我只是删除 users_online 表中的行:)

【讨论】:

    【解决方案3】:

    您应该考虑更改数据库架构。这是一个例子:

    USER 表:

    id | name | current_session_id
    

    USER_FRIEND_USER 表(包含用户添加的好友):

    user_id | friend_user_id
    

    会话表:

    id | user_id | created_at | expires_at
    

    SQL 查询获取 id 为 '?' 的用户的好友列表:

    SELECT u.id, u.name FROM USER u
      INNER JOIN USER_FRIEND_USER ufu ON (ufu.friend_user_id = u.id)
      INNER JOIN SESSION s ON (s.id = u.current_session_id)
      WHERE ufu.user_id = ? AND s.expires_at >= NOW();
    

    这里是 SQL Fiddle 链接:http://sqlfiddle.com/#!2/34f83/1/0

    【讨论】:

      猜你喜欢
      • 2012-05-13
      • 2011-03-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      相关资源
      最近更新 更多