Author: Progman, zuletzt bearbeitet von tittenmaus @ 2004/11/28 14:35:32
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.
Eigenen Login bearbeiten
1. Benutzerdaten ändern
Wir haben nun unser Login-Script. Doch machen können wir damit noch garnix, denn wir haben ja nichtmal ein Account. Dazu müssen wir erstmal einen Account manuell mittels PHPMyAdmin hinzufügen. Für die Spalte, wo wir das Password eingeben kann man in der Dropdown Liste daneben die Funktion MD5 auswählen (nicht PASSWORD) und kann das Password dann normal eingeben. Ein Klick auf Hinzufügen und der Account ist in der Datenbank. PHPMyAdmin bzw. MySQL selber fügt durch die Auswahl von MD5 automatisch die MD5-Checksumme vom Password ein.
Früher oder später möchte ein User im Adminbereich sein Name, seine Emailadresse und/oder sein Password ändern. Deshalb brauchen wir ein Script mit dem man das machen kann.
2. Neues Dateien-Array
Wenn wir nun im unseren Adminbereich sind wollen wir uns von Seite zu Seite hangeln. Da wir aber immer in ?section=admin arbeiten, brauchen wir eine neue GET-Variable, die den Bereich auswählt. Wir benutzten dabei die Variable site. Mit dieser steuern wir dann, welcher Bereich geladen werden soll, wie News oder Members. Damit die admin.php Datei nicht so rießig wird benutzen wir wieder include. Wir erstellen dabei ein neues Array $admin_site.
<?php
$admin_site = array();
$admin_site['self'] = "admin_self.php";
?>
Dieses Array definiert man in der variablen.php. Wenn dann ein neuer Adminbereich hinzukommt, wird dann einfach das Array erweitert.
Das Includen ist so ähnlich aufgebaut wie bei der inhalt.php Datei. Die admin.php bearbeiten wir wie folgt.
<?php
// ... If Abfrage, ob section = logout ist
else {
// der Adminbereich, wenn nicht ausgelogt werden soll
if(isset($_POST['UserID']) AND '0' == $_POST['UserID']) {
echo "<p class=\"error\">\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 {
include "admin_menu.php";
// Das Hauptmenu vom Adminbereich laden
}
} else {
// Login-Formular mit der if(isset()) abfrage
}
}
}
?>
In der admin_menu.php Datei wird dann das Hauptmenu vom Adminbereich gezeigt, von der man aus in alle anderen Bereiche gelangt. Diese Datei könnte so aussehen.
<?php
echo "<h2>Adminbereich</h2>\n";
echo "<p>\n";
echo " <a href=\"index.php?section=admin&site=self&".SID."\">\n";
echo " Eigenen Account bearbeiten\n";
echo " </a>\n";
echo "</p>\n";
?>
Hier kann dann eine schön formartierte Tabelle hinzugefügt werden. Die hab ich nun erstmal weggelassen, da wir noch kein Bereich zum bearbeiten haben.
3. Eigenen Account bearbeiten
In der admin_self.php sollen wir dann unsere Daten ändern können. Dazu erstellen wir ein Formular, in der unsere Daten schon eingegeben stehen. Das heißt dass wir einmal die Daten auslesen müssen.
<?php
$sql = "SELECT
Name,
FROM
users
WHERE
ID = '".$_SESSION['ID']."';";
$result = mysql_query($sql) OR die(mysql_error());
$row = mysql_fetch_assoc($result);
?>
Dann erstellen wir ein Formular, wo die ganzen Daten schon drinstehen und man die Felder bearbeiten können.
<?php
$sql = "SELECT
Name,
FROM
users
WHERE
ID = '".$_SESSION['ID']."';";
$result = mysql_query($sql) OR die(mysql_error());
$row = mysql_fetch_assoc($result);
echo "<form action=\"index.php?section=admin&site=self\" method=\"post\" class=\"formular\">\n";
echo " <p>\n";
echo " Eigene Daten bearbeiten\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\" value=\"".$row['Name']."\"/>\n";
echo " </li>\n";
echo " <li>\n";
echo " <label for=\"email\">Emailadresse</label>\n";
echo " <input type=\"text\" name=\"email\" id=\"email\" value=\"".$row['Email']."\"/>\n";
echo " </li>\n";
echo " <li>\n";
echo " <input type=\"submit\" name=\"submit\" value=\"Speichern\" />\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&".SID."\">Zurück</a>\n";
echo "</p>\n";
?>
Da das Formular an die gleiche Seite geschickt wird, brauchen wir eine If-Abfrage, die auf die Inhalte des Formulars reagiert.
<?php
if(isset($_POST['submit']) AND "Speichern" == $_POST['submit']) {
if(!preg_match('/^\w+$/', trim($_POST['name']))) {
echo "<p class=\"error\">\n";
echo " Bitte benutzen sie einen Name nur aus Alphanumerischen\n";
echo " Zeichen (Zahlen und Buchstaben).\n";
echo "</p>\n";
} else {
// ggf. eine Emailadresse überprüfung
// siehe dazu http://www.php-faq.de/ > Regex
$sql = "UPDATE
users
SET
Name = '".trim($_POST['name'])."',
Email = '".addslashes(trim($_POST['email']))."'
WHERE
ID = '".$_SESSION['ID']."';";
// bei Name kein addslashes(), da Name eh
// nur \w+ sein kann.
mysql_query($sql) OR die(mysql_error());
echo "<p>\n";
echo " Ihre Daten wurde gespeichert\n";
echo "</p>\n";
}
}
$sql = "SELECT
Name,
FROM
users
WHERE
ID = '".$_SESSION['ID']."';";
$result = mysql_query($sql) OR die(mysql_error());
$row = mysql_fetch_assoc($result);
echo "<form action=\"index.php?section=admin&site=self\" method=\"post\" class=\"formular\">\n";
echo " <p>\n";
echo " Eigene Daten bearbeiten\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\" value=\"".$row['Name']."\"/>\n";
echo " </li>\n";
echo " <li>\n";
echo " <label for=\"email\">Emailadresse</label>\n";
echo " <input type=\"text\" name=\"email\" id=\"email\" value=\"".$row['Email']."\"/>\n";
echo " </li>\n";
echo " <li>\n";
echo " <input type=\"submit\" name=\"submit\" value=\"Speichern\" />\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&".SID."\">Zurück</a>\n";
echo "</p>\n";
?>
Wie ihr seht speicher ich die Emailadresse ohne überprüfung in die Datenbank. Das heißt, dass man damit viel scheisse machen kann. Das ist aber hier nicht so tragisch, da es hier um die Bearbeitung eines eigenen Accounts ist, der von deinem netten Admin für eine nette Person gegeben wurde. Da vertraut man ihn schonmal, das er da keine HTML-Elemente oder so einträgt. Wenn doch, wird er halt gekickt ;).
Vielleicht möchte man ja auch sein Password ändern. Da wir das Password nicht auslesen können, müssen wir das Formularfeld für das Password leer lassen.
<?php
if(isset($_POST['submit']) AND "Speichern" == $_POST['submit']) {
if(!preg_match('/^\w+$/', trim($_POST['name']))) {
echo "<p class=\"error\">\n";
echo " Bitte benutzen sie einen Name nur aus Alphanumerischen\n";
echo " Zeichen (Zahlen und Buchstaben).\n";
echo "</p>\n";
} else {
// ggf. eine Emailadresse überprüfung
// siehe dazu http://www.php-faq.de/ > Regex
$sql = "UPDATE
users
SET
Name = '".trim($_POST['name'])."',
Email = '".addslashes(trim($_POST['email']))."'
WHERE
ID = '".$_SESSION['ID']."';";
// bei Name kein addslashes(), da Name eh
// nur \w+ sein kann.
mysql_query($sql) OR die(mysql_error());
echo "<p>\n";
echo " Ihre Daten wurde gespeichert\n";
echo "</p>\n";
}
}
$sql = "SELECT
Name,
FROM
users
WHERE
ID = '".$_SESSION['ID']."';";
$result = mysql_query($sql) OR die(mysql_error());
$row = mysql_fetch_assoc($result);
echo "<form action=\"index.php?section=admin&site=self\" method=\"post\" class=\"formular\">\n";
echo " <p>\n";
echo " Eigene Daten bearbeiten\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\" value=\"".$row['Name']."\"/>\n";
echo " </li>\n";
echo " <li>\n";
echo " <label for=\"email\">Emailadresse</label>\n";
echo " <input type=\"text\" name=\"email\" id=\"email\" value=\"".$row['Email']."\"/>\n";
echo " </li>\n";
echo " <li>\n";
echo " <input type=\"submit\" name=\"submit\" value=\"Speichern\" />\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 "<form action=\"index.php?section=admin&site=self\" method=\"post\" class=\"formular\">\n";
echo " <p>\n";
echo " Neues Password erstellen\n";
echo " </p>\n";
echo " <ol>\n";
echo " <li>\n";
echo " <label for=\"password\">Neues Password</label>\n";
echo " <input type=\"password\" name=\"password\" id=\"password\" />\n";
echo " </li>\n";
echo " <li>\n";
echo " <label for=\"password2\">Bestätigung</label>\n";
echo " <input type=\"password\" name=\"password2\" id=\"password2\" />\n";
echo " </li>\n";
echo " <li>\n";
echo " <input type=\"submit\" name=\"submit\" value=\"Neues Password speichern\" />\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&".SID."\">Zurück</a>\n";
echo "</p>\n";
?>
Und natürlich brauchen wir noch eine If-Abfrage, die das Password auch in die DB speichert.
<?php
if(isset($_POST['submit']) AND "Speichern" == $_POST['submit']) {
if(!preg_match('/^\w+$/', trim($_POST['name']))) {
echo "<p>\n";
echo " Bitte benutzen sie einen Name nur aus Alphanumerischen\n";
echo " Zeichen (Zahlen und Buchstaben).\n";
echo "</p>\n";
} else {
// ggf. eine Emailadresse überprüfung
// siehe dazu http://www.php-faq.de/ > Regex
$sql = "UPDATE
users
SET
Name = '".trim($_POST['name'])."',
Email = '".addslashes(trim($_POST['email']))."'
WHERE
ID = '".$_SESSION['ID']."';";
// bei Name kein addslashes(), da Name eh
// nur \w+ sein kann.
mysql_query($sql) OR die(mysql_error());
echo "<p>\n";
echo " Ihre Daten wurde gespeichert\n";
echo "</p>\n";
}
}
if(isset($_POST['submit']) AND "Neues Password speichern" == $_POST['submit']) {
if(trim($_POST['password']) == "") {
echo "<p class=\"error\">\n";
echo " Bitte geben sie ein Password ein, welches ich\n";
echo " auch Speichern soll.\n";
echo "</p>\n";
} elseif(trim($_POST['password']) != trim($_POST['password2'])) {
echo "<p class=\"error\">\n";
echo " Bitte geben sie 2 gleiche Passwörter ein\n";
echo "</p>\n";
} else {
$sql = "UPDATE
users
SET
Password = MD5('".trim($_POST['password'])."')
WHERE
ID = '".$_SESSION['ID']."';";
mysql_query($sql) OR die(mysql_error());
echo "<p>\n";
echo " Das Password wurde gespeichert. Sie brauchen sich nicht\n";
echo " neu einloggen.\n";
echo "</p>\n";
}
}
$sql = "SELECT
Name,
FROM
users
WHERE
ID = '".$_SESSION['ID']."';";
$result = mysql_query($sql) OR die(mysql_error());
$row = mysql_fetch_assoc($result);
echo "<form action=\"index.php?section=admin&site=self\" method=\"post\" class=\"formular\">\n";
echo " <p>\n";
echo " Eigene Daten bearbeiten\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\" value=\"".$row['Name']."\"/>\n";
echo " </li>\n";
echo " <li>\n";
echo " <label for=\"email\">Emailadresse</label>\n";
echo " <input type=\"text\" name=\"email\" id=\"email\" value=\"".$row['Email']."\"/>\n";
echo " </li>\n";
echo " <li>\n";
echo " <input type=\"submit\" name=\"submit\" value=\"Speichern\" />\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 "<form action=\"index.php?section=admin&site=self\" method=\"post\" class=\"formular\">\n";
echo " <p>\n";
echo " Neues Password erstellen\n";
echo " </p>\n";
echo " <ol>\n";
echo " <li>\n";
echo " <label for=\"password\">Neues Password</label>\n";
echo " <input type=\"password\" name=\"password\" id=\"password\" />\n";
echo " </li>\n";
echo " <li>\n";
echo " <label for=\"password2\">Bestätigung</label>\n";
echo " <input type=\"password\" name=\"password2\" id=\"password2\" />\n";
echo " </li>\n";
echo " <li>\n";
echo " <input type=\"submit\" name=\"submit\" value=\"Neues Password speichern\" />\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&".SID."\">Zurück</a>\n";
echo "</p>\n";
?>
Somit ist dieses Script fertig. Der User kann einmal sein Namen und/oder seine Emailadresse ändern und er kann ein neues Password setzen. Danach kann er wieder mit den Link zurück in den Adminbereich.
Fragen zum aktuellen Thema
- Was muss man bei Formularen und Sessions beachten
-
Je nach PHP Einstellung kann es sein, dass PHP automatisch ein hidden-Feld in die Formulare hinzufügt, in der die Session-ID ans nächste Script übertragen wird. Wenn PHP das nicht macht, muss man die Session-ID entweder über das Action-Attribut oder über ein manuel hinzugefügtes input-hidden Element übertragen.