quakenet:#php Tutorial

Author: Progman, zuletzt bearbeitet von progman @ 2003-12-20 19:15:48

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 Member-Script

  1. Die Member eines Clans anzeigen
  2. Adminbereich einstellen
  3. Member hinzufügen
  4. Member löschen
  5. Member bearbeiten
  6. Memberscript

1. Die Member eines Clans anzeigen

Die ganzen Scripte sind sehr ähnlich zueinander, z.B. was die Administrations betrifft. Ich schreibe nun das Member-Script weil das Clanwar-Script auf die Clanmember zugreift. Aber natürlich möchte man zeigen, welche Member im Clan sind.

Nun müssen wir uns überlegen, was wir alles von einem Member speichern möchten. Natürlich wollen wir Name und Email speichern. Dann noch die ICQ Nummer, sein Geburtsdatum, seit wann er im Clan ist und seine Rechnerdaten. Von denen speichere ich nur Prozessor und Grafikkarte. Und als letzes speichern wir die bisherige Laufbahn des Members. Es kann ja sein, das er schonmal in einem anderen Clan mitgespielt hat. Dies sollte man ja vielleicht auch mit festhalten. Die Tabellenstruktur sieht dann so aus.

member(ID,Name,Email,Geburtstag,ICQ,Joined,Prozessor,Grafikkarte)
member_laufbahn(ID,MemberID,Von,Bis,Clan,Clanurl)
        

Die Spalten Geburtstag, Joined, Von und Bis sollten nur vom Typ DATE sein. Wir müssen nicht auf die Sekunde genau speichern, wann er jetzt z.B. den Clan beigetreten ist.

2. Adminbereich einstellen

Nachdem wir das Array $admin_site erweitert und die Datei admin_menu.php bearbeitet haben, setzen wir uns an die admin_member.php. Dort fügen wir wieder unser Grundgerüst ein.

<?php
    $rights 
getRights();
    if(!
in_array("Member"$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");
                
back2admin();
                break;
        }
    }
?>

3. Member hinzufügen

Das Script zum hinzufügen eines Members wird in mehrere Schritte aufgegliedert. Zuerst gibt man im ersten Formular die Daten wie Name und Email an. Im nächsten Formular gibt man dann die bisherige Laufbahn des Members an, falls vorhanden. Nach dem Absenden dieses Formulares wird dann der Member in die Datenbank geschrieben. Insgesammt sind das dann 4 Bereiche. 2 Formulare, eine Übersicht und ein Programmteil um den Member hinzuzufügen.

<?php
    
case 'add':
        if(isset(
$_POST['submit']) AND "Weitere Memberdaten hinzufügen" == $_POST['submit'])
        {
        }
        else
        {
            echo(
"<form action=\"index.php?section=admin&amp;site=member&amp;action=add\" ");
            echo(
"      method=\"post\"");
            echo(
"      class=\"formular\">\n");
            echo(
"    <p>\n");
            echo(
"        Neuen Member hinzufügen\n");
            echo(
"    </p>\n");
            echo(
"    <ol>\n");
            echo(
"        <li>\n");
            echo(
"           <label for=\"name\">Name</label>\n");
            echo(
"           <input type=\"text\" name=\"name\" id=\"name\"/>\n");
            echo(
"        </li>\n");
            echo(
"        <li>\n");
            echo(
"           <label for=\"email\">Email</label>\n");
            echo(
"           <input type=\"text\" name=\"email\" id=\"email\"/>\n");
            echo(
"        </li>\n");
            echo(
"        <li>\n");
            echo(
"               <label for=\"ICQ\">ICQ</label>\n");
            echo(
"               <input type=\"text\" name=\"ICQ\" id=\"ICQ\"/>\n");
            echo(
"        </li>\n");
            echo(
"        <li>\n");
            echo(
"               Geburtstag\n");
            echo(
"               ...\n"); // Spezielles Formular kommt noch
            
echo("        </li>\n");
            echo(
"        <li>\n");
            echo(
"               Clan beigetreten\n");
            echo(
"               ...\n"); // s.o.
            
echo("        </li>\n");
            echo(
"        <li>\n");
            echo(
"               <label for=\"prozessor\">Prozessor</label>\n");
            echo(
"               <input type=\"text\" name=\"prozessor\" id=\"prozessor\"/>\n");
            echo(
"        </li>\n");
            echo(
"        <li>\n");
            echo(
"               <label for=\"grafikkarte\">Grafikkarte</label>\n");
            echo(
"               <input type=\"text\" name=\"grafikkarte\" id=\"grafikkarte\"/>\n");
            echo(
"        </li>\n");
            echo(
"        <li>\n");
            echo(
"<input type=\"submit\" name=\"submit\" value=\"Weitere Memberdaten hinzufügen\" />\n");
            echo(
"<input type=\"reset\" name=\"submit\" value=\"Zurücksetzen\" />\n");
            echo(
"<input type=\"hidden\" name=\"".session_name()."\"");
            echo(
"                          value=\"".session_id()."\" />");
            echo(
"        </li>\n");
            echo(
"    </ol>\n");
            echo(
"</form>\n");

        }
        break;
?>

Die Formulare für die Zeitangaben habe ich erstmal weggelassen. Wir müssen ja das Datum in der Form YYYY-MM-DD speichern. Doch das können wir dem Benutzer nicht abverlangen, dass er die Daten genauso angibt. Er möchte lieber die Daten im "Klicki-Bunti"-Style angeben, mit vordefinierten Formulare wo man Tag, Monat und Jahr angibt. Die Formularelemente Jahr und Tag sind kein Problem. Doch bei dem Monat sollten dort Monatsnamen und keine Zahlen stehen. Es gibt nun verschiedene Möglichkeiten, wie man diese Monatsnamen ausgibt.

  1. Mit der Funktion date können wir uns einen String zurückliefern, der z.B. den Monatsnamen enthält. Probleme gibt es da mit der Timestamp angabe. Dieses Timestamp müssen wir 12 mal mit mktime erstellen lassen.

  2. Die Funktion strftime funktioniert so wie die Funktion date. Doch in Verbindung mit setlocale können wir uns da den deutschen Monatsnamen ausgeben lassen. Die Funktion date hingegen liefert immer die englischen Monatsnamen zurück.

  3. Da wir mit Sicherheit die Monatsnamen öfters brauchen, wir aber nicht immer das Timestamp errechnen wollen und die Monatsnamen mit date holen wollen, sollten wir die Monatsnamen in einem Array schreiben. Die Schlüssel der Arrayelemente sind dann die Monatszahlen, die Werte der Arrayelemente die Monatsnamen. Dies könnte dann z.B. so aussehen.

    <?php
        $monate 
    = array();
        
    $monate[1] = "Januar";
        
    $monate[2] = "Februar";
        
    // ...
    ?>

Wir entscheiden uns nicht für einen Punkt, sondern für alle. Wir speichern die Monatsnamen global in einem Array ab, aber die Monatsnamen selber lassen wir mit den Funktionen strftime und setlocale erstellen. Das Timestamp für die Funktion erstellen wir mit der Funktion mktime. Das Array definieren wir, wie üblich, in der variablen.php.

<?php
    $monate 
= array();
    for(
$i=1$i<=12$i++)
    {
        
$monate[$i] = strftime("%B"mktime(000$i02000));
    }
?>

Damit er auch die deutschen Monatsnamen ins Array speichert, müssen wir auch noch die Funktion setlocale aufrufen. Dies machen wir direkt in der config.php

<?php
    
// config.php

    
setlocale(LC_TIME'de_DE');
    
// LC_* sind spezielle Konstanten für setlocale,
    // bei 'LC_TIME' würde PHP meckern

    
include("inc/constant.php");
    include(
"inc/functions.php");
    include(
"inc/variablen.php");
?>

Nun können wir unsere Formularelemente für die Datumseingabe schreiben.

<?php
    
// ...

    
echo("        <li>\n");
    echo(
"            Geburtstag\n");
    
// Formularfeld für den Tag
    
echo("                <select name=\"geb[tag]\">\n");
    for(
$i=1$i<=31$i++)
    {
        echo(
"<option value=\"".$i."\">\n");
        echo(
$i.".\n");
        echo(
"</option>\n");
    }
    echo(
"                </select>\n");

    
// Formularfeld für den Monat
    
echo("                <select name=\"geb[monat]\">\n");
    for(
$i=1$i<=12$i++)
    {
        echo(
"<option value=\"".$i."\">\n");
        echo(
$monate[$i].".\n");
        echo(
"</option>\n");
    }
    echo(
"                </select>\n");

    
// Formularfeld für das Jahr
    
echo("                <input type=\"text\" name=\"geb[jahr]\" />\n");

    echo(
"        </li>\n");
    echo(
"        <li>\n");
    echo(
"            Clan beigetreten\n");

    
$now getdate();
    
// Formularfeld für den Tag
    
echo("                <select name=\"join[tag]\">\n");
    for(
$i=1$i<=31$i++)
    {
        echo(
"<option value=\"".$i."\"");
        if(
$i == $now['mday'])
            echo(
" selected=\"selected\"");
        echo(
">\n");
        echo(
$i.".\n");
        echo(
"</option>\n");
    }
    echo(
"                </select>\n");

    
// Formularfeld für den Monat
    
echo("                <select name=\"join[monat]\">\n");
    for(
$i=1$i<=12$i++)
    {
        echo(
"<option value=\"".$i."\"");
        if(
$i == $now['mon'])
            echo(
" selected=\"selected\"");
        echo(
">\n");
        echo(
$monate[$i].".\n");
        echo(
"</option>\n");
    }
    echo(
"                </select>\n");

    
// Formularfeld für das Jahr
    
echo("                <input type=\"text\" name=\"join[jahr]\" value=\"".$now['year']."\"/>\n");

    echo(
"        </li>\n");
    
// ...
?>

Die Überprüfung, ob er jetzt ein richtiges Datum und nicht 31. Februar eingegeben hat, wird später noch gemacht. Nun kommt der Programmteil, mit dem wir die Eingaben prüfen und eine Übersicht anzeigen. Die Daten speichern wir dazu noch in die Session.

<?php
    
// ...
    
if(isset($_POST['submit']) AND "Weitere Memberdaten hinzufügen" == $_POST['submit'])
    {
        
$error 0// Wächterstruktur
        
if(isset($_POST['geb']['jahr'],
                 
$_POST['join']['jahr']))
        {
            
// wenn die Daten von dem Formular kommen, prüfen
            
if(!checkdate($_POST['geb']['monat'],
                          
$_POST['geb']['tag'],
                          
$_POST['geb']['jahr']))
            {
                echo(
"<p>\n");
                echo(
"    Bitte geben sie ein gültiges Geburtsdatum an.\n");
                echo(
"</p>\n");
                
$error++;
            }
            if(!
checkdate($_POST['join']['monat'],
                          
$_POST['join']['tag'],
                          
$_POST['join']['jahr']))
            {
                echo(
"<p>\n");
                echo(
"    Bitte geben sie ein gültiges Beitrittsdatum an.\n");
                echo(
"</p/gt;\n");
                
$error++;
            }
        }
        if(!
$error)
        {
            
// Session Variablen checken und initialisieren
            
if(!isset($_SESSION['Name']))
                
$_SESSION['Name'] = trim($_POST['name']);
            if(!isset(
$_SESSION['Email']))
                
$_SESSION['Email'] = trim($_POST['Email']);
            if(!isset(
$_SESSION['ICQ']))
                
$_SESSION['ICQ'] = trim($_POST['ICQ']);
            if(!isset(
$_SESSION['GrafikKkarte']))
                
$_SESSION['Grafikkarte'] = trim($_POST['grafikkarte']);
            if(!isset(
$_SESSION['Prozessor']))
                
$_SESSION['Prozessor'] = trim($_POST['prozessor']);
            if(!isset(
$_SESSION['geb']))
                
$_SESSION['geb'] = sprintf('%04d-%02d-%02d',
                                           
$_POST['geb']['jahr'],
                                           
$_POST['geb']['monat'],
                                           
$_POST['geb']['tag']);
            if(!isset(
$_SESSION['join']))
                
$_SESSION['join'] = sprintf('%04d-%02d-%02d',
                                           
$_POST['join']['jahr'],
                                           
$_POST['join']['monat'],
                                           
$_POST['join']['tag']);
            if(!isset(
$_SESSION['history']))
                
$_SESSION['history'] = array();

            
// Übersicht anzeigen
            
echo("<form action=\"index.php?section=admin&amp;site=admit&amp;action=add\"");
            echo(
"    method=\"post\"");
            echo(
"    class=\"formular\">\n");
            echo(
"    <p>\n");
            echo(
"        Neuen Member hinzufügen\n");
            echo(
"    </p>\n");
            echo(
"    <ol>\n");
            echo(
"        <li>\n");
            echo(
"            Name:\n");
            echo(
htmlspecialchars($_SESSION['Name']));
            echo(
"        </li>\n");
            echo(
"        <li>\n");
            echo(
"            Email:\n");
            echo(
htmlspecialchars($_SESSION['Email']));
            echo(
"        </li>\n");
            echo(
"        <li>\n");
            echo(
"                Geburtstag:\n");
            echo(
$_SESSION['geb']);
            echo(
"        </li>\n");
            echo(
"        <li>\n");
            echo(
"                Clan beigetreten:\n");
            echo(
$_SESSION['join']);
            echo(
"        </li>\n");
            echo(
"        <li>\n");
            echo(
"                Grafikkarte:\n");
            echo(
htmlspecialchars($_SESSION['Grafikkarte']));
            echo(
"        </li>\n");
            echo(
"        <li>\n");
            echo(
"                Prozessor:\n");
            echo(
htmlspecialchars($_SESSION['Prozessor']));
            echo(
"        </li>\n");
            echo(
"        <li>\n");
            echo(
"                Laufbahn des Members:\n");
            if(
count($_SESSION['history']))
            {
                echo(
"<ol>\n");
                foreach(
$_SESSION['history'] as $key => $value)
                {
                    echo(
"<li>\n");
                    echo(
"    <input type=\"checkbox\" name=\"clans[]\"\n");
                    echo(
"           value=\"".$key."\" />\n");
                    if(empty(
$value['Link']))
                    {
                        echo(
$value['Clan']);
                    }
                    else
                    {
                        echo(
"<a href=\"".$value['Link']."\">\n");
                        echo(
$value['Clan']);
                        echo(
"</a>\n");
                    }
                    echo(
"    <br />\n");
                    echo(
"    (".$value['Von']." - ".$value['Bis'].")\n");
                    echo(
"</li>\n");
                }
            }
            else
            {
                echo(
"        Member war in keinen anderen Clan\n");
            }
            echo(
"        </li>\n");
            echo(
"        <li>\n");
            echo(
"            <input type=\"submit\" name=\"submit\"");
            echo(
"                   value=\"Clan hinzufügen\" />\n");
            if(
count($_SESSION['history']))
            {
                echo(
"<input type=\"submit\" name=\"submit\" value=\"Löschen\" />");
            }
            echo(
"        </li>\n");
            echo(
"        <li>\n");
            echo(
"            <input type=\"submit\" name=\"submit\"");
            echo(
"                   value=\"Member hinzufügen\" />\n");
            echo(
"            <input type=\"hidden\"");
            echo(
"                   name=\"".session_name()."\"");
            echo(
"                   value=\"".session_id()."\" />\n");
            echo(
"        </li>\n");
            echo(
"    </ol>\n");
            echo(
"</form>\n");
            
back2admin();

        }
    }
    
// ...
?>

Wie ihr seht ist es so ähnlich aufgebaut wie das Newsscript. Nur mit dem Unterschied, dass man die Daten nicht nachträglich ändern kann. Man müsste zum Formular zurückkehren und neue Daten eingeben. Die Scripte zum hinzufügen und löschen der bisherigen Clans sehen wie folgt aus.

<?php
    
//...
    
}
    elseif(isset(
$_POST['submit']) AND "Clan hinzufügen" == $_POST['submit'])
    {
        echo(
"<form action=\"index.php?section=admin&amp;site=member&amp;action=add\" ");
        echo(
"      method=\"post\" class=\"formular\">\n");
        echo(
"    <p>\n");
        echo(
"        Clan hinzufügen\n");
        echo(
"    </p>\n");
        echo(
"    <ol>\n");
        echo(
"        <li>\n");
        echo(
"            <label for=\"name\">Clanname</label>\n");
        echo(
"            <input type=\"text\" name=\"name\" id=\"name\" />\n");
        echo(
"        </li>\n");
        echo(
"        <li>\n");
        echo(
"            <label for=\"url\">Homepage (falls vorhanden)</label>\n");
        echo(
"            <input type=\"text\" name=\"url\" id=\"url\" />\n");
        echo(
"        </li>\n");
        echo(
"        <li>\n");
        echo(
"                Clan beigetreten\n");
        
// Formularfeld für den Tag
        
echo("                <select name=\"join[tag]\">\n");
        for(
$i=1$i<=31$i++)
        {
                echo(
"<option value=\"".$i."\">\n");
                echo(
$i.".\n");
                echo(
"</option>\n");
        }
        echo(
"                </select>\n");

        
// Formularfeld für den Monat
        
echo("                <select name=\"join[monat]\">\n");
        for(
$i=1$i<=12$i++)
        {
                echo(
"<option value=\"".$i."\">\n");
                echo(
$monate[$i].".\n");
                echo(
"</option>\n");
        }
        echo(
"                </select>\n");

        
// Formularfeld für das Jahr
        
echo("                <input type=\"text\" name=\"join[jahr]\" />\n");
        echo(
"        </li>\n");
        echo(
"        <li>\n");
        echo(
"                Clan verlassen\n");
        
// Formularfeld für den Tag
        
echo("                <select name=\"left[tag]\">\n");
        for(
$i=1$i<=31$i++)
        {
                echo(
"<option value=\"".$i."\">\n");
                echo(
$i.".\n");
                echo(
"</option>\n");
        }
        echo(
"                </select>\n");

        
// Formularfeld für den Monat
        
echo("                <select name=\"left[monat]\">\n");
        for(
$i=1$i<=12$i++)
        {
                echo(
"<option value=\"".$i."\">\n");
                echo(
$monate[$i].".\n");
                echo(
"</option>\n");
        }
        echo(
"                </select>\n");

        
// Formularfeld für das Jahr
        
echo("                <input type=\"text\" name=\"left[jahr]\" />\n");
        echo(
"        </li>\n");
        echo(
"        <li>\n");
        echo(
"            <input type=\"submit\" name=\"submit\"");
        echo(
"                   value=\"Clandaten hinzufügen\"\n");
        echo(
"            <input type=\"hidden\"");
        echo(
"                  name=\"".session_name()."\"");
        echo(
"                  value=\"".session_id()."\" />\n");
        echo(
"        </li>\n");
        echo(
"    </ol>\n");
        echo(
"</form>\n");
    }
?>

Das ist schonmal das Formular. Die Verarbeitung dieses Formular und das Löschen der angeklickten Clans werden wir woanders durchführen. Da nach dem Löschen und nach dem Formular wieder die Übersicht gezeigt werden soll, schreiben wir mit ein paar If-Abfragen die Verarbeitung vor dem Programmteil, der die Übersicht erzeugt. Da aber dieser Bereich nur erreicht werden kann, wenn die Variable $_POST['submit'] den Wert Weitere Memberdaten hinzufügen hat, müssen wir diese If-Abfrage etwas umschreiben.

<?php
    
if(isset($_POST['submit']) AND ("Weitere Memberdaten hinzufügen" == $_POST['submit'] OR
                                    
"Löschen" == $_POST['submit'] OR
                                    
"Clandaten hinzufügen" == $_POST['submit']))
    {
        
// Übersicht
    
}
?>

Nun können wir die If-Abfragen für die Verarbeitung des Formulars hinschreiben.

<?php
    
if(isset($_POST['submit']) AND /* ... */)
    {
        if(
"Löschen" == $_POST['submit'])
        {
            if(isset(
$_POST['clans']))
            {
                foreach(
$_POST['clans'] as $value)
            &nbs