我尝试这样的事情:
function userrank($userid){
$sql = mysql_query("SELECT * FROM users ORDER BY atacs DESC");
$i = 1;
while ($row = mysql_fetch_assoc($sql)) {
if ($row['username'] == $userid) {
echo 'You are on ' . $i . ' in the general leaderbord';
}
}
}
在排行榜上,它正确地向我显示排名,但我也想在另一页上显示我,在#34; youraccount"页面,为此我尝试使这个功能。 怎么了?
答案 0 :(得分:0)
您必须增加$i
。我假设排行榜顺序由您的查询结果表示。因此,如果为true,请按如下所示更改代码:
function userrank($userid){
$sql = mysql_query("SELECT * FROM users ORDER BY atacs DESC");
$i =0; // starts out with an unknown rank.
while ($row = mysql_fetch_assoc($sql)) {
$i++; // increment $i here.
if ($row['username'] == $userid) {
echo 'You are on ' . $i . ' in the general leaderbord';
}
}
}
$ i肯定会增加。因此,如果它不能正常工作,我会查看您的查询结果是什么。尝试回显$ row ['用户名']并查看该值是什么,然后将其与$ userid的回显calue进行比较。
答案 1 :(得分:0)
基本上,您在此处执行的操作是计算atacs
大于或等于$userid
' atacs
的用户数。问题:
atacs
的用户
小于$userid
。除了其中一个循环迭代之外的所有循环
没有任何设计。大量浪费时间从中发送数据
数据库到PHP,它甚至不使用它。 users
表 - 但你的结果只是一个标量数字
(有多少用户使用>得分)。 数据库善于迭代数据;它' S 所有"本地"可访问和数据库引擎可以做很多 优化如果您可以在SQL中描述您正在尝试的内容 完成。所以不要这样做,为什么不这样做呢 数据库中的所有内容?
set @user_atacs = ( select atacs from users where id = 12 );
select count(*) +1 from users where atacs > @user_atacs;
我在这里嘲笑了表:http://sqlfiddle.com/#!2/ff9a86/3
此解决方案基本上只计算具有比当前用户更高atacs
的用户数。具有相同分数的所有用户将获得相同的排名,并且下一排名将适当地更高,因此它不会遭受任何方法错误。
作为最后一点,最适合做排行榜的方法可能是定期预先计算排行榜,然后使用结果显示每个用户在排行榜中的位置,而不是试图在排行榜上计算为每个用户飞翔。但这甚至超出了范围:)