PHP MySQL - получение индекса определенной строки

Я использую базу данных MySQL для записи рекордов игроков в игре, которую я создаю. Доступ к базе данных MySQL осуществляется через файл PHP "highscores.php".

Все рекорды записываются в базу данных, но я хочу, чтобы фактические номера рангов были реализованы в файле PHP. Я хочу иметь возможность запрашивать рейтинг конкретного игрока, а не только запрашивать его / ее рекорд.

Я использую это, чтобы получить рекорд моего игрока:

$username = $_GET["username"];

$checkID = mysql_query("SELECT * from Highscores WHERE Username =
'$username' ORDER BY Score DESC");

$row = mysql_fetch_array($checkID);

echo $row["Score"];

Теперь, чтобы получить рейтинг моего игрока среди всех других игроков, все, что мне нужно сделать, это найти индекс рассматриваемой строки... Но как мне это сделать?

Заранее спасибо!


person user1634334    schedule 29.08.2012    source источник
comment
Просто чтобы вы знали, у вас есть потенциальная дыра в безопасности прямо здесь. SQL-инъекция может быть неприятной. Вы можете выполнить поиск по строкам методом грубой силы, но я подозреваю, что кто-то знает классный способ SQL сделать это.   -  person thatidiotguy    schedule 30.08.2012
comment
Да .. вставьте обязательное использование комментариев mysqli или PDO здесь. Также вставьте здесь обязательный комментарий о риске SQL-инъекций.   -  person Mike Brant    schedule 30.08.2012
comment
@MikeBrant: не забудьте обязательную ссылку XKCD: http://xkcd.com/327/.   -  person Joe Stefanelli    schedule 30.08.2012
comment
Несмотря на то, что PDO не имеет к этому никакого отношения, функция fetchall из PDO на самом деле в каком-то смысле проиндексировала бы их для вас. Это массив массивов, поэтому $row[0] будет #1, и так далее, и так далее.   -  person Will    schedule 30.08.2012
comment
Вам нужен ранг наивысшего результата конкретного игрока или ранги всех рекордов конкретного игрока?   -  person Arjan    schedule 30.08.2012


Ответы (3)


Вы можете сделать это с помощью SQL напрямую следующим образом:

SELECT @rownum:=@rownum+1 ‘rank’, h.*
FROM Highscores h, (SELECT @rownum:=0) r
ORDER BY score DESC;
person Peter Isberg    schedule 29.08.2012
comment
Это было очень полезно для добавления долгожданной функции в приложение форума. Я хотел найти номер страницы, на которой находится данный комментарий. Я вложил этот запрос в другой запрос, чтобы получить точное число, например: SELECT index FROM (SELECT @rownum:=@rownum+1 index, c.* FROM content c, (SELECT @rownum:=0) r WHERE pid = 6 #[ID поста] ORDER BY id) AS tmp WHERE id = 32 #[ID комментария] - person vishva8kumara; 26.04.2017

Вы могли бы сделать -

// gets all the records with higher scores than current user
$ranking = mysql_query("SELECT count(*) AS ranking FROM Highscores WHERE Score > (SELECT Score FROM Highscores WHERE Username = '$username' ORDER BY Score DESC LIMIT 1)");
// creates an array from the mysql query above
$ranking_array = mysql_fetch_assoc($ranking); 
// gets the number of higher scores from the array
$ranked_above = $ranking_array['ranking']; 
// takes the total number ranked above and adds a 1 to get their rank
$current_rank = $ranked_above++;

Обратите внимание на комментарии выше о SQL-инъекциях и отказе от использования функций mysql_.

person Sean    schedule 29.08.2012
comment
Я пробовал это, но у меня есть идентификатор ресурса № 9... Что я делаю неправильно? - person user1634334; 30.08.2012
comment
Извините, моя ошибка. При выполнении mysql_query в php он помещает результат в качестве ресурса, поэтому вам нужно использовать mysql_fetch_assoc, чтобы поместить результат в массив для его использования. Я отредактировал свой ответ. Вы можете узнать больше об этом на - stackoverflow.com/questions/5523840/what-is- идентификатор ресурса-уведомления9 или stackoverflow.com/questions/4831364/what- ресурсы?rq=1 - person Sean; 30.08.2012

Основываясь на вашем дизайне БД, я не знаю, есть ли у вас много других вариантов, кроме как выбрать всю таблицу оценок из БД, отсортированную по оценке, пройтись по ней, назначая значение индекса оценки каждому элементу, но вытягивая только те, которые относятся к вашему пользователя для отображения.

Похоже, вы, возможно, захотите запустить какой-то процесс для регулярного ранжирования оценок в базе данных или, может быть, создать хранимую процедуру для выбора всех socres, присвоить им значения ранга и выбрать из них связанные с пользователем.

person Mike Brant    schedule 29.08.2012