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) 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- the-notice-resource-id9 или stackoverflow.com/questions/4831364/what- are-resources?rq=1 - person Sean; 30.08.2012

Въз основа на дизайна на вашата DB, не знам дали имате много други възможности, освен да изберете цялата таблица с резултати от DB, сортирана по резултат, да преминете през нея, като присвоите стойност на индекса на резултата на всеки елемент, но изваждате само онези, които са конкретни за вашия потребител за показване.

Изглежда, че може да искате да обмислите изпълнението на някакъв процес за редовно класиране на резултатите в базата данни или може би да създадете съхранена процедура, за да изберете всички socres, да им дадете стойности за ранг и да изберете тези, свързани с потребителя от тях.

person Mike Brant    schedule 29.08.2012