[PHP] Spielerlisten erstellen

  • 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.


    Gesamter Code
    [PHP]$query = mysql_query("SELECT ID FROM `Spieler`");
    $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");

    Gesamter Code
    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>";

    Gesamter Code
    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 "\n</tbody>";

    Gesamter Code
    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]

    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

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

    4 Mal editiert, zuletzt von Padarom ()

  • @Greekz: Das ist eigentlich eher Geschmacksache.
    Ich glaube nicht, dass viele Nutzer darauf wert legen, ob der Quellcode lesbar ist.
    Für den Coder ist er das - Und das sollte theoretisch reichen.


    Aber mit wenigen Änderungen lässt sich das auch umgehen. Werde ich gleich einbauen, danke für die Anmerkung.

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

  • Danke für das ganze Feedback - Dafür mache ich Tutorials :)

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

  • Danke, ist behoben :)

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

  • So zu meiner Bewertung:


    Idee. 5/10, da nichts besonderes
    Umsetzung: 8/10, da ein eigenes Design von dir schöner wäre, das mit den Seiten finde ich aber super. (Kleiner Vorschlag: versuche doch mal die Seitenaktualisierung mit hilfe von AJAX oder jQuery)
    Coding-Stil bzw. Art: 0/10, du hälst dich an keine Normen. In naher Zukunft bringe ich ein Tutorial raus wie man korrekt Programmiert. Mit diesem Programmierstil würde dich keine größere Firma annehmen


    Bedanke dich bitte, wenn du den Beitrag als hilfreich empfandest!



  • Mir geht es um den Grundaufbau, nicht um Codeoptimierung oder sonstiges. Abgesehen davon mache ich eine Ausbildung zum Elektroniker, mit Programmieren hab ich da also nicht viel zu tun- zumindest keine Webprogrammierung. Dennoch kann ich dies wohl als Tutorial veröffentlichen. Deine Bewertung kommt mir eher rüber, als würde sie ein veröffentlichtes Script bewerten, kein Tutorial.
    Mit AJAX kenne ich mich aus, jedoch empfinde ich es als Recht sinnlos für ein solches Tutorial, da es eben um den Grundaufbau geht. Und eine mit AJAX aktualisierte Spielerliste ist zwar schön, jedoch recht unnötig.
    Bitte zeige mir aber wie ich mich verbessern kann, wenn ich mich an keine Norm halte.

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

  • So zu meiner Bewertung:


    Idee. 5/10, da nichts besonderes
    Umsetzung: 8/10, da ein eigenes Design von dir schöner wäre, das mit den Seiten finde ich aber super. (Kleiner Vorschlag: versuche doch mal die Seitenaktualisierung mit hilfe von AJAX oder jQuery)
    Coding-Stil bzw. Art: 0/10, du hälst dich an keine Normen. In naher Zukunft bringe ich ein Tutorial raus wie man korrekt Programmiert. Mit diesem Programmierstil würde dich keine größere Firma annehmen

    Ist ja jetzt gut mit deinem Angeben von deinem tutorial....
    Sei mal lieber überhaupt froh, dass es solche Leute gibt, die hier
    anderen etwas beizubringen versuchen.


    An sich das tutorial ganz gut :) 8/10.

  • Wieso zieht er meine Tabelle unter den Footer?



    <div class="datagrid">
    <table>
    <thead><tr><th>Beschreibung</th><th>Information</tr></thead>
    <tbody><tr class="alt"><td>Server IP</td><td>folgt</td></tr>
    </tbody>
    <thead><tr><th>Team Posten</th><th>Name</tr></thead>
    <tbody><tr class="alt"><td>Scripter</td><td>Mystogan</td></tr>
    <tr><td>Admin</td><td>Wird gesucht</td></tr>
    <tr class="alt"><td>Supporter</td><td>Wird gesucht</td></tr>
    </tbody>
    </table></div>

    </div>
    <div class="datagrid">
    <?php
    require_once('global.php');
    $query = mysql_query("SELECT id FROM `users`");
    $anzahl = mysql_num_rows($query);
    $seitenzahl = ceil($anzahl/10);
    $seite = 1;
    if( isset( $_GET['seite'] ) ) $seite = $_GET['seite'];
    $query = mysql_query("SELECT * FROM `users` LIMIT ".($seite*10-10).",10");


    echo "<table><thead>\n<tr>\n<th>Spielername</th>\n<th>Level</th>\n<tbody>";


    while( $ergebnis = mysql_fetch_object( $query ) )
    {
    echo "<tr><td>".$ergebnis->username."</td>\n<td>".$ergebnis->level."</td>\n</tr>";
    }
    echo "\n</tbody>";


    if($seitenzahl > 1)
    {
    echo '\n<tfoot><tr><td colspan="4"><ul>';
    if($seite != 1) echo '\n<li><a href="ServerInfo.php?seite='.($seite-1).'"><span>Zurück</span></a></li>';
    for($i = 1; $i < $seitenzahl+1; $i++)
    {
    echo '\n<li><a href="ServerInfo.php?seite='.$i.'""><span>'.$i.'</span></a></li>';
    }
    if($seite != $seitenzahl) echo '\n<li><a href="ServerInfo.php?seite='.($seite+1).'"><span>Weiter</span></a></li>';
    echo '\n</ul></tr></tfoot></table>';
    }
    ?>
    </div>
    <br>
    </div>
    </div>
    <div id="footer-push"></div>
    </div>
    <div align=center><p class="copy">&copy; <a href="javascript:alert('Mystogan\nTeam Red\nChocoTemplates\nFlitzer48')">Copyright 2013</a></p></div></body>
    </html>

  • Wenn ich das richtig sehe hast du thead nicht geschlossen


    Nee liegt nicht daran :()



    //Habs geschafft i-wie hahah wie genau.. weiß ich zwar nicht aber es geht jetzt ^^
    Aber die Tabelle nimmt nicht das Design an wieso..?


    <div class="datagrid">
    <?php
    require_once('global.php');
    $query = mysql_query("SELECT id FROM `users`");
    $anzahl = mysql_num_rows($query);
    $seitenzahl = ceil($anzahl/10);
    $seite = 1;
    if( isset( $_GET['seite'] ) ) $seite = $_GET['seite'];
    $query = mysql_query("SELECT * FROM `users` LIMIT ".($seite*10-10).",10");


    echo "<table><thead><tr><th>Spielername</th><th>Level</th></tr></thead>";


    while( $ergebnis = mysql_fetch_object( $query ) )
    {
    echo "<tbody><tr><td>".$ergebnis->username."</td><td>".$ergebnis->level."</td></tr>";
    }
    echo "</tbody>";


    if($seitenzahl > 1)
    {
    echo '<tfoot><tr><td colspan="4"><ul>';
    if($seite != 1) echo '<li><a href="ServerInfo.php?seite='.($seite-1).'"><span>Zurück</span></a></li>';
    for($i = 1; $i < $seitenzahl+1; $i++)
    {
    echo '<li><a href="ServerInfo.php?seite='.$i.'""><span>'.$i.'</span></a></li>';
    }
    if($seite != $seitenzahl) echo '<li><a href="ServerInfo.php?seite='.($seite+1).'"><span>Weiter</span></a></li>';
    echo '</ul></tr></tfoot></table>';
    }
    ?>
    </div>


    3 Mal editiert, zuletzt von Mystogan ()

  • Jetzt noch bei table die Klasse tablesorter hinzufügen sowie eine belibige ID und diese dann mit einer Sortierung versehen z.B.:

    Code
    <table id="Sortieren" class="tablesorter">


    Code
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script><script type="text/javascript" src="http://tablesorter.com/__jquery.tablesorter.min.js"></script><script type="text/javascript">$(document).ready(function() {$("#Sortieren").tablesorter();});</script>


    Und dann ist es perfekt!


    Advertising has us chasing cars and clothes, working jobs we hate so we can buy shit we don’t need.
    – Tyler Durden


    Sobald Werbung im Spiel ist, bist du, die Nutzerin, der Nutzer, das Produkt.