2015-01-02 3 views
0

я попробовать что-то вроде этого:Эхо переменная I в то время как

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» , для этого я пытаюсь выполнить эту функцию. что не так?

+5

'$ i' никогда не меняется. вы, вероятно, захотите пощекотать «$ i = $ i + 1» там где-то ... –

+2

Пожалуйста, [не используйте 'mysql_ *' функции] (http://stackoverflow.com/questions/12859942/why- shouldnt-i-use-mysql-functions-in-php) в новом коде. Они больше не поддерживаются и [официально устарели] (https://wiki.php.net/rfc/mysql_deprecation). Узнайте о [подготовленных заявлениях] (http://en.wikipedia.org/wiki/Prepared_statement) и используйте [PDO] (http://us1.php.net/pdo) или [MySQLi] (http: // us1.php.net/mysqli). –

ответ

0

В основном, что вы здесь делаете, подсчитываете, сколько пользователей имеет atacs больше или равно 's atacs. Проблемы с этим:

  • Ужасно неэффективно. Обратите внимание, что база данных извлекает и отправляет на ваш , пока цикл записи для каждого пользователя, даже те, у кого есть atacs меньше, чем $userid. Все, кроме одного из них, итерации цикла ничего не делают по дизайну. Много потерянного времени, отправляющего данные из базы данных на PHP, который даже не использует его.
  • Протяните еще больше данных назад чем это необходимо. Вы в конечный итоге с каждый строки для каждых пользователя в вашего всегоusers стола - но ваш результат просто скалярное число (сколько пользователи с> баллом).
  • Фактически дает неверные результаты в том случае, если ваш счет связан с другими людьми. В этом случае, пользователей: пользователей с аналогичной оценкой могут считаться "выше", а другие "ниже пользователей".

Базы данных хороши при итерации по данным; это все «локально» доступны, и механизм базы данных может сделать много оптимизаций , если вы можете описать в 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 текущего пользователя. Все пользователи с одинаковой оценкой получат одинаковый ранг, а следующий ранг будет соответственно выше, поэтому он не страдает от ошибок вашего метода.

В качестве окончательного примечания, наиболее подходящий способ сделать что-то вроде лидеров - это, вероятно, периодически прекомпопировать таблицу лидеров, а затем использовать результаты, чтобы показать позицию каждого пользователя в списках лидеров, а не пытаться вычислить ее на лету для каждого пользователь.Но это еще дальше из-за границы :)

0

Необходимо прибавить $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.

+0

Если он представлен этим заказом, тогда инкрементирование должно быть как раз перед оператором if .... Поскольку он передает один идентификатор пользователя. Какова точка приращения $ i после эхо-ответа ... –

+0

Я думал, что оператор IF должен вызвать инкремент. В противном случае, это не пользователь, который будет представлен, так зачем увеличивать счетчик? Но я вижу вашу точку зрения. Я отредактирую ответ. Благодарю. –

+0

не работает ни в коем случае – rpV

Смежные вопросы