在 while 中回显 i 的变量
Echo the variable of i in while
我尝试这样的事情:
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';
}
}
}
在排行榜上它正确地显示了我的排名,但我也想在另一个页面上显示我,在 "youraccount" 页面上,为此我尝试实现此功能。
怎么了?
您必须递增 $i
。我假设排行榜订单由您的查询结果表示。因此,如果为真,请按如下方式更改您的代码:
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['username'] 并查看值是什么,然后将其与 $userid.
的回显值进行比较
基本上,您在这里所做的是计算 atacs
大于或等于 $userid
的 atacs
的用户数。问题:
- 效率极低。注意数据库检索并发送到您的
while 为每个用户循环一个条目,即使是那些拥有
atacs
小于 $userid
。所有这些 while 循环迭代中只有一个
不按设计做任何事情。大量浪费时间从
数据库到 PHP,甚至不使用它。
- 拉回更多数据
比必要的。对于 every 用户,你最终得到 every 行
你的 entire
users
table - 但你的结果只是一个标量
(有多少用户得分 >)。
- 实际上给你错误的结果
如果您的分数与其他人的分数持平。在这种情况下一些
得分相同的用户可能被计为"above"用户,其他
作为 "below the users"。
数据库擅长迭代数据;它是
所有 "locally" 都可以访问并且数据库引擎可以使许多
如果您可以在 SQL 中描述您正在尝试的内容,则进行优化
完成。因此,与其那样做,不如这样做
数据库中的所有内容?
set @user_atacs = ( select atacs from users where id = 12 );
select count(*) +1 from users where atacs > @user_atacs;
我在这里模拟了 table:http://sqlfiddle.com/#!2/ff9a86/3
这个解决方案本质上只是计算 atacs
比当前用户更高的用户数量。所有得分相同的用户将获得相同的排名,下一个排名会适当更高,因此不会受到您方法的任何错误的影响。
最后一点,做排行榜之类的事情最合适的方法可能是定期预先计算排行榜,然后使用结果显示每个用户在排行榜中的位置,而不是尝试动态计算它每个用户。但这超出了范围:)
我尝试这样的事情:
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';
}
}
}
在排行榜上它正确地显示了我的排名,但我也想在另一个页面上显示我,在 "youraccount" 页面上,为此我尝试实现此功能。 怎么了?
您必须递增 $i
。我假设排行榜订单由您的查询结果表示。因此,如果为真,请按如下方式更改您的代码:
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['username'] 并查看值是什么,然后将其与 $userid.
的回显值进行比较基本上,您在这里所做的是计算 atacs
大于或等于 $userid
的 atacs
的用户数。问题:
- 效率极低。注意数据库检索并发送到您的
while 为每个用户循环一个条目,即使是那些拥有
atacs
小于$userid
。所有这些 while 循环迭代中只有一个 不按设计做任何事情。大量浪费时间从 数据库到 PHP,甚至不使用它。 - 拉回更多数据
比必要的。对于 every 用户,你最终得到 every 行
你的 entire
users
table - 但你的结果只是一个标量 (有多少用户得分 >)。 - 实际上给你错误的结果 如果您的分数与其他人的分数持平。在这种情况下一些 得分相同的用户可能被计为"above"用户,其他 作为 "below the users"。
数据库擅长迭代数据;它是 所有 "locally" 都可以访问并且数据库引擎可以使许多 如果您可以在 SQL 中描述您正在尝试的内容,则进行优化 完成。因此,与其那样做,不如这样做 数据库中的所有内容?
set @user_atacs = ( select atacs from users where id = 12 );
select count(*) +1 from users where atacs > @user_atacs;
我在这里模拟了 table:http://sqlfiddle.com/#!2/ff9a86/3
这个解决方案本质上只是计算 atacs
比当前用户更高的用户数量。所有得分相同的用户将获得相同的排名,下一个排名会适当更高,因此不会受到您方法的任何错误的影响。
最后一点,做排行榜之类的事情最合适的方法可能是定期预先计算排行榜,然后使用结果显示每个用户在排行榜中的位置,而不是尝试动态计算它每个用户。但这超出了范围:)