Hallo und willkommen zu meinem ersten PHP-Tutorial.
Da ich diese Frage hin und wieder zu lesen bekomme, habe ich mich dazu entschlossen ein Tutorial dafür zu schreiben, wie man (beispielsweise für ein UCP)
Spielerlisten erstellen kann.
Mit CSS verschönert kann eine solche Tabelle dann beispielsweise so aussehen:
Die \n dienen lediglich der Lesbarkeit des Codes in der fertigen Seite.
Dadurch wird aus ewig langen Zeilen mit unlesbaren Wiederholungen ein lesbarer Code mit Zeilenumbrüchen an passenden Stellen.
Diese \n können aber theoretisch auch weggelassen werden.
Die hier angesprochenen Methoden und Funktionen beziehen sich vollständig auf MySQL. Mit Dateisystemen wie dini o.Ä. ist für gewöhnlich keine Möglichkeit gegeben,
ein Limit bei einer Dateiabfrage anzugeben. Dies kann dort meist nur über Umwege erreicht werden.
Zuerst einmal sollten wir uns nun den Aufbau der Tabelle ansehen:
[PHP]<table>
<thead><tr>
<th>Spielername</th>
<th>Spielzeit</th>
<th>Punkte</th>
<th>Adminlevel</th>
</tr></thead>
// Für jeden noch folgenden Spieler:
<tr>
<td>Padarom</td>
<td>124 Stunden, 27 Minuten</td>
<td>12</td>
<td>3</td>
</tr>
// Bei mehreren Seiten hinzufügen:
<tfoot><tr><td colspan="4">
<ul>
<li><a href="#"><span>Zurück</span></a></li>
<li><a href="#"><span>1</span></a></li>
<li><a href="#"><span>2</span></a></li>
<li><a href="#"><span>Weiter</span></a></li>
</ul></td></tr>
</tfoot>
</table>[/PHP]
So würde der grundlegende Tabellenaufbau einer solchen Liste aussehen. Da wir also einen immer gleich bleibenden Aufbau
für das Einfügen aller Spieler haben, sind wir in der Lage dies mit einer Schleife zu lösen, in der für jeden Spieler die Daten eingetragen werden.
Gehen wir zuerst einmal davon aus, dass wir 10 Spieler pro Seite darstellen wollen. Dann können wir bereits folgende Abfrage erstellen:
[PHP]$query = mysql_query("SELECT ID FROM `Spieler`");
$anzahl = mysql_num_rows($query); [/PHP]In dieser Abfrage laden wir erst mal die ID aller Spieler, die in der Datenbank vorhanden sind. Ich verwende hier keinen *, da ansonsten alle Werte von allen Spielern
in $query gespeichert werden würden, was in diesem Falle nur eine unnötige Last bringt. Über die Funktion mysql_num_rows können wir nun abfragen, wieviele Zeilen abgefragt wurden.
Nun haben wir die Anzahl aller Spieler, die in unserer Datenbank eingetragen sind.
Zunächst wollen wir die Seitenzahl berechnen:
[PHP]$seitenzahl = ceil($anzahl/10);[/PHP]
Mit der Funktion ceil können wir Dezimalzahlen aufrunden. Die 10 in dieser Rechnung entspricht dabei der Zahl an Spielern, die pro Seite angezeigt werden sollen.
Wenn eine Person mehr als 10 existiert, müssen wir diese ja dennoch auf einer zweiten Seite anzeigen. Daher sind wir dazu verpflichtet die Funktion ceil zu verwenden, anstatt floor (wie oft üblich bei Rechnungen).
Jetzt wo wir die Seitenzahl besitzen, sollten wir uns vielleicht erstmal überlegen, wie wir abfragen auf welcher Seite der Nutzer aktuell ist.
Die denkbar einfachste Methode wäre es, diese per GET abzufragen. Also erledigen wir dies gleich:
[PHP]$seite = 1;
if( isset( $_GET['seite'] ) ) $seite = $_GET['seite'];[/PHP]Ich weise der Variable $seite hier bereits einen Wert zu, bevor dieser der GET-Wert zugewiesen wird (falls einer existiert).
Der Grund dafür ist, dass wir uns generell auf der ersten Seite befinden, außer etwas anderes ist angegeben.
Nun sollten wir die Abfrage gestalten:
[PHP]$query = mysql_query("SELECT * FROM `Spieler` LIMIT ".($seite*10-10).",10");
while( $ergebnis = mysql_fetch_object( $query ) )
{
}[/PHP]Wir erstellen nun wieder eine generelle SELECT-Abfrage, diesmal jedoch mit *, da wir ja mehrere Felder auslesen wollen. Der LIMIT-Parameter gibt hierbei zuerst an, ab der wie vielten Zeile geladen werden soll,
wobei der Wert hinter dem Komma angibt, wie viele Zeilen überhaupt geladen werden sollen.
Wenn wir auf Seite 1 sind, so wird in der Rechnung dies gemacht: 1 * 10 - 10 (= 1). Auf Seite 2: 2 * 10 - 10 (= 10). Damit können wir also genau festlegen, von welchen Spielern die Daten geladen werden.
Die While-Schleife geht nun jedes Objekt des abgefragten Querys durch. Also wird sie für jeden geladenen Spieler neu aufgerufen. Paaren wir nun unsere vorigen Ergebnisse mit dieser Schleife,
so erhalten wir folgenden Code:
[PHP]
echo "<table><thead>\n<tr>\n<th>Spielername</th>\n<th>Spielzeit</th>\n<th>Punkte</th>\n<th>Adminlevel</th>\n</tr></thead>\n<tbody>";
while( $ergebnis = mysql_fetch_object( $query ) )
{
echo "<tr><td>".$ergebnis->Name."</td>\n<td>".$ergebnis->Spielzeit."</td>\n<td>".$ergebnis->Punkte."</td>\n<td>".$ergebnis->Admin."</td></tr>";
}
echo "</tbody>";[/PHP]
Was ich hier gemacht habe, sollte recht leicht verständlich sein: Ich habe die bereits erarbeitete Strukur für die Tabelle genommen, den Kopf bereits ausgegeben und für jeden Spieler eine eigene Reihe mit Inhalten aus der
MySQL-Abfrage erstellt.
Als nächstes möchten wir überprüfen, ob es mehrere Seiten gibt. Wenn ja, soll die Seitenwahl angezeigt werden.
Dies machen wir wie folgt:
[PHP]if($seitenzahl > 1)
{
echo '\n<tfoot><tr><td colspan="4"><ul>';
if($seite != 1) echo '\n<li><a href="UCP.php?seite='.($seite-1).'"><span>Zurück</span></a></li>';
for($i = 1; $i < $seitenzahl+1; $i++)
{
echo '\n<li><a href="UCP.php?seite='.$i.'""><span>'.$i.'</span></a></li>';
}
if($seite != $seitenzahl) echo '\n<li><a href="UCP.php?seite='.($seite+1).'"><span>Weiter</span></a></li>';
echo '\n</ul></tr></tfoot></table>';
}[/PHP]
Zuerst prüfen wir, wie bereits erwähnt, ob es mehr als eine Seite gibt. Wenn ja, wird erstmal der gleichbleibende Teil des Footers ausgegeben.
Danach wird überprüft, ob die Seite, auf der wir uns gerade befinden eine andere ist, als Seite 1. Wenn dem so ist, soll es einen Zurückbutton geben, der den GET-Wert seite so bearbeitet, dass wir eine Seite zurückkommen.
In einer Schleife (die bis zur Größe der Seitenzahl geht) erstellen wir nun für jede dieser Seiten einen eigenen Link, welcher uns auf die dementsprechende Seite bringt.
In einer letzten Abfrage wird nachgeschaut, ob die derzeit aufgerufene Seite gleich der letzten Seite ist. Wenn dem so ist, benötigen wir ja keinen Weiter-Button. Wohin wollen wir denn auch weiter?
Ansonsten wird der Weiter-Button angezeigt.
Zu guter letzt wird der Endteil der Tabelle erstellt, womit diese fertig ist.
$anzahl = mysql_num_rows($query);
$seitenzahl = ceil($anzahl/10);
$seite = 1;
if( isset( $_GET['seite'] ) ) $seite = $_GET['seite'];
$query = mysql_query("SELECT * FROM `Spieler` LIMIT ".($seite*10-10).",10");
{
echo "<tr><td>".$ergebnis->Name."</td>\n<td>".$ergebnis->Spielzeit."</td>\n<td>".$ergebnis->Punkte."</td>\n<td>".$ergebnis->Admin."</td></tr>";
}
echo "\n</tbody>";
{
echo '\n<tfoot><tr><td colspan="4"><ul>';
if($seite != 1) echo '\n<li><a href="UCP.php?seite='.($seite-1).'"><span>Zurück</span></a></li>';
for($i = 1; $i < $seitenzahl+1; $i++)
{
echo '\n<li><a href="UCP.php?seite='.$i.'""><span>'.$i.'</span></a></li>';
}
if($seite != $seitenzahl) echo '\n<li><a href="UCP.php?seite='.($seite+1).'"><span>Weiter</span></a></li>';
echo '\n</ul></tr></tfoot></table>';
}[/PHP]
Ich hoffe ihr konntet mit dem Tutorial etwas anfangen und es war verständlich genug erklärt.
Bei Fragen, könnt ihr diese gerne Stellen.
Als Tipp noch: Die Seite TableStyler.com bietet schöne und viele Möglichkeiten zum Gestalten von eigenen Tabellen. Dies macht nicht viel Arbeit und ist im Endeffekt nur C&P (und sieht dennoch professionell aus).
Jegliches (konstruktive) Feedback ist erwünscht.
Mit freundlichen Grüßen
Padarom