同时回应i的变量

时间:2015-01-02 19:42:40

标签: php mysql loops echo

我尝试这样的事情:

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"页面,为此我尝试使这个功能。 怎么了?

2 个答案:

答案 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的用户数。问题:

  • 非常低效。请注意,数据库会检索并发送给您 while循环为每个用户创建一个条目,即使是那些拥有atacs的用户 小于$userid。除了其中一个循环迭代之外的所有循环 没有任何设计。大量浪费时间从中发送数据 数据库到PHP,它甚至不使用它。
  • 拉回更多数据 比必要的。您最终会为每个用户的每个行 你的整个 users表 - 但你的结果只是一个标量数字 (有多少用户使用>得分)。
  • 其实给你错误的结果 在你的分数与其他人并列的情况下。在这种情况下一些 具有相同分数的用户可被计为"以上"用户,其他人 as"低于用户"。

数据库善于迭代数据;它' 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的用户数。具有相同分数的所有用户将获得相同的排名,并且下一排名将适当地更高,因此它不会遭受任何方法错误。

作为最后一点,最适合做排行榜的方法可能是定期预先计算排行榜,然后使用结果显示每个用户在排行榜中的位置,而不是试图在排行榜上计算为每个用户飞翔。但这甚至超出了范围:)