quakenet:#php Tutorial

Author: Progman, zuletzt bearbeitet von progman @ 2005-01-26 18:54:35

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.

Administration des Adminbereichs

  1. Verwalten der Benutzer
  2. Das Rechtesystem
  3. Vorbereitung
  4. Das eigentliche Script
  5. Benutzer hinzufügen
  6. Benutzer löschen
  7. Benutzer bearbeiten

1. Verwalten der Benutzer

Im moment müssen wir einen neuen User mit PHPMyAdmin hinzufügen. Es wäre aber besser wenn wir die Benutzer auch über den Adminbereich verwalten können. Dafür brauchen wir nun ein Rechtesystem, damit nicht jeder, der ein Account hat, alle Benutzer verwalten kann.

2. Das Rechtesystem

Irgendwie müssen wir in der MySQL-Datenbank die Rechte speichern die ein Benutzer haben darf. Wir könnten z.B. die Tabelle users um eine Spalte Rechte erweitern. In der würden wir dann sowas wie Admin,Member,Clanwars schreiben. Bei einem anderen User würden wir News,Member,Clanwars schreiben. Sowas würde einer machen der keine Ahnung von Tabellenlayouts hat. Denn diese Anordnung wiederspricht sich mit der 1. Normalform. Wir legen lieber eine neue Tabelle an. Diese Tabelle hat den Aufbau user_rights(UserID, Recht). In der Spalte UserID kommt, wer häts gedacht, die UserID des Benutzers rein. In der Spalte Recht kommt dann eine Angabe, was der User machen darf, z.B. kann da News stehen um zu sagen, dass der User News schreiben, editieren und löschen darf. Wenn der User nun mehrere Aufgaben haben soll, wird einfach ein neuer Datensatz hinzugefügt. Die UserID ist die gleiche nur bei der Rechtespalte kommt nun was neues hin, wie z.B. Clanwar. Je nach dem welche Rechte der User hat sind genausoviele Datensätze in der Tabelle. Die Tabelle erstellen wir wie folgt mit PHPMyAdmin.

CREATE TABLE user_rights (
    UserID TINYINT,
    Recht VARCHAR(30)
);
        

30 Zeichen sollten wohl für die Beschreibung des Rechtes reichen. Um z.B. alle Rechte von User XY zu erfahren benutzt man folgenden SELECT-Befehl

SELECT
    Recht
FROM
    user_rights
WHERE
    UserID = '4'
[ORDER BY
    Recht ASC];
        

Das ORDER BY in eckigen Klammern gibt an, dass die Angabe optional ist. Dies kennt man auch aus dem PHP-Manual und wird auch im MySQL-Manual verwendet. Hier wollte ich zeigen, dass man die Ausgabe vielleicht dann noch nach den Rechten sortieren lassen sollte.

Im Adminbereich können wir dann darauf reagieren ob einer User nun das Recht hat diesen entsprechenden Bereich zu betreteten. Entweder ist ein Datensatz vorhanden oder nicht.

3. Vorbereitung

Damit wir unseren Adminbereich verwalten können müssen wir noch ein paar Sachen erledigen, bevor wir unser Verwaltungsscript schreiben.

  1. Wir müssen mit PHPMyAdmin einen neuen Datensatz in der neu erstellten Tabelle manuell hinzufügen. Dies machen wir das mindestens ein User schonmal das Recht hat, die Benutzer zu verwalten. Als Bezeichnung schreiben wir Admin rein.

  2. Das Array $admin_site muss erweiter werden. Dazu reicht einfach folgender Code in der variablen.php.

    <?php
        $admin_site
    ['user'] = "admin_user.php";
    ?>
  3. Als letzes müssen wir die das Adminmenu verändern. Dies könnte dann so aussehen (admin_menu.php).

    <?php
        
    echo "<div class=\"adminbereich\">\n";
        echo 
    "    <p>\n";
        echo 
    "        Willkommen im Adminbereich\n";
        echo 
    "    </p>\n";
        echo 
    "    <ol class=\"bereich\">\n";
        echo 
    "        <li>\n";
        echo 
    "            Benutzer\n";
        echo 
    "            <ol class=\"aktionen\">\n";
        echo 
    "                <li>\n";
        echo 
    "<a href=\"index.php?section=admin&amp;site=user&amp;action=add&amp;".SID."\">\n";
        echo 
    "                        hinzufügen\n";
        echo 
    "                    </a>\n";
        echo 
    "                </li>\n";
        echo 
    "                <li>\n";
        echo 
    "<a href=\"index.php?section=admin&amp;site=user&amp;action=edit&amp;".SID."\">\n";
        echo 
    "                        bearbeiten\n";
        echo 
    "                    </a>\n";
        echo 
    "                </li>\n";
        echo 
    "                <li>\n";
        echo 
    "<a href=\"index.php?section=admin&amp;site=user&amp;action=del&amp;".SID."\">\n";
        echo 
    "                        löschen\n";
        echo 
    "                    </a>\n";
        echo 
    "                </li>\n";
        echo 
    "            </ol>\n";
        echo 
    "        </li>\n";
        echo 
    "    </ol>\n";
        echo 
    "    <p>\n";
        echo 
    "        <a href=\"index.php?section=admin&amp;site=self&amp;".SID."\">\n";
        echo 
    "            Eigenen Account bearbeiten\n";
        echo 
    "        </a>\n";
        echo 
    "    </p>\n";
        echo 
    "</div>\n";
    ?>

    Die Links habe ich eingerückt, damit das Tutorial nicht so breit wird.

    Hier sind die passenden CSS-Angaben.

    .adminbereich {
        border: 1px solid black;
        background-color: #EEEEFF;
    }
    .adminbereich ol.bereich {
        list-style-type: none;
    }
    .adminbereich ol.aktionen {
        list-style-type: none;
    }
    .adminbereich ol.aktionen > li {
        display: inline;
    }
    .adminbereich ol.aktionen > li > a {
        border: 1px solid black;
        background-color: #CCCCCC;
        color: #000000;
        text-decoration: none;
    }
    .adminbereich ol.aktionen > li > a:hover {
        background-color: #FFFFFF;
        color: #333333;
        text-decoration: none;
    }
                    

4. Das eigentliche Script

Damit nicht jeder User in die Benutzerverwaltung kommt müssen wir abfragen ob der aktuelle User in die Benutzerverwaltung rein darf.

<?php
    $sql 
"SELECT
                Recht
            FROM
                user_rights
            WHERE
               UserID = '"
.$_SESSION['ID']."';";
    
$result mysql_query($sql) OR die(mysql_error());
    
$rights = array();
    while(
$row mysql_fetch_assoc($result)) {
        
$rights[] = $row['Recht'];
    }

    if(!
in_array("Admin"$rights)) {
        echo 
"<p>\n";
        echo 
"    Sie haben keine Berechtigung, diesen Bereich\n";
        echo 
"    zu betreten. Bitte wählen sie einen anderen\n";
        echo 
"    Bereich aus\n";
        echo 
"</p>\n";
        echo 
"<p>\n";
        echo 
"    <a href=\"index.php?section=admin&amp;".SID."\">\n";
        echo 
"        Zurück zum Adminbereich\n";
        echo 
"    </a>\n";
        echo 
"</p>\n";
    } else {
        echo 
"<p>\n";
        echo 
"    Willkommen im Bereich foobar\n";
        echo 
"</p>\n";
    }
?>

Da wir in allen Bereichen solche Abfragen haben, sollten wir diese Programmzeilen in zwei Funktionen schreiben. Diese Funktionen fügen wir in die functions.php Datei ein.

<?php
    
function no_rights()
    {
        echo 
"<p class=\"error\">\n";
        echo 
"    Sie haben keine Berechtigung, diesen Bereich\n";
        echo 
"    zu betreten. Bitte wählen sie einen anderen\n";
        echo 
"    Bereich aus\n";
        echo 
"</p>\n";
        echo 
"<p>\n";
        echo 
"    <a href=\"index.php?section=admin&amp;".SID."\">\n";
        echo 
"        Zurück zum Adminbereich\n";
        echo 
"    </a>\n";
        echo 
"</p>\n";
    }

    function 
getRights($UID null)
    {
        if(isset(
$UID)) {
            
$sql "SELECT
                        Recht
                    FROM
                        user_rights
                    WHERE
                       UserID = '"
.$UID."';";
        } else {
            
$sql "SELECT
                        Recht
                    FROM
                        user_rights
                    WHERE
                       UserID = '"
.$_SESSION['ID']."';";
        }
        
$result mysql_query($sql) OR die(mysql_error());
        
$rights = array();
        while(
$row mysql_fetch_assoc($result)) {
            
$rights[] = $row['Recht'];
        }
        return 
$rights;
    }
?>

Für den späteren Gebraucht habe ich für die Funktion getRights einen optionalen Parameter erstellt. Mit dieser Funktion kann man dann die Rechte von einem beliebigen Users auslesen. Mit den beiden Funktionen können wir nun das Script etwas umschreiben.

<?php
    $rights 
getRights();
    if(!
in_array("Admin"$rights)) {
        
no_rights();
    } else {
        echo 
"<p>\n";
        echo 
"    Willkommen im Bereich foobar\n";
        echo 
"</p>\n";
    }
?>

Jetzt müssen wir auf die GET-Variable action reagieren. Dies machen wir am besten mit einer Switch-Abfrage, da sich die Anzahl der möglichen Werten im GET-Parameter konstant bleibt.

<?php
    $rights 
getRights();
    if(!
in_array("Admin"$rights)) {
        
no_rights();
    } else {
        switch(@
$_GET['action']) {
            case 
"add":
                break;

            case 
"edit":
                break;

            case 
"del":
                break;

            default:
                break;
        }
    }
?>

Das @ hab ich da hingeschrieben, damit er nicht meckert, wenn es $_GET['action'] nicht gibt. Dies 'darf' ich machen, weil ich selber diese Situation mit der default-Angabe abfange. Besser ist aber folgender Code.

<?php
    
switch(isset($_GET['action'])?$_GET['action']:'') {
         
// ...
    
}
?>

In den einzelnen Teilbereichen kommt dann unser PHP-Code, der dann entsprechend Forumlare erstellt und MySQL Befehle aufruft. Der default-Teil enthält nur eine einfache Fehlermeldung, dass man nur die Links aus dem Adminbereich benutzen soll und nicht eigenständig irgentwelche action-Werte wählt.

<?php
    $rights 
getRights();
    if(!
in_array("Admin"$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 
"    <a href=\"index.php?section=admin&amp;".SID."\">\n";
                echo 
"        Zurück zum Adminbereich\n";
                echo 
"    </a>\n";
                echo 
"</p>\n";
                break;
        }
    }
?>

5. Benutzer hinzufügen

Wir lassen erstmal ein Formular erstellen, wo der Admin einen neuen User erstellen kann.

<?php
    
// ...
            
case "add":
                echo 
"<form ".
                     
"action=\"index.php?section=admin&amp;site=user&amp;action=add\" ".
                     
"method=\"post\" ".
                     
"class=\"formular\">\n";
                echo 
"    <p>\n";
                echo 
"        Neuen Benutzer 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\">Emailadresse</label>\n";
                echo 
"            <input type=\"text\" name=\"email\" id=\"email\" />\n";
                echo 
"        </li>\n";
                echo 
"        <li>\n";
                echo 
"            <label for=\"send\">\n";
                echo 
"                Zugangsdaten per Email zuschicken lassen\n";
                echo 
"            </label>\n";
                echo 
"            <input type=\"checkbox\" name=\"send\" id=\"send\" />\n";
                echo 
"        </li>\n";
                echo 
"        <li>\n";
                echo 
"            <input type=\"submit\" name=\"submit\" value=\"Benutzer hinzufügen\" />\n";
                echo 
"            <input type=\"reset\" name=\"submit\" value=\"Zurücksetzen\" />\n";
                echo 
"            <input type=\"hidden\" name=\"".session_name()."\" ".
                                                           
"value=\"".session_id()."\" />\n";
                echo 
"        </li>\n";
                echo 
"    <ol>\n";
                echo 
"</form>\n";
                echo 
"<p>\n";
                echo 
"    <a href=\"index.php?section=admin&amp;".SID."\">\n";
                echo 
"        Zurück zum Adminbereich\n";
                echo 
"    </a>\n";
                echo 
"</p>\n";
                break;
    
// ...
?>

Jetzt brauchen wir eine If-Abfrage, die im If-Teil das Formular verarbeitet und im else-Teil dieses Formular erstellt. Im If-Teil wird dann der Benutzer hinzugefügt und ggf. auch noch per Email benachrichtigt.

<?php
    
// ...
            
case "add":
                if(isset(
$_POST['submit'])) {
                    if(!
preg_match('/^\w+$/'trim($_POST['name']))) {
                        echo 
"<p>\n";
                        echo 
"    Bitte geben sie einen Name aus alphanumerischen Zeichen ein.\n";
                        echo 
"</p>\n";
                        echo 
"<p>\n";
                        echo 
"    <a href=\"index.php?section=admin&amp;site=user&amp;action=add&amp;".SID."\">\n";
                        echo 
"        Zurück zum Formular\n";
                        echo 
"    </a>\n";
                        echo 
"</p>\n";
                    } elseif(
trim($_POST['email']) == "") {
                        echo 
"<p>\n";
                        echo 
"    Bitte geben sie eine Emailadresse an.\n";
                        echo 
"</p>\n";
                        echo 
"<p>\n";
                        echo 
"    <a href=\"index.php?section=admin&amp;site=user&amp;action=add&amp;".SID."\">\n";
                        echo 
"        Zurück zum Formular\n";
                        echo 
"    </a>\n";
                        echo 
"</p>\n";
                    } else {
                        
$password substr(md5(microtime()),0,8); // zufallspassword erstellen
                        
$sql "INSERT INTO
                                    users(Name, Email, Password)
                                VALUES
                                    ('"
.trim($_POST['name'])."',
                                     '"
.addslashes(trim($_POST['email']))."',
                                     MD5('"
.$password."'));";
                        
$result mysql_query($sql) OR die(mysql_error());
                        if(isset(
$_POST['send'])) {// Login-Daten per Email schicken
                            
$mailbody  "Zugangsdaten zur Homepage:\n";
                            
$mailbody .= "Name: ".trim($_POST['name'])."\n";
                            
$mailbody .= "Password: ".$password."\n";
                            
$mailbody .= "Bitte loggen sie sich ein und ändern sie das Password.\n";
                            if(
mail(trim($_POST['email']), "Zugangsdaten"$mailbody)) {
                                echo 
"<p>\n";
                                echo 
"    Account wurde hinzugefügt und die Zugangsdaten wurden zum\n";
                                echo 
"    Benutzer geschickt.\n";
                                echo 
"</p>\n";
                                echo 
"<p>\n";
                                echo 
"    <a href=\"index.php?section=admin&amp;".SID."\">\n";
                                echo 
"        Zurück zum Adminbereich\n";
                                echo 
"    </a>\n";
                                echo 
"</p>\n";
                            } else {
                                echo 
"<p>\n";
                                echo 
"    Account wurde hinzugefügt, doch es konnte keine Email\n";
                                echo 
"    verschickt werden.\n";
                                echo 
"</p>\n";
                                echo 
"<p>\n";
                                echo 
"    Logindaten <br />\n";
                                echo 
"    Name: ".trim($_POST['name'])."<br />\n";
                                echo 
"    Password: ".$password."<br />\n";
                                echo 
"</p>\n";
                                echo 
"<p>\n";
                                echo 
"    <a href=\"index.php?section=admin&amp;".SID."\">\n";
                                echo 
"        Zurück zum Adminbereich\n";
                                echo 
"    </a>\n";
                                echo 
"</p>\n";
                            }
                        } else {
                            echo 
"<p>\n";
                            echo 
"    Account wurde hinzugefügt.\n";
                            echo 
"</p>\n";
                            echo 
"<p>\n";
                            echo 
"    Logindaten <br />\n";
                            echo 
"    Name: ".trim($_POST['name'])."<br />\n";
                            echo 
"    Password: ".$password."<br />\n";
                            echo 
"</p>\n";
                            echo 
"<p>\n";
                            echo 
"    <a href=\"index.php?section=admin&amp;".SID."\">\n";
                            echo 
"        Zurück zum Adminbereich\n";
                            echo 
"    </a>\n";
                            echo 
"</p>\n";
                        }
                    }
                } else {
                    echo 
"<form ".
                         
"action=\"index.php?section=admin&amp;site=user&amp;action=add\" ".
                         
"method=\"post\" ".
                         
"class=\"formular\">\n";
                    echo 
"    <p>\n";
                    echo 
"        Neuen Benutzer 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\">Emailadresse</label>\n";
                    echo 
"            <input type=\"text\" name=\"email\" id=\"email\" />\n";
                    echo 
"        </li>\n";
                    echo 
"        <li>\n";
                    echo 
"            <label for=\"send\">\n";
                    echo 
"                Zugangsdaten per Email zuschicken lassen\n";
                    echo 
"            </label>\n";
                    echo 
"            <input type=\"checkbox\" name=\"send\" id=\"send\" />\n";
                    echo 
"        </li>\n";
                    echo 
"        <li>\n";
                    echo 
"            <input type=\"submit\" name=\"submit\" value=\"Benutzer hinzufügen\" />\n";
                    echo 
"            <input type=\"reset\" name=\"submit\" value=\"Zurücksetzen\" />\n";
                    echo 
"            <input type=\"hidden\" name=\"".session_name()."\" ".
                                                            
"value=\"".session_id()."\" />\n";
                    echo 
"        </li>\n";
                    echo 
"    <ol>\n";
                    echo 
"</form>\n";
                    echo 
"<p>\n";
                    echo 
"    <a href=\"index.php?section=admin&amp;".SID."\">\n";
                    echo 
"        Zurück zum Adminbereich\n";
                    echo 
"    </a>\n";
                    echo 
"</p>\n";
                }
                break;
    
// ...
?>

Über die Funktionen kann man sich im Manual schlaumachen, ihr wisst ja wie man das macht. Die Doku zu elseif erreicht man genauso, ist aber keine Funktion, sondern ein Sprachkonstrukt.

Der Rückgabewert der mail-Funktion hat nix damit zu tun ob die Email angekommen ist oder nicht. Es dient eher dazu um zu gucken ob der locale Mailserver, z.b. sendmail, die Email richtig angekommen ist oder nicht. Man weiß nicht, ob die Email angekommen ist und kann es auch nie erfahren.

6. Benutzer löschen

Das löschen eines Benutzers ist recht einfach. Da brauchen wir nur den Benutzer aus einer Dropdown-Liste auswählen und das Formular dann abschicken. Um den gewählten Benutzer zu löschen muss man einfach alle Datensätze aus der Rechtetabelle des Users löschen und man den User selbs löschen.

<?php
    
// ...
    
case 'del':
        echo 
"<form ".
             
"action=\"index.php?section=admin&amp;site=user&amp;action=del\" ".
             
"method=\"post\" ".
             
"class=\"formular\">\n";
        echo 
"    <p>\n";
        echo 
"        Benutzer löschen\n";
        echo 
"    </p>\n";
        echo 
"    <ol>\n";
        echo 
"        <li>\n";
        echo 
"            <label for=\"name\">Benutzer</label>\n";
        
$sql "SELECT
                    Name, ID
                FROM
                    users
                ORDER BY
                    Name ASC;"
;
        
$result mysql_query($sql) OR die(mysql_error());
        echo 
"                <select id=\"name\" name=\"uid\">\n";
        echo 
"                    <option value=\"0\" selected=\"selected\">Bitte einen User wählen</option>\n";
        while(
$row mysql_fetch_assoc($result)) {
            echo 
"<option value=\"".$row['ID']."\">".$row['Name']."</option>\n";
        }
        echo 
"                </select>\n";
        echo 
"        </li>\n";
        echo 
"        <li>\n";
        echo 
"            <input type=\"submit\" name=\"submit\" value=\"Benutzer löschen\" />\n";
        echo 
"            <input type=\"reset\" name=\"submit\" value=\"Zurücksetzen\" />\n";
        echo 
"            <input type=\"hidden\" name=\"".session_name()."\" ".
                                                
"value=\"".session_id()."\" />\n";
        echo 
"        </li>\n";
        echo 
"    <ol>\n";
        echo 
"</form>\n";
        echo 
"<p>\n";
        echo 
"    <a href=\"index.php?section=admin&amp;".SID."\">\n";
        echo 
"        Zurück zum Adminbereich\n";
        echo 
"    </a>\n";
        echo 
"</p>\n";
        break;
    
// ...
?>

Wie bei den Teil zum hinzufügen eines Benutzers brauchen wie auch noch eine If-Abfrage. Was man hier sieht, ist, dass ich das Selectfeld den Namen uid und nicht UserID genommen habe. Hätte ich diesen Namen genommen so würde sich das mit einer äußeren If-Abfrage nicht vertragen. Und zwar mit der in der admin.php wo wie die Logindaten überprüfen und wir dann bei den richtigen Daten in den Adminbereich kommen.

<?php
    
// ...
    
case 'del':
        if(isset(
$_POST['submit'])) {
            if(!
$_POST['uid']) { // gucken ob == 0 ist
                
echo "<p class=\"error\">\n";
                echo 
"    Bitte wählen sie einen Benutzer aus<br />\n";
                echo 
"    <a href=\"index.php?section=admin&amp;site=user&amp;action=del\">\n";
                echo 
"        Zurück zum Formular\n";
                echo 
"    </a>\n";
                echo 
"</p>\n";
            } else {
                
$sql "DELETE FROM
                            user_rights
        &nb