• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[PHP] HILFE beim Erstellen einer Rangliste!

Saventi

New member
So, ich bin gerade dabei eine Rangliste zu erstellen und im Moment sieht das Ganze nur so aus:

PHP:
<?php
$re = mysql_query("SELECT name, money FROM user ORDER BY money DESC, name ASC");

for($i=1;$i<mysql_num_rows($re);$i++)   
{   

$row = mysql_fetch_array($re); 
echo "<tr><td>" . $i . "</td>";
echo "<td>" . $row[name] . "</td>";   
echo "<td>" . $row[money] . " €</td></tr>";

}

?>

Ich möchte aber, dass man selbst (also der eingeloggte Benutzer) sich zumindest hervorgehoben in der Rangliste sieht. Am besten wäre es sogar so, dass die Rangliste über mehrere Seiten geht und z.B. pro Seite 10 Platzierungen angezeigt werden. Der eingeloggte Benutzer gelangt dann automatisch auf die Seite mit seiner Platzierung und wird noch fett hervorgehoben. Der Benutzer soll natürlich dann über die einzelnen Seiten blättern und sich die Platzierung der anderen Benutzer anschauen können. Da ich vor allem mit Sessions arbeite, denke ich wäre das auch hier eine gute Lösung - vielleicht liege ich auch falsch, aber ich weiß wirklich im Moment nicht wie ich das realisieren soll.


Gruß, Saventi!
 
Das mit dem fett ist kein Problem: eingeloggter Name mit $row['name'] vergleichen und dann entsprechend formatieren.

Für eine begrenzte Anzahl von Stellen gibt es in MySQL LIMIT und für die Gesamtanzahl SQL_CALC_FOUND_ROWS

PS: Du solltest dringend error_reporting(E_ALL); aktivieren.
 
So, danke für den Tipp mit dem Vergleich. Warum bin ich da bloß selbst nicht drauf gekommen?^^ Nun, verstehe ich aber nicht ganz, was ich mit dem LIMIT und SQL_CALC_FOUND_ROWS anfangen soll...

Ich möchte ja, dass das ganze über mehrere Seiten geht, also auf Seite 1: Platz 1-10 , auf Seite 2: Platz 11-20 usw. Eine Alternative wäre noch und ich denke das ist auch leichter realisierbar: Es werden nur die ersten 10 Plätze angezeigt UND die eigene Platzierung. Das Ganze müsste dann so aussehen, dass die ersten 10 Plätze angezeigt werden und wenn man selbst zum Beispiel Platz 2353 ist, sollen alle Plätze dazwischen NICHT angezeigt und danach auch NICHT angezeigt werden, sondern nur der Platz 2353.

Meiner Meinung nach ist aber die zweite Variante nicht sehr schön, deswegen wäre es besser wenn man ALLE Platzierungen VERTEILT auf mehrere Seiten angezeigt bekommt, dabei soll aber als erstes die Seite angezeigt werden auf der sich die Platzierung des eingeloggten Benutzers befindet.

Ich hoffe das war jetzt verständlich genug^^. :p

Danke im Voraus,

Saventi!
 
Gut, ich denke ich verstehe deinen Ansatz, allerdings müsste ich bei dieser Methode ja jede einzelne Seite selber erstellen. Das geht aber nicht weil die Benutzerzahl ja nicht immer gleich bleibt. Wie kriege ich es also hin, dass ab 10 Plätzen automatisch eine neue Seite erstellt wird?
 
Danke für die Hilfe, aber ich habe mich jetzt erstmal damit zufrieden gegeben per for-Schleife eine Top10-Rangliste auszugeben und dann nochmal per for-Schleife und if-Abfrage die eigene Platzierung auszugeben.

Bei der ersten for-Schleife wird also eine vollständige Tabelle mit den Plätzen 1-10 ausgeben und die zweite for-Schleife läuft solange durch und erhöht die Variable $i bis sie auf die selbe ID trifft wie die $_SESSION['user_id'] und wenn das der Fall ist wird eine Tabelle ausgegeben. Dadurch sieht der Benutzer zwar nicht alle Ränge zwischen ihm und der Top10 und auch nicht hinter ihm, aber immerhin weiß er auf welchem Rang er selbst sich befindet. Wenn ich mehr Zeit habe, werde ich mich dann vielleicht auch Mal intensiver mit deiner Lösung befassen, aber fürs Erste sollte es auch so gehen. ;)
 
Aua. So wäre es in deinem momentanen Fall sinnvoll:
PHP:
$re = mysql_query("SELECT name, money FROM user ORDER BY money DESC, name ASC LIMIT 10");

for($i=1;$i <= mysql_num_rows($re);$i++)   // wenn du bei 1 anfängst zu zählen musst du bis zur Anzahl zählen, sonst fällt der letzte Platz weg. Daher <=
{   

$row = mysql_fetch_array($re); 
echo "<tr><td>" . $i . "</td>";
echo "<td>" . $row[name] . "</td>";   
echo "<td>" . $row[money] . " €</td></tr>";

}

// Platzbestimmung über sql
$re = mysql_query("SELECT name, money,
(SELECT count(user_id) FROM user a WHERE a.money > b.money OR (a.money = b.money AND a.name < b.name))+1 as platz
 FROM user as b WHERE user_id = ".$user_id);

?>

Um deine Plätze über mehrere Seiten zu verteilen, benötigst du nur ein php-Skript. Diesem übergibst du die gerade anzuzeigene Seite per GET. Nehmen wir mal an in $current_page steht die Seite die du gerade anzeigen willst und in $entries_per_page die Anzahl der Plätze die du auf einer Seite anzeigen willst. Außerdem gehe ich mal davon aus dass du nicht wie ein Informatiker zählst und daher deine erste Seite die Seite 1 ist (und nicht 0).
Mit Limit kannst du nun den Bereich der Daten auswählen die für der jeweilige Seite interessant ist:
LIMIT ($current_page-1) * $entries_per_page, $entries_per_page
Erstere Zahl ergibt den Offset, also das Datum ab dem die Datensätze ausgewählt werden (bei Seite 1 ist dies 0), zweitere Zahl gibt die Anzahl an Datensätzen an. Aber das weißt du sicherlich schon, da du ja die Links gelesen hast :).
Anzahl der Seiten erhälst du über
ceil($count_entries / $entries_per_page)
und die Seite auf der der momentane User platziert ist mit:
ceil($user_ranking / $entries_per_page)
 
Natürlich habe ich die Links gelesen - auch wenn mein Englisch nicht das Beste ist - aber ich gebe mir Mühe. Werde mir deinen Beitrag wohl noch einige Mal durchlesen müssen, aber so in etwa habe ich das Prinzip verstanden - mal schauen wie lange es dauern wird bis ich das umsetzen kann.
 
Zurück
Oben