【问题标题】:PHP: A "Rank" SystemPHP:一个“等级”系统
【发布时间】:2013-03-30 20:27:41
【问题描述】:

我有一个由用户组成的 mysql 数据库。在该数据库中,有一个“分数”列。我想为用户制作个人资料,但它会显示他们的排名。我不想在服务器端做这个,所以我试图从个人资料页面本身做。这是我当前的代码:

$sql3 = mysql_query("SELECT * FROM members ORDER BY score DESC") or die("Could not allocate information!");
$rank = 0;
while(mysql_fetch_assoc($sql3)){
  $rank++;
}
echo "<b>Rank: </b>#$rank<br/>";

我也试过了:

$sql3 = mysql_query("SELECT * FROM members ORDER BY score DESC") or die("Could not allocate information!");
$rank = 0;
while(mysql_fetch_assoc($sql3)){
  $rank++;
  echo "<b>Rank: </b>#$rank<br/>";
}

无论哪种方式,每个用户都有相同的排名,#2。我有什么办法可以做到这一点吗?如果您需要更多信息,请发表评论,不要贬低我。谢谢。

【问题讨论】:

  • 在设置$rank 之后,在while 循环中尝试echoing。在您的第二次尝试中,您使用了$num 而不是$rank
  • 欢迎来到 Stack Overflow! Please, don't use mysql_* functions 在新代码中。它们不再被维护并且是officially deprecated。看到红框了吗?改为了解准备好的语句,并使用pdomysqli
  • 抱歉,我修复了我的代码。它曾经是 num,但现在是排名。无论哪种方式,它仍然将每个人显示为 2 级,如果我同时添加回声,他们将获得 1-2 级(我有 2 个用户)。
  • 你不指望他们在while回声的时候能拿到排名1和2吗?
  • 您是否考虑过使用mysql_num_rows() 函数,而不是在不使用它们的情况下循环获取结果?

标签: php mysql profile rank


【解决方案1】:

你试过了吗:

$sql3 = mysql_query("SELECT * FROM members ORDER BY score DESC") or die("Could not allocate information!");
$rank = 0;
while(mysql_fetch_assoc($sql3)){
    $rank++;
    echo "<b>Rank: </b>#$rank<br/>";
}

【讨论】:

  • 是的。这给了我:“排名:#1 排名:#2”
【解决方案2】:

只需使用&lt;ol&gt; [有序列表] 标签:

<ol>
<?php while($user = mysql_fetch_assoc($sql3)): ?>

    <li><?php echo $user['name']; ?></li>

<?php endwhile; ?>
</ol>

猜测您想显示用户的某些属性 [例如name 或您在表格中的名称],否则显示数字列表没有多大意义。

无论如何mysql_* 函数已被弃用,请移至PDOmysqli

【讨论】:

  • 我试图做的是找到用户在网站上的所有其他人中脱颖而出的位置,然后显示他们的“排名”。
  • 这就是代码的作用[根据你原来的 MySQL 查询]。
【解决方案3】:

试试

while($user = mysql_fetch_assoc($sql3)) {    
  $rank++;    
  echo "<b>#$rank. $user['name'] Score: </b> $user['score']<br />";    
}

但正如 hjpotter92 所指出的,请考虑使用 mysqli 或 pdo。

【讨论】:

  • 这显示排名 1-2(我有 2 个用户)。我只想显示 1 个用户排名,可以根据他们的分数找到该排名
  • 这就是我要找的。现在我希望它只显示特定用户名的信息。
  • 啊哈,添加到您的 sql 查询中:WHERE userId = X 或类似的。像:'SELECT * FROM members WHERE userId = 5 ORDER BY score DESC' 但是你可以跳过循环,而是这样做:$sql = mysql_query('SELECT * FROM members WHERE userId = 5 ORDER BY score DESC LIMIT 1'); $user = mysql_fetch_assoc($sql); echo "&lt;b&gt;#$rank. $user['name'] Score: &lt;/b&gt; $user['score']&lt;br /&gt;";
  • 当时的排名怎么样?你不能查询它,它也不能算自己(不想听起来像个混蛋)。那么我将如何处理“$rank”?
  • 是的,你是对的。保持循环并跳过 where 和 limit 部分。相反,您可以在循环中添加一个 if 语句来检查您是否找到了正确的用户,例如 if($user['id'] == 5) echo "#$rank...
【解决方案4】:

试试这样的:

$sql3 = mysql_query("SELECT * FROM members ORDER BY score DESC") or die("Could not allocate information!");
$rank = 0;
while($row = mysql_fetch_assoc($sql3)) {
     $rank++;
     if ($row['user_id'] == $current_pages_user_id){
           echo "<b>Rank: </b>#$rank<br/>";
     }
}

【讨论】:

  • 我不想显示用户分数。我想计算他们的分数并找出玩家在所有其他用户中的位置
  • 但我希望任何人都可以看到这些人的排名......而不仅仅是个人资料所有者
  • @RobertDoe 是的,这仍然有效。如果有意义的话,$current_pages_user_id 变量将设置为配置文件的所有者 ID。
  • 您能否正确获取当前配置文件的所有者 ID?
  • @RobertDoe 您的系统是如何工作的?用户有自己的文件夹吗?还是它使用GET?如果它使用GET很好,获取数据,那么你可以使用它来获取用户的id号。然后它检查该 id 编号是否等于 $sql3 生成的编号
【解决方案5】:

我认为你真正想要做的是这样的事情。

$result = mysql_query("SELECT member_name, score,
       (SELECT COUNT(*)
        FROM members ORDER BY score DESC) AS rank
FROM members
WHERE member_id = 5
LIMIT 1") or die("Could not allocate information!");

$member = mysql_fetch_assoc($result);

echo "<b>#$member['rank']. $member['name']</b> Score:  $member['score']<br />";

正如其他人之前提到的,请查看 mysqli 和 pdo。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 2012-01-10
    • 1970-01-01
    相关资源
    最近更新 更多