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
                        WHERE
                            UserID = '"
.$_POST['uid']."';";
                
mysql_query($sql) OR die(mysql_error());
                
$sql = "DELETE FROM
                            users
                        WHERE
                            ID = '"
.$_POST['uid']."';";
                
mysql_query($sql) OR die(mysql_error());
                echo
"<p>\n";
                echo
"    Der User wurde gelöscht.\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=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;
    
// ...
?>

Der Admin braucht nur den Benutzer auszuwählen und auf "Benutzer löschen" klicken. Danach gelangt er wieder in den Adminbereich.

7. Benutzer bearbeiten

Das Script um einen Benutzer zu bearbeiten ist etwas komplexer. Denn erstmal muss man einen Benutzer auswählen, dann die Daten von ihm auslesen und in ein Formular schreiben lassen, dann vielleicht noch eine Bestätigungsseite erstellen und dann endlich die Daten speichern.

Erstmal wählen wir unseren Benutzer aus.

<?php
    
// ...
    
case 'edit':
        echo
"<form ".
             
"action=\"index.php?section=admin&amp;site=user&amp;action=edit\" ".
             
"method=\"post\" ".
             
"class=\"formular\">\n";
        echo
"    <p>\n";
        echo
"        Benutzer bearbeiten\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 auswählen\" />\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;
    
// ...
?>

Und wir schreiben wieder eine If-Abfrage, die auf diese Eingabe reagiert.

<?php
    
// ...
    
case 'edit':
        if(isset(
$_POST['submit']) AND "Benutzer auswählen" == $_POST['submit']) {
            if(!
$_POST['uid']) {
                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 {
                
$_SESSION['uid'] = $_POST['uid']; // Die UserID in der Session speichern.
                
$rights = getRights($_SESSION['uid']); // Die Rechte vom User holen
                
$sql = "SELECT
                            Name
                        FROM
                            users
                        WHERE
                            ID = '"
.$_SESSION['uid']."';";
                
$result = mysql_query($sql) OR die(mysql_error());
                
$Name = mysql_result($result, 0);
                echo
"<form ".
                     
"action=\"index.php?section=admin&amp;site=user&amp;action=edit\" ".
                     
"method=\"post\" ".
                     
"class=\"formular\">\n";
                echo
"    <p>\n";
                echo
"        Benutzer ".$Name." bearbeiten\n";
                echo
"    </p>\n";
                echo
"    <ol>\n";
                echo
"        <li>\n";
                echo
"            Rechte:\n";
                
$allRights = array();
                
$allRights[] = "Admin";
                
$allRights[] = "News";
                
// .. und weitere
                
sort($allRights);
                echo
"            <ul>\n";
                foreach(
$allRights as $value) {
                    echo
"<li>\n";
                    echo
"    <input id=\"".$value."\" type=\"checkbox\" name=\"rights[]\"";
                    if(
in_array($value, $rights)) {
                        echo
" checked=\"checked\"";
                    }
                    echo
" value=\"".$value."\" />\n";
                    echo
"    <label for=\"".$value."\">".$value."</label><br />\n";
                }
                echo
"            </ul>\n";
                echo
"        </li>\n";
                echo
"        <li>\n";
                echo
"            <input type=\"submit\" name=\"submit\" value=\"Rechte speichern\" />\n";
                echo
"            <input type=\"reset\" name=\"submit\" value=\"Zurücksetzen\" />\n";
                echo
"            <input type=\"hidden\" name=\"".session_name()."\" ".
                                                            
"value=\"".session_id()."\" />\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";
            }
        } else {
            echo
"<form ".
                 
"action=\"index.php?section=admin&amp;site=user&amp;action=edit\" ".
                 
"method=\"post\" ".
                 
"class=\"formular\">\n";
            echo
"    <p>\n";
            echo
"        Benutzer bearbeiten\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 auswählen\" />\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;
    
// ...
?>

Das Array $allRights sollten wir in der variablen.php definieren. Bei einem neuen Bereich brauchen wir nur die Datei variablen.php bearbeiten.

Nun brauchen wir noch den Programmcode, der die neuen Rechte in die Datenbank speichert.

<?php
    
// ...
    
case 'edit':
        if(isset(
$_POST['submit']) AND "Benutzer auswählen" == $_POST['submit']) {
            if(!
$_POST['uid']) {
                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 {
                
$_SESSION['uid'] = $_POST['uid']; // Die UserID in der Session speichern.
                
$rights = getRights($_SESSION['uid']); // Die Rechte vom User holen
                
$sql = "SELECT
                            Name
                        FROM
                            users
                        WHERE
                            ID = '"
.$_SESSION['uid']."';";
                
$result = mysql_query($sql) OR die(mysql_error());
                
$Name = mysql_result($result, 0);
                echo
"<form ".
                     
"action=\"index.php?section=admin&amp;site=user&amp;action=edit\" ".
                     
"method=\"post\" ".
                     
"class=\"formular\">\n";
                echo
"    <p>\n";
                echo
"        Benutzer ".$Name." bearbeiten\n";
                echo
"    </p>\n";
                echo
"    <ol>\n";
                echo
"        <li>\n";
                echo
"            Rechte:\n";
                
$allRights = array();
                
$allRights[] = "Admin";
                
$allRights[] = "News";
                
// .. und weitere
                
sort($allRights);
                echo
"            <ul>\n";
                foreach(
$allRights as $value) {
                    echo
"<li>\n";
                    echo
"    <input id=\"".$value."\" type=\"checkbox\" name=\"rights[]\"";
                    if(
in_array($value, $rights)) {
                        echo
" checked=\"checked\"";
                    }
                    echo
" value=\"".$value."\" />\n";
                    echo
"    <label for=\"".$value."\">".$value."</label><br />\n";
                }
                echo
"            </ul>\n";
                echo
"        </li>\n";
                echo
"        <li>\n";
                echo
"            <input type=\"submit\" name=\"submit\" value=\"Rechte speichern\" />\n";
                echo
"            <input type=\"reset\" name=\"submit\" value=\"Zurücksetzen\" />\n";
                echo
"            <input type=\"hidden\" name=\"".session_name()."\" ".
                                                            
"value=\"".session_id()."\" />\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";
            }
        } elseif(isset(
$_POST['submit']) AND "Rechte speichern" == $_POST['submit']) {
            if(!isset(
$_POST['rights'])) {
                echo
"<p class=\"error\">\n";
                echo
"    Sie müssen mindestens ein Recht angeben.\n";
                echo
"</p>\n";
            } else {
                
$sql = "DELETE FROM
                            user_rights
                        WHERE
                            UserID = '"
.$_SESSION['uid']."';";
                
mysql_query($sql) OR die(mysql_error());
                
// alle Vorhandenen Rechte löschen
                // und nun die angewählten hinzufügen
                
foreach($_POST['rights'] as $right) {
                    
$sql = "INSERT INTO
                                user_rights(userID, Recht)
                            VALUES
                                ('"
.$_SESSION['uid']."',
                                 '"
.$right."');";
                    
mysql_query($sql) OR die(mysql_error());
                }
                echo
"<p>\n";
                echo
"    Die Rechte wurden gespeichert.\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=edit\" ".
                 
"method=\"post\" ".
                 
"class=\"formular\">\n";
            echo
"    <p>\n";
            echo
"        Benutzer bearbeiten\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 auswählen\" />\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;
    
// ...
?>

Hier kann der Admin dann die Rechte des Benutzers bearbeiten. Es gibt dabei noch ein Problem. In der Session ist noch die User-ID des Benutzers gespeichert. Diese sollte man irgendwie nach dem bearbeiten löschen. Dies machen wir im Hauptmenu, am besten automatisch.

<?php
    
// ... section = login + logout
    
else {
        
// der Adminbereich, wenn weder action=login
        // noch action=logout ist
        
if(isset($_POST['UserID']) AND '0' == $_POST['UserID']) {
            echo
"<p>\n";
            echo
"    Bitte wählen sie einen Benutzernamen aus.\n";
            echo
"</p>\n";
        } else {
            if(isset(
$_POST['UserID'], $_POST['Password']) AND
               
login_right(addslashes($_POST['UserID']),
                           
addslashes($_POST['Password']))) {
                
$_SESSION['ID'] = $_POST['UserID'];
            }
            if(isset(
$_SESSION['ID'])) {
                if(isset(
$_GET['site']) AND isset($admin_site[$_GET['site']])) {
                    include(
$admin_site[$_GET['site']]);
                } else {
                    
//
                    // Reste in der Session löschen
                    //
                    
$_SESSION = array('ID' => $_SESSION['ID'],
                                      
'IP' => $_SESSION['IP']);
                    include
"admin_menu.php";
                    
// Das Hauptmenu vom Adminbereich laden
                
}
            } else {
                echo
"<p class=\"error\">\n";
                echo
"    Falsches Password\n";
                echo
"</p>\n";
            }
        }
    }
?>

Hier kann es zu Problemen kommen. Wenn register_globals aktiviert ist (ich will doch wohl hoffen, dass es das nicht ist) und man eine PHP-Version in der Gegend von 4.2.2 hat kann man nicht einfach so $_SESSION = array() machen. Hier muss man mit session_unregister und so arbeiten. Wenn ihr die Möglichkeit habt register_globals zu deaktivieren (via php.ini oder .htaccess) dann macht es, es bringt nur probleme, wenn es aktiviert ist.

Fragen zum aktuellen Thema

  1. Was bringt das @ in der switch-Anweisung?
Was bringt das @ in der switch-Anweisung?

Bei dem oben stehenden Code wurde das @ benutzt. Dies habe ich gemacht um die Fehlermeldung "Undefined Variable" zu unterdrücken. In diesem Fall wird dann der default-Teil ausgeführt. Tricksen kann man hier mit der cond ? value-true : value-false Struktur.

Nach oben