quakenet:#php Tutorial

Author: Progman, zuletzt bearbeitet von progman @ 2003/05/23 14:25:57

Bitte beachten Sie, dass die Tutorialkapitel zusammenhängen. Wenn sie direkt auf ein Kapitel verlinkt wurden müssen Sie gegebenenfalls die vorherigen Kapitel auch lesen. Achten Sie beim lesen darauf, dass Sie kein Kapitel überspringen.

Eigenes Clanwarscript

  1. Aufbau des Clanwarscripts
  2. Verwaltung der Ligen
  3. Spielebearbeitung
  4. Mapbearbeitung
  5. Clanwarverwaltung
  6. Clanwarscript
  7. Fazit

1. Aufbau des Clanwarscripts

Nun schreiben wir unser Clanwarscript. Dieses Script ist etwas größer als die anderen Scripte, die wir geschrieben haben. Denn zu einem Clanwarscript gehören eine Menge von Tabellen. Einmal brauchen wir eine Tabelle, wo wir den Clanwar speichern. Diese Tabelle sieht wie folgt aus.

clanwar(ID,Datum,Gegner,GegnerUrl,Spiel,Liga,LigapunkteWir,LigapunkteSie)
        

Nun erstellen wir eine Tabelle mit all den Ligen, in der der Clan spielt.

clanwar_liga(ID,Name,Url)
        

Die ID speichert man dann in der Spalte Liga der Tabelle clanwar. In einer weiteren Tabelle speichern wir die Spielename, die der Clan spielt.

clanwar_spiel(ID,Name,Url,SeitennameBlau,SeitennameRot)
        

In den Spalten SeitennameBlau und SeitennameRot speichern wir dann z.B. für Counter-Strike die Bezeichnungen Counter-Terrorist und Terrorist. Für UT-CTF speichern wir da Blau und Rot. In der Spalte Farbe gibt man dann die Farbe an, in der dann in der Clanwarübersicht dieser Seitenname erscheinen soll. Üblicherweise ist dass dann Rot oder Blau.

Zu einem Spiel gehören auch Maps. Diese werden auch in eine extra Tabelle gespeichert.

clawar_map(ID,Spiel_ID,Name,Bild)
        

In Bild steht dann der Pfad zum Bild der Map. Die Bilder liegen später im Pfad /images/maps/, bezogen auf das HTML-Root Verzeichnis, nicht das Root-Verzeichnis des Servers. Nun erstellen wir eine Tabelle, die angibt, welche Map mit wievielen Punkten gespielt wurde. Dies ist die Verbindungstabelle zu clanwar_map und clanwar.

clanwar_runden(Clanwar_ID,Map_ID,PunkteWir,PunkteGegner,SeiteWir,SeiteGegner)
        

Es ist garnicht mal so einfach, sich ein Tabellenlayout zu überlegen. Ich hab jetzt immer Counter-Strike im Hinterkopf, doch es gibt ja auch andere Online-Spiele. Dort werden dann die Clanwars anders ausgetragen, z.B. wird nur einmal eine Map gespielt. Deswegen Stukturieren wir die letzte Tabelle etwas um.

clanwar_runden(ID,Clanwar_ID,Map_ID)
clanwar_runden_seiten(RundenID,PunkteWir,PunkteGegner,SeiteWir)
        

In der Spalte SeiteWir speichern wir dann die Seite, die der eigene Clan dort gespielt hat. Im Formular steht dann ein richtiger Name, intern hingegen wird die SeitenID gespeichert.

Dies sind eine Menge Tabellen. Hier die komplette Liste von allen Tabellen.

clanwar(ID,Datum,Gegner,GegnerUrl,Spiel,Liga,LigapunkteWir,LigapunkteSie)
clanwar_liga(ID,Name,Url)
clanwar_spiel(ID,Name,Url,Seite1,Seite2,Farbe1,Farbe2)
clanwar_map(ID,Spiel_ID,Name,Bild)
clanwar_runden(ID,Clanwar_ID,Map_ID)
clanwar_runden_seiten(RundenID,PunkteWir,PunkteGegner,SeiteWir)
        

Wie man sieht ist ein Clanwarcript etwas komplizierter als die Scripte, die wir früher immer geschrieben haben. Und dieses Clanwarscript ist auch noch nicht komplett. Denn ein Warcraft3-Clanwar können wir da nicht so einfach speichern, weil es da keine 'Seiten' im Sinne von CT und T gibt. Aber das hier soll erstmal reichen.

2. Verwaltung der Ligen

Die Verwaltung der Liga ist am einfachsten. Eine Liga ist in diesem Script unabhängig vom Spiel. Wir können in den Tabellen nicht speichern, zu welchem Spiel welche Liga gehört. Dies lassen wir auch erstmal so.

Nachdem wir diverse Arrays erweitert haben und wir das Admin-Hauptmenu bearbeitet haben (Aufruf über &site=liga) können wir uns an das Script setzen, welches die Ligen verwaltet. Erstmal schreiben wir wieder das Grundgerüst.

<?php
    $rights
= getRights();
    if(!
in_array("Liga", $rights))
    {
        
no_rights();
    }
    else
    {
        switch(@
$_GET['action'])
        {
            case
'add':
                break;
            case
'edit':
                break;
            case
'del':
                break;
            default:
                echo(
"<p>\n");
                echo(
"    Bitte benutzen sie nur einen Link aus dem Adminmenu.\n");
                echo(
"</p>\n");
                break;
        }
    }
    
back2admin();
?>

Zuerst setzen wir uns an den Scriptteil zum hinzufügen einer Liga. Die HTML-Formulare geben wir mit unseren HTML-Klassen aus.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/liga-add-v1.php

Ach, wie schön kein echo und keine escaperei. Das Formular wurde nun erstellt und ausgegeben. Nun brauchen wir eine If-Abfrage, die auf den Submit-Button reagiert und entsprechend die neue Liga hinzufügt.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/liga-add-v2.php

Das Löschen einer Liga kann problematisch werden. Denn wir speichern in der Tabelle clanwar die ID der Liga, in der dieser Clanwar gespielt wurde. Wenn wir nun eine Liga aus der Datenbank löschen, kann es sein, dass dann 'Tote links' mit den IDs in der Datenbank entstehenen. Wir müssen eigentlich zuerst prüfen, ob wir auch die gewählte Liga löschen dürfen. Den Code dazu spare ich mir jetzt. Der Admin weiß schon was er da tut.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/liga-del-v1.php

Das Script zum bearbeiten gliedert sich in 3 Teilprogrammen.

  1. Ein Teil zum anzeigen des Formulars, wo der Benutzer die Liga auswählen kann, die er bearbeiten möchte.

  2. Ein Teil, wo der Benutzer die Ligadaten bearbeiten kann.

  3. Ein Teil, der dann die Ligadaten in der Datenbank bearbeitet.

Wir benutzen hier eine if-elseif-else Struktur. Ein switch-case ist aber auch möglich, aber ich benutze nicht so gerne die Fehlerunterdrückung mit @ (Wenn ich auf $_POST['submit'] reagiere, kann dieser Wert nicht gesetzt sein).

Script liegt im Scriptarchiv: /tutorial/login-clanwar/liga-edit-v1.php

Nun ist das Script für die Ligaverwaltung fertig.

3. Spielebearbeitung

Wir nehmen wieder unser Grundgerüst mit der switch-Abfrage.

<?php
    $rights
= getRights();
    if(!
in_array("Spiel", $rights))
    {
        
no_rights();
    }
    else
    {
        switch(@
$_GET['action'])
        {
            case
'add':
                break;
            case
'edit':
                break;
            case
'del':
                break;
            default:
                echo(
"<p>\n");
                echo(
"    Bitte benutzen sie nur einen Link aus dem Adminmenu.\n");
                echo(
"</p>\n");
                break;
        }
    }
    
back2admin();
?>

Nun kommt das Teilscript zum hinzufügen eines neuen Spiels.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/spiel-add-v1.php

Das Array $farben speichern wir global in unsere Datei variables.php. Auf dieses Array greifen wir noch später drauf zu (beim bearbeiten).

Das Löschen eines Spiels ist wieder ganz einfach. Als Benutzer muss man hier aber wieder auf 'Tote Links' achten.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/spiel-del-v1.php

Auf den Scriptteil um ein Spiel zu bearbeiten habe ich mal wieder gar kein Bock. Bevor ich aber zig Feedbackmails "Hey, wo ist das Script zum Bearbeiten eines Spiels" erhalte, weil ihr ja alle nicht selber denken könnt ..., schreibe ich doch dieses Script.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/spiel-edit-v1.php

Nun können die Spiele, genauso wie die Ligen, unabhängig bearbeitet werden. Die Farbe brauchen wir später in der Übersicht.

4. Mapbearbeitung

Da dieses Script auch Mapbilder zeigen soll brauchen wir ein Script um Bilder hochzuladen. Das Bild wird dann in ein Verzeichnis wie images/maps/ gespeichert. Versucht nicht die Bilder mit FTP hoch- bzw. runterzuladen. Es kann dann sein, dass sich dann die UserID der Bilder ändern und das PHP-Script die Bilder nicht mehr löschen kann. Es kann auch Probleme mit dem sogenannten CHMOD geben, dass PHP deswegen die Bilder nicht bearbeiten kann. Aus diesen Grund will ich auch Dateibearbeitung im Tutorial nicht drannehmen.

Hier ist wieder das Grundgerüst, dass wir schon oft gesehen haben.

<?php
    $rights
= getRights();
    if(!
in_array("Map", $rights))
    {
        
no_rights();
    }
    else
    {
        switch(@
$_GET['action'])
        {
            case
'add':
                break;
            case
'edit':
                break;
            case
'del':
                break;
            default:
                echo(
"<p>\n");
                echo(
"    Bitte benutzen sie nur einen Link aus dem Adminmenu.\n");
                echo(
"</p>\n");
                break;
        }
    }
    
back2admin();
?>

Das Script zum hinzufügen ist wieder nur eine einfache If-Abfrage. Innerhalb der If-Abfrage kann es aber kompliziert werden.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/map-add-v1.php

Nun kommt der Scriptteil um das Bild hinzuzufügen.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/map-add-v2.php

Um eine Map zu löschen brauchen wir nur ein billigen Programmteil.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/map-del-v1.php

Im If-Teil wird dann die Map gelöscht.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/map-del-v2.php

Das Script zum Bearbeiten ist mal wieder etwas größer. Wir müssen hier zwei getrennte Formulare schreiben. In einem Formular ändern wir die Mapdaten. In einem anderen Formular können wir ein neues Bild hochladen.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/map-edit-v1.php

Nun werden die 2 Formular ausgegeben, nachdem die Map ausgewählt wurde.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/map-edit-v2.php

Und nun die beiden Teilscripte.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/map-edit-v3.php

Nun kann der Benutzer neue Maps hinzufügen, Maps bearbeiten oder diese auch wieder löschen.

5. Clanwarverwaltung

Nun, nachdem wir Ligen und Maps hinzufügen können, können wir unser Clanwarscript schreiben. Dies wird um einiges Komplizierter. Denn der Benutzer muss einmal die Liga auswählen und für jede Runde die Punkte eintragen, abgesehen von den Gegnerdaten und ggf. auch noch den Ligapunkten. Das wird beim bearbeiten eines Clanwars sehr spaßig.

Nun erstellen wir erstmal das Grundgerüst, erreichbar mit &site=clanwar.

<?php
    $rights
= getRights();
    if(!
in_array("Clanwar", $rights))
    {
        
no_rights();
    }
    else
    {
        switch(@
$_GET['action'])
        {
            case
'add':
                break;
            case
'edit':
                break;
            case
'del':
                break;
            default:
                
$error = new HTML('p');
                
$error->addInhalt('Bitte benutzen sie nur einen Link '.
                                  
'aus dem Adminmenu.');
                
$error->ausgeben();
                break;
        }
    }
    
back2admin();
?>

Für den add-Teil reicht diesmal nicht eine einfache if-else Abfrage. Wir müssen den Benutzer durch verschiedene Formulare leiten. Ich benutzt hier eine switch-case Anweisung, mit einen Trick, keine Fehlerunterdrückung zu benutzen, denn die mag ich nicht so gerne sondern und ssehe es als schlechtes programmieren an.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/clanwar-add-v1.php

Wir überprüfen den Parameter und speichern ihn dann in die Session. Danach zeigen wir das zweite Formular.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/clanwar-add-v2.php

Nun speichern wir die Liga-ID in der Session und geben ein neues Formular aus.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/clanwar-add-v3.php

Nun erstellen wir so ne art Übersicht. In der kann man dann die Maps hinzufügen, die gespielt wurden.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/clanwar-add-v4.php

Der Programmteil um die Maps anzuzeigen, die in der Session sind, habe ich noch nicht geschrieben. Ich weiß noch nicht, wie ich die Daten in der Session speichere. Den Programmteil schreiben wir später.

Nun schreiben wir das Formular, wenn man auf Neue Maps hinzufügen klickt.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/clanwar-add-v5.php

Nun speichern wie die Map in die Session. Da die Übersicht angezeigt werden soll, müssen wir die case-Abfrage vor der anderen case-Abfrage schreiben. Mit diversen If-Abfragen stellen wir sicher, dass nur bei diesem Formular eine neue Map hinzugefügt wird.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/clanwar-add-v6.php

Und nun das Script um angewählte Maps zu löschen. Da nach dem löschen auch wieder das Formular gezeigt werden soll, schreiben wir die neue case-Abfrage zu den anderen case-Abfragen und fügen ein paar If-Abfragen hinzu.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/clanwar-add-v7.php

Als nächstes kommt das Formular, um ggf. vorhandene Ligapunkte einzugeben.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/clanwar-add-v8.php

Jetzt kommt er spannende Teil. Wir müssen nun alle Daten aus der Session in die Datenbank speichern. Vorher müssen wir aber das Datum prüfen.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/clanwar-add-v9.php

Das Script zum Löschen eines Clanwars ist mal wieder sehr einfach.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/clanwar-del-v1.php

Beim Löschen müssen wie auf die Reihenfolge achten. Zuerst löschen wir die Runden, dann die Maps und dann den Clanwar selber. Damit stellen wir sicher, dass bei einem Serverabsturz mitten im Script keine 'Toten Links' entstehen.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/clanwar-del-v2.php

Nun kann der Benutzer einen neuen Clanwar hinzufügen und einen Clanwar löschen. Auf das Script zum Bearbeiten eines Clanwars habe ich jetzt erstmal kein bock.

6. Clanwarscript

Jetzt setzen wir uns an das eigentliche Clanwarscript. Dies ist relativ einfach. Einmal brauchen wir einen Teil, der uns eine Übersicht anzeigt. Ein anderer Teil gibt genauere Informationen über einen Clanwar aus. Wir benutzen dafür einen GET-Parameter ClanwarID.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/clanwar-v1.php

Zuerst schreiben wir die Übersicht.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/clanwar-v2.php

In der While-Schleife, geben wir dann die Clanwars von den Spielen in Form von Tabellen aus.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/clanwar-v3.php

Nun schreiben wir den Programmcode für die Details eines Clanwars.

Script liegt im Scriptarchiv: /tutorial/login-clanwar/clanwar-v4.php

Somit sind wir mit dem Clanwar-Script, abgesehen von Bearbeiten eines Clanwars, fertig. Damit es angezeigt werden kann muss entsprechend das Array $dateien erweitert werden.

7. Fazit

Clanwar-Scripte gibt es wie Sand am Meer. Dementsprechent sind diese Scripte unterschiedlich aufgebaut. Und nun gibt es ein weiteres Script. Dieses Script, was wir gerade geschrieben haben, hat natürlich Nachteile. Man kan z.B. kein Warcraft3 CW speichern. Desweiteren kann man Liga-Einstellungen wie "Attacker Only" für Counter-Strike auch nicht speichern. Man kann Clanwarscripte bis ins unendliche optimieren, damit auch ja jeder Clanwar gespeichert werden kann. Dies ist aber entsprechend schwerer zu programieren, als ein Clanwarscript welches auf Counter-Strike optimiert ist. Aber dieses Kapitel soll auch zeigen, wie man Daten richtig und optimiert in der Datenbank speichert. Die Tabellen erfüllen, so weit wie möglich, die ersten drei Normalformen. Durch das Speichern in mehrere Tabellen können wir Ausdrücke wie SUM(PunkteWir), statt PunkteWirRunde1 + PunkteWirRunde2 oder so, verwenden.

Fragen zum aktuellen Thema

  1. Was macht die MySQL-Funktion SUM() und die PHP-Funktion array_sum()
Was macht die MySQL-Funktion SUM() und die PHP-Funktion array_sum()

Was fragt ihr mich? Guckt doch einfach in den entsprechenden Dokumentationen nach. Dafür sind die doch da.

Nach oben