- RobertKrah.de

Werbung
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
10 Formulardaten als Array übermitteln
Bisher sind von Formularen übergebene Werte mit dem Formularnamen angesprochen worden. Wenn zum Beispiel ein Textfeld im Formular zur Aufnahme des Vornamens eine Person dient, dann ist das Textfeld im HTML-Code so definiert worden:
Bitte Vornamen eingeben: <input type = "text" name="vorname">
Im PHP-Code wurde dann der Vorname mit einem vorangestellten $-Zeichen aufgerufen:
echo $vorname
Diese Methode gilt als nicht sicher genug. Sie setzt außerdem voraus, dass in der Konfigurationsdatei php.ini die folgende Einstellung gilt:
register_globals=on
Wenn PHP-Dateien zum Provider übertragen werden, haben wir keinen Einfluss auf die Einstellungen in der dort geltenden php.ini. Wenn dort der Eintrag gilt:
register_globals=off
Dann muss ein anderer Weg eingeschritten werden, um die Variablen anzusprechen. Über
den Aufruf der Funktion phpinfo() können Sie sich die beim Provider geltenden Einstellungen
anzeigen lassen.
Der weg, die Variablen aufzurufen, ist dann der folgende:
Im Formular wird die Methode der Übermittlung gewählt:
<form action ="25.php" method ="post">
Es ist zwar auch die Übertragung mit method="get" möglich, aber dann werden die Variablen
an den URL in der Adresszeile des Browsers angehängt, und jeder kann dort den Inhalt der
Variablen ablesen.
Wenn also die Übermittlung mit der Methode "post" erfolgt, dann sind alle Variablen in einem
Array mit dem Namen
$HTTP_POST_VARS
enthalten. Ab der PHP-Version 4.1 ist eine verkürzte Schreibweise möglich:
$POST
Das bedeutet: In der Definition des Formulars müssen keine Unterschiede gemacht werden.
Aber wenn die Werte, die das Formular aufnimmt, übermittelt werden und weiterverwendet
werden sollen, dann müssen sie aus dem Array aufgerufen werden. Im Beispiel von oben
soll dies gezeigt werden:
Statt echo $vorname müssen wir dann schreiben:
echo $http_POST_VARS["vorname"];
Aufgabe: Erstellen Sie zum Testen dieser Methode die Datei 29.php:
<html>
<!-- 29.php -->
<link rel="stylesheet" href="standard.css" type="text/css">
<head>
<title>Formular</title>
</head>
<body>
<h1>Ein Formular mit Array (professionelle Methode)</h1>
<body>
<pre>
<form action ="29.php" method ="post">
Ihr Name:
<input type = "text" name="name"></input><br>
Ihr Vorname: <input type = "text" name="vorname"></input><br>
Kundennummer:<input type = "text" name="knr"></input><br>
<input type="submit" name="senden" value="Daten senden"></input>
</form>
</pre>
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
<br><br>
<?php
echo $HTTP_POST_VARS["knr"];
echo $HTTP_POST_VARS["vorname"];
echo $HTTP_POST_VARS["name"];
?>
<br>
<a href="http://localhost/php.php">zurück zur Index-Seite</a>
</body>
</html>
Dies führt zu:
Wenn die Daten übertragen werden, dann ist die Ausgabe unten zu sehen:
Aufgabe: Die Ausgabe der Variablen soll jetzt mit Text und Leerzeichen verbunden werden.
Nach dem Anklicken des Daten Senden-Button soll sichtbar sein:
Dazu muss nur die Ausgabe-Zeile verändert werden. Achten Sie darauf, dass jetzt innerhalb
der eckigen Klammern einfache Hochkommata ' verwendet werden müssen, denn die echoAusgabe steht schon innerhalb von Anführungszeichen.
Aufgabe: Speichern Sie dazu die Datei mit dem Namen 30.php und ändern Sie:
echo "Ihre Daten sind: ".$HTTP_POST_VARS['knr']."
".$HTTP_POST_VARS['vorname']." ".$HTTP_POST_VARS['name'];
Aufgabe: Ändern Sie die Datei 30.php jetzt noch so, dass zwischen Vorname, Name und
Kundennummer bei der Ausgabe ein Zeilenwechsel stattfindet.
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
Die auf den vorigen Seiten erläuterte Methode soll jetzt noch verwendet werden, um auch
andere Formularelemente (Radiobuttons, Kontrollkästchen, Textarea- und Pulldown-Felder
mit PHP abzufragen.
Aufgabe: Erstellen sie die Datei 31.php . Die Datei soll die Daten an Datei 32.php senden.
Der HTML-Code zur Datei 31.php:
<html>
<!-- 31.php -->
<link rel="stylesheet" href="standard.css" type="text/css">
<head>
<title>Formularelemente</title>
</head>
<body>
<h1>Radiobuttons und Kontrollkästchen</h1>
<pre>
<form action ="32.php" method ="post">
Name:
<input type = "text" name="name"></input>
Vorname: <input type
= "text" name="vorname"></input><br>
<br>
<h2>Kreuzen Sie ihr Lieblings-Fastfood an:</h2>
(Mehrfachnennungen sind möglich)
<pre>
Currywurst mit Pommes <input type="Checkbox" name="pommes"><br>
Döner Kebab
<input type="Checkbox" name="doener"><br>
Pizza
<input type="Checkbox" name="pizza"><br>
Lasagne
<input type="Checkbox" name="lasagne"><br>
Nasi Goreng
<input type="Checkbox" name="nasi"><br>
<h2>Geben Sie ihr Alter an:</h2>
16 bis 25
<input type="Radio" name="alter" value="jung">
26-35
<input type="Radio" name="alter" value="mittel">
älter als 35 <input type="Radio" name="alter" value="alt"><br>
<input type="submit" name="senden" value="Daten senden"></input>
</form>
</pre>
<a href="http://localhost/php.php">zurück zur Index-Seite</a>
</body>
</html>
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
Hier sehen Sie noch einmal einen Ausschnitt abgebildet, um auf einen Unterschied besonders hinzuweisen:
Currywurst mit Pommes <input type="Checkbox" name="pommes"><br>
Döner Kebab
<input type="Checkbox" name="doener"><br>
....
<h2>Geben Sie ihr Alter an:</h2>
16 bis 25
<input type="Radio" name="alter" value="jung">
26-35
<input type="Radio" name="alter" value="mittel">
Bei den Kontrollkästchen können mehrere Optionen angeklickt werden, deshalb muss jedes
der Kontrollkästchen einen anderen Namen erhalten. Ansonsten wäre immer nur der zuletzt
angeklickte Inhalt in der Variablen.
Bei den Radiobuttons ist es genau entgegengesetzt so, dass der Name der unterschiedlichen Optionen gleich ist, denn hier kann ja nur eine Wahl getroffen werden.
Die Werte sollen in der Datei 32.php überprüft und wiedergegeben werden. [Später sollen
dann diese Beispiele noch einmal aufgegriffen werden, um die abgefragten Daten in eine
Datenbank einzutragen.]
Hier folgt die zunächst bewusst einfach gehaltene Datei 32.php, die die Auswahl des Users
aus der Datei 31.php wiedergibt.
32.php
<html>
<!-- 32.php -->
<link rel="stylesheet" href="standard.css" type="text/css">
<head>
<title>Formularelemente</title>
</head>
<body>
<h1>Radiobuttons und Kontrollkästchen</h1>
<pre>
<?php
echo "Zur Kontrolle der eingegebenen Daten:<br>";
echo "Vorname:
<b>".$HTTP_POST_VARS['vorname']."</b><br>";
echo "Name:
<b>".$HTTP_POST_VARS['name']."</b><br>";
echo "Ihr Lieblings-Fastfood:
<b>".$HTTP_POST_VARS['pommes'].$HTTP_POST_VARS['doener'].$HTTP_POST_VARS['p
izza'].$HTTP_POST_VARS['lasagne'].$HTTP_POST_VARS['nasi']."</b><br>";
echo "Ihre Altersgruppe: <b>".$HTTP_POST_VARS['alter']."<br></b>";
?>
<br>
</pre>
<a href="http://localhost/php.php">zurück zur Index-Seite</a>
</body>
</html>
Wenn beispielsweise zwei Gerichte angekreuzt wurden, dann werden sie hier einfach aneinandergehängt (pommespizza). Dazu war die lange echo-Zeile echo "Ihr LieblingsFastfood: .... erforderlich, denn es müssen alle Variablen durchgegangen werden. Eleganter
wäre es natürlich, dazu eine if-Abfrage zu machen, die prüft, ob der jeweilige Wert gesetzt
ist, und dann nur die ausgewählte anzeigt.
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
11 Content Management
Die Methode, Textdateien über PHP mit Inhalt zu füllen, diese bei Bedarf auszulesen und
den Inhalt der Variablen in einer HTML-Datei darzustellen, kann verwendet werden, um zu
zeigen, wie ein einfaches Content Management System (CMS) erstellt werden kann.
Eine gute Erläuterung dazu, was Content Management ist, findet sich in der FAQ einer
Newsgroup zu PHP, aus der hier zitiert wird1:
"Was ist ein Content Management System? Warum ist es nützlich?
Laut ContentManager ist ein Content Management System ein "Softwaresystem für das Administrieren von Webinhalten mit Unterstützung des Erstellungsprozesses basierend auf der
Trennung von Inhalten und Struktur".
Bei sehr vielen Websites kommt es nicht darauf an, dass man besonders tolle PHPApplikationen erstellt. Viel wichtiger ist, dass man das Tagesgeschäft erledigen kann, ohne
durch fehlerhafte Programme, umständliche Bedienungen, Heranziehen von Softwareentwicklern vom normalen Ablauf gestört zu werden. Ein CMS unterstützt dieses Vorhaben,
indem es eine Website in mehrere Bereiche aufteilt und über eine (meist webbasierte) Oberfläche den einzelnen Mitarbeitern zugänglich macht.
Das ermöglicht es auch nicht mit HTML versierten Mitarbeitern, Inhalte der Website zu pflegen. Den Rest, also die Integration des Inhalts in die Struktur, erledigt das CMS. Ein anderer
Mitarbeiter, der zum Beispiel in HTML sehr fit ist, wird Zugriff auf das Layoutmodul des CMS
haben und dort sogenannte HTML-Templates pflegen. In vielen CMSen sind diese Templates normaler HTML-Code, bei dem durch Schlüsselwörter definiert wird, an welcher Stelle
welcher Inhalt gesetzt werden soll.
Sehr nützlich bei einem CMS sind auch noch die verschiedenen Zugriffsrechte für einzelne
Benutzer(gruppen). Das macht eine Kontrolle möglich, zum Beispiel, dass die Sekretärin nur
im Inhaltsbereich Daten eingeben darf, aber keinen Zugriff auf das Layoutmodul des CMS
hat.
Der Nutzer, der die Website oder Teile davon pflegt, kommt also gar nicht mehr in Kontakt
mit z.B. FTP-Programmen. Scheinbar komplizierte Technik wird in eine übersichtliche Oberfläche verpackt, damit auch weniger versierte Nutzer die Inhalte pflegen können. Module wie
zum Beispiel Mediendatenbanken, die Bilder, Sounds, Dateien etc. verwalten, machen eine
Pflege selbst komplexer Sites zum Kinderspiel."
Aufgabe: Erstellen Sie zunächst eine Textdatei namens inhalt.txt im Verzeichnis, in dem
auch die php-Dateien liegen. Der Inhalt dieser Textdatei soll ausgelesen und als
Überschrift auf der Datei 33.php angezeigt werden.
Die Datei 33.php wird den Inhalt der Textdatei als H1-Überschrift zeigen:
1
Björn Schotte, in: http://www.dclp-faq.de
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
Aufgabe: Erstellen Sie die Datei 33.php
<html>
<head>
<!-- 33.php -->
<link rel="stylesheet" href="standard.css" type="text/css">
<title>Content Management</title>
</head>
<body>
<?php
//Inhalt-Datei laden...
$datei = fopen("inhalt.txt","r");
$dateigroesse=filesize("inhalt.txt");
$neu = fread($datei, $dateigroesse);
fclose($datei);
echo "<h1>$neu</h1>";
?
<br><br>
<a href="http://localhost/phptest/34.php">zur geheimen AdminSeite</a><br><br>
<a href="http://localhost/php.php">zurück zur Index-Seite</a>
</body>
</html>
Der Link "Zur geheimen Admin-Seite" muss natürlich später noch durch ein Passwort geschützt werden. Zunächst erstellen wir aber die Admin-Datei, die es ermöglichen soll, den
Inhalt der Überschrift neu zu definieren:
Ein Textfeld mit name="in" nimmt die neue Überschrift auf. Dann beginnt der PHP-Code:
Hier wird die Textdatei inhalt.txt geladen, und anschließend wird die im Textfeld aufgenommeine neue Überschrift in die Textdatei geschrieben.
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
Der Code für die Datei 34.php enthält im Grunde nur die schon bekannten Elemente:
34.php
<html>
<head>
<!-- 34.php -->
<link rel="stylesheet" href="standard.css" type="text/css">
<title>Content Management</title>
</head>
<body>
<h1>Text in Variable eingeben</h1>
<form action ="34.php" method ="post">
Neuen Inhalt für die Überschrift eingeben: <input type="Text" name="in"
size="50"><br>
<input type="submit" value="Aktualisieren" name="OK"><br>
</form>
<?php
//Inhalt-Datei laden...
$datei = fopen("inhalt.txt","r");
$dateigroesse=filesize("inhalt.txt");
$neu = fread($datei, $dateigroesse);
fclose($datei);
//Anzeige der Überschrift zur Kontrolle
echo "<h1>$in</h1>";
// Jetzt Inhalt-Datei aktualisieren:
$datei= fopen("inhalt.txt","w");
$output = fwrite($datei,$in);
fclose($datei);
?>
<a href="http://localhost/php.php">zurück zur Index-Seite</a>
</body>
</html>
Die nächste Verbesserung soll darin bestehen, nicht in einem separaten Textfeld den neuen
Inhalt einzugeben, sondern direkt in der Überschrift zu schreiben.
Dies soll durch die Dateien 35.php und 36.php geschehen.
Aufgabe: Erstellen Sie zunächst die Datei 35.php als Kopie der Datei 33.php (einfach die
33.php mit dem Namen 35.php zusätzlich speichern – der Grund besteht darin,
die beiden Dateipaare getrennt zu halten)
Die dann neu zu erstellende Datei
36.php bietet dann die zunächst leere
Überschrift an. Der Cursor ist (leider!)
erst dann zu sehen, wenn man hineinklickt.
Der Trick besteht a) darin, eine CSS-Anweisung in der der Datei selbst zu verwenden, die
dem Textfeld sagt, dass es keinen Rand haben soll:
style="border: 0px"
Zweistens wird das <hr> ....</h1> -tag um das Textfeld herum gelegt, so dass das Textfeld
als Überschrift erscheint:
<h1><input type="Text" name="in" size="100" style="border: 0px" ></h1
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
Der komplette Code der 36.php nur der Vollständigkeit halber, die Elemente dazu sind bekannt:
<html>
<head>
<!-- 36.php -->
<link rel="stylesheet" href="standard.css" type="text/css">
<title>Content Management</title>
</head>
<body>
<form action ="36.php" method ="post">
<h1><input type="Text" name="in" size="100" style="border: 0px"
></h1><br>Neuen Inhalt direkt in die Überschrift eingeben! <br>
<input type="submit" value="Aktualisieren" name="OK"><br>
</form>
<?php
//Inhalt-Datei laden...
$datei = fopen("inhalt.txt","r");
$dateigroesse=filesize("inhalt.txt");
$neu = fread($datei, $dateigroesse);
fclose($datei);
// Jetzt Variable durch Formularinhalt füllen
$neu=$in;
//Anzeige der Überschrift zur Kontrolle
echo "<h1>$in</h1>";
// Jetzt Inhalt-Datei aktualisieren:
$datei= fopen("inhalt.txt","w");
$output = fwrite($datei,$neu);
fclose($datei);
?>
<a href="http://localhost/php.php">zurück zur Index-Seite</a>
</body>
</html>
11.1 Vorherigen Inhalt zum Ändern anbieten
Gerade bei längerem Text wird es vorkommen, dass etwas nicht komplett neu geschrieben
wird, sondern nur geändert werden. Anders als beim Beispiel vorher soll also jetzt in einem
Eingabefeld auch der vorige Inhalt gezeigt und zur Ergänzung/Änderung angeboten werden.
Wenn ein mehrzeiliges Eingabefeld mit dem tag <textarea> verwendet wird, dann ist die
HTML-Syntax zum Beispiel so:
<textarea name="test" rows=5 cols=50> </textarea>
Wenn schon eine Vorbelegung mit Text erfolgen soll, dann ist die Syntax die folgende:
<textarea name="test" rows=5 cols=50> Hier steht etwas, was noch ergänzt werden soll oder verändert werden kann </textarea>
Das führt dann zu solch einem mehrzeiligem Textfeld:
Um zu erreichen, dass der vorher in der Textdatei gespeicherte Inhalt in das Textarea-Feld
kommt, muss jetzt an der Stelle, an der der Text sonst steht, PHP-Code stehen. Vorher wird
aus der Datei wie zuvor gelesen, damit der Text als PHP-Variable zur Verfügung steht.
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
Aufgabe: Erstellen Sie zunächst eine zusätzliche Textdatei mit dem Namen text.txt. In dieser Datei soll der Inhalt für ein mehrzeiliges Textfeld stehen.
Wenn vorher der Inhalt einer solchen Textdatei gelesen wurde und in einer Variablen $text
zur Verfügung steht, dann sieht der eingebettete PHP-Code innerhalb des Textarea-Feldes
so aus:
<textarea name="textfeld" cols="60" rows="10">
<?php
echo $text
?>
</textarea>
Bei einzeiligen Textfeldern, also solchen, die wir für die Überschrift verwendet haben, sieht
die Syntax etwas anders aus:
<input name="beispiel" size=40 value="Das steht schon da">
Der vorbelegte Text muss innerhalb der Anführungszeichen von value stehen. Dann ist hier
der PHP-Code darin zum Beispiel der:
<form action ="37.php" method ="post">
<h1><input type="Text" name="in" size="100" style="border: 0px" value = "
<?php
echo $neu
?>"
>
</input></h1>
Wie bei den Beispielen vorher soll ein zweier-Set von Dateien programmiert werden, die Datei 37.php und die Admin-Datei 38.php , in der die Änderungen gemacht werden.
Zunächst zur Datei 37.php: Sie soll so aussehen (siehe Abb.)
Der Code für die 37.php:
<html>
<head>
<!-- 37.php -->
<link rel="stylesheet" href="standard.css" type="text/css">
<title>Content Management</title>
</head>
<body>
<?php
//Überschrift-Datei laden...
$datei = fopen("inhalt.txt","r");
$dateigroesse=filesize("inhalt.txt");
$neu = fread($datei, $dateigroesse);
fclose($datei);
//Textfeld-Datei laden...
$datei = fopen("text.txt","r");
$dateigroesse=filesize("text.txt");
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
$text = fread($datei, $dateigroesse);
fclose($datei);
echo "<h1>$neu</h1><br><br>";
echo $text;
?><br><br>
<a href="http://localhost/phptest/38.php">zur geheimen AdminSeite</a><br><br>
<a href="http://localhost/php.php">zurück zur Index-Seite</a>
</body>
</html>
Wenn Sie dem Link zur Admin-Datei folgen, dann sehen Sie auf dem Monitor:
Der PHP-Code zur Datei 38.php:
<html>
<head>
<!-- 38.php -->
<link rel="stylesheet" href="standard.css" type="text/css">
<title>Content Management</title>
</head>
<body>
<?php
//Überschrift-Datei laden...
$datei = fopen("inhalt.txt","r");
$dateigroesse=filesize("inhalt.txt");
$neu = fread($datei, $dateigroesse);
fclose($datei);
//Textfeld-Datei laden...
$datei = fopen("text.txt","r");
$dateigroesse=filesize("text.txt");
$text = fread($datei, $dateigroesse);
fclose($datei);
?>
<form action ="38.php" method ="post">
<h1><input type="Text" name="in" size="100" style="border: 0px" value = "
<?php
echo $neu
?>"
>
</input></h1>
Neuen Inhalt direkt in die Überschrift eingeben!
<textarea name="textfeld" cols="60" rows="10">
<?php
echo $text
?>
<br>
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
</textarea>
<input type="submit" value="Aktualisieren" name="OK"></form>
<br>
<?php
// Jetzt Variablen durch Formularinhalt füllen
$neu=$in;
$textneu=$textfeld;
// Jetzt Überschrift-Datei aktualisieren:
$datei= fopen("inhalt.txt","w");
$output = fwrite($datei,$neu);
fclose($datei);
// Jetzt Textfeld-Datei aktualisieren:
$datei= fopen("text.txt","w");
$output = fwrite($datei,$textneu);
fclose($datei);
//Zur Kontrolle noch mal anzeigen:
echo "<h1>$neu</h1><br><br>";
echo $textneu;
?>
<a href="http://localhost/php.php">zurück zur Index-Seite</a>
</body></html>
11.2 PHP-Dateien einbinden
Beim Erstellen der vorigen Dateien ist Ihnen sicher aufgefallen, dass dieselben Module immer wieder verwendet werden (an den Stellen, wo die Textdateien geöffnet und geschrieben
werden). Deshalb ist es sinnvoll, diese in separate PHP-Dateien auszulagern.
Wie bei den Beispielen vorher soll ein zweier-Set von Dateien programmiert werden, die Datei 39.php und die Admin-Datei 40.php , in der die Änderungen gemacht werden. Die vorige
Datei 37.php wird als 39.php gespeichert, die Datei 38.php als 40.php.
Aufgabe: Kopieren Sie aus der Datei 40.php den nachfolgend abgebildeten Code. Speichern Sie dann die Zeilen mit dem Namen lade.php
<?php
// lade.php Überschrift-Datei laden...
$datei = fopen("inhalt.txt","r");
$dateigroesse=filesize("inhalt.txt");
$neu = fread($datei, $dateigroesse);
fclose($datei);
//Textfeld-Datei laden...
$datei = fopen("text.txt","r");
$dateigroesse=filesize("text.txt");
$text = fread($datei, $dateigroesse);
fclose($datei);
?>
Aufgabe: Verfahren Sie entsprechend und speichern den Inhalt in die Datei schreibe.php
<?php
// schreibe.php Überschrift-Datei aktualisieren:
$datei= fopen("inhalt.txt","w");
$output = fwrite($datei,$neu);
fclose($datei);
// Jetzt Textfeld-Datei aktualisieren:
$datei= fopen("text.txt","w");
$output = fwrite($datei,$textneu);
fclose($datei);
?>
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
Jetzt werden die PHP-Zeilen, die jetzt als lade.php und schreibe.php vorliegen, in den beiden
Dateien 39.php und 40.php entfernt und durch den include-Befehl ersetzt:
include("lade.php");
bzw.
include("schreibe.php");
Achten Sie bitte darauf, dass Sie sich jeweils im PHP-Teil der Datei befinden bzw andernfalls
PHP erst eröffnen müssen.
12 Passwortschutz einrichten
Bisher ist an den Stellen, an denen der Link "Zur geheimen Admin-Seite" steht, noch keine
Kontrolle erfolgt, ob die Berechtigung zum Ändern der Seite vorliegt. Wir können über PHP
einen Passwortschutz einrichten, auf die Art, dass die Passwörter in die PHP-Datei geschrieben werden; der Quelltext wird bekanntlich nicht im Browser angezeigt. Ein Schwachpunkt wird hier noch sein, dass zu einer Datei weitergeleitet wird, die einen Namen hat, die
keiner erraten kann, denn sonst könnte die PHP-Datei ja direkt aufgerufen werden. Das ist
hier zunächst der Grund, warum wir nicht die Datei 42.php (als geänderte Fassung von
40.php) nehmen, denn sonst wäre der Einwand zu Recht, dass man ja die Adresse direkt
aufrufen könnte. Allerdings hat dieser Passwortschutz auch noch Schwachstellen; wer den
Verlauf des Browsers überprüft, kann feststellen, welche PHP-Datei aufgerufen wurde.
Ein noch sicherer Schutz kann erreicht werden, wenn wir über den Apache-Server über eine
.htaccess-Datei den Zugang zu ganzen Ordnern auf dem Server schützen.
Zunächst gehen wir so vor:
1. Die Datei 39.php wird mit dem Namen 41.php gespeichert
2. Die Datei 40.php wird mit dem Namen geheim_keiner_weiss_es.php gespeichert
3. Aus der Datei 41.php wird zunächst eine neue Datei zugang.html aufgerufen, die
ein Formular mit den Feldern für Benutzername und Passwort enthält2. Diese Datei
ruft die PHP-Datei check.php auf.
(Ich verwende dabei: Benutzername: phptest, Passwort: bfw)
4. Wenn die Eingaben dort korrekt waren, erfolgt die Weiterleitung zur Datei
geheim_keiner_weiss_es.php
Hier zunächst die geänderte 41.php
<html>
<head>
<!-- 41.php -->
<link rel="stylesheet" href="standard.css" type="text/css">
<title>Content Management</title>
</head>
<body>
<?php
include("lade.php");
echo "<h1>$neu</h1><br><br>";
echo $text;
?><br><br>
<a href="http://localhost/phptest/zugang.html">zur geheimen AdminSeite</a><br><br>
<a href="http://localhost/php.php">zurück zur Index-Seite</a>
</body>
</html>
Die Datei zugang.html enthält das Login-Formular:
<html>
<!-- zugang.html -->
2
Ich folge hier weitgehend dem Buch von Seeboerger-Weichselbaum, PHP Webseiten dynamisch programmieren, S. 78 ff
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
<link rel="stylesheet" href="standard.css" type="text/css">
<head>
<title>Login-Prozedur</title></head>
<body>
<p>Bitte einloggen:</p><br>
<form name="Eingabe" action="check.php" method="post">
Benutzername: <br>
<input type="text" name="benutzer" size="20"><br>
Passwort:<br>
<input type="password" name="pass" size="20"><br><br>
<input type="submit" value="Login">
<input type="reset" value="Reset">
</form>
</body></html>
Sie leitet die Eingaben weiter an die Datei check.php:
<html>
<!-- check.php -->
<link rel="stylesheet" href="standard.css" type="text/css">
<body>
<?php
$benutzer=$HTTP_POST_VARS['benutzer'];
$pass=$HTTP_POST_VARS['pass'];
if ($benutzer=="phptest") {
if ($pass=="bfw") {
print ("<b>Login korrekt</b>");
print ("<p>Klicken Sie hier zum Zugang:</p>");
print ("<a href='geheim_keiner_weiss_es.php'>Admin-Bereich</a>");
}
else {
print ("Benutzername korrekt, Passwort NICHT KORREKT!<br><br>");
print ("<a href='zugang.html'>Noch ein Versuch...</a>");
}
}
else {
print ("Benutzername NICHT KORREKT!<br><br>");
print ("<a href='zugang.html'>Noch ein Versuch...</a>");
}
?>
</body>
</html>
Hier steht zwar Name und Passwort im Klartext, aber der Code wird ja nicht angezeigt.
Die Datei geheim_keiner_weiss_es.php bietet eigentlich nichts Neues und wird nur der
Vollständigkeit halber noch einmal gezeigt:
<html>
<head>
<!-- geheim_keiner_weiss_es.php -->
<link rel="stylesheet" href="standard.css" type="text/css">
<title>Content Management</title>
</head>
<body>
<?php
include("lade.php");
?>
<form action ="geheim_keiner_weiss_es.php" method ="post">
<h1><input type="Text" name="in" size="100" style="border: 0px" value = "
<?php
echo $neu
?>"
>
</input></h1>
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
Neuen Inhalt direkt in die Überschrift eingeben! <br>
<textarea name="textfeld" cols="60" rows="10">
<?php
echo $text
?>
</textarea>
<input type="submit" value="Aktualisieren" name="OK"></form>
<br>
<?php
// Jetzt Variablen durch Formularinhalt füllen
$neu=$in;
$textneu=$textfeld;
include("schreibe.php");
//Zur Kontrolle noch mal anzeigen:
echo "<h1>$neu</h1><br><br>";
echo $textneu;
?>
<a href="http://localhost/php.php">zurück zur Index-Seite</a>
</body></html>
Aufgabe: Erstellen Sie ein CMS, mit dem diese HTML-Datei ausgegeben werden kann. In
den Textfeldern sind die Variablen angegeben, mit denen der Inhalt ausgegeben
werden soll.
h1
text1
text2
text3
info
(soll als Marquee-Laufschrift formatiert sein)
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
Die Datei 43.php ergibt die Ausgabe auf der vorigen Seite:
<html>
<head>
<!-- 43.php -->
<link rel="stylesheet" href="standard.css" type="text/css">
<title>IT-Consult</title>
</head>
<body>
<?php
include("lade_alles.php");
echo
echo
echo
echo
"<h1>$h1</h1><br>";
"$text1</p><br><br>";
"$text2<br><br>";
"$text3<br><br>";
echo "$info<br><br>";
echo "<marquee>$marquee</marquee>"
?><br><br>
<a href="http://localhost/phptest/44.php"><font size="-2">AdminBereich</font></a><br><br>
<a href="http://localhost/php.php">zurück zur Index-Seite</a>
</body>
</html>
Die Datei lade_alles.php lädt die einzelnen Textdateien:
<?php
//h1-Datei laden...
$datei = fopen("h1.txt","r");
$dateigroesse=filesize("h1.txt");
$h1 = fread($datei, $dateigroesse);
fclose($datei);
//text1-Datei laden...
$datei = fopen("text1.txt","r");
$dateigroesse=filesize("text1.txt");
$text1 = fread($datei, $dateigroesse);
fclose($datei);
//text2-Datei laden...
$datei = fopen("text2.txt","r");
$dateigroesse=filesize("text2.txt");
$text2 = fread($datei, $dateigroesse);
fclose($datei);
//text3-Datei laden...
$datei = fopen("text3.txt","r");
$dateigroesse=filesize("text3.txt");
$text3 = fread($datei, $dateigroesse);
fclose($datei);
//info-Datei laden...
$datei = fopen("info.txt","r");
$dateigroesse=filesize("info.txt");
$info = fread($datei, $dateigroesse);
fclose($datei);
//marquee-Datei laden...
$datei = fopen("marquee.txt","r");
$dateigroesse=filesize("marquee.txt");
$marquee = fread($datei, $dateigroesse);
fclose($datei);
?>
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
Die 44.php soll so auf dem Monitor erscheinen:
Der Code zu Datei 44.php
<html>
<head>
<!-- 44.php -->
<link rel="stylesheet" href="standard.css" type="text/css">
<title>Content Management</title>
</head>
<body>
<?php
include("lade_alles.php");
?>
<form action ="44.php" method ="post">
Neuen Inhalt direkt in die Überschrift eingeben! <br>
<h1><input type="Text" name="h1x" size="100" style="border: 0px" value = "
<?php
echo $h1;
?>"
>
<br>
</input></h1>
<br>
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
<textarea name="text1x" cols="60" rows="5">
<?php
echo $text1;
?>
</textarea><br>
<textarea name="text2x" cols="60" rows="2">
<?php
echo $text2;
?>
</textarea><br>
<textarea name="text3x" cols="60" rows="5">
<?php
echo $text3;
?>
</textarea><br>
<textarea name="infox" cols="60" rows="5">
<?php
echo $info;
?>
</textarea><br>
<input type="Text" name="marqueex" size="60" value = "
<?php
echo $marquee;
?>"
><br>
<input type="submit" value="Aktualisieren" name="OK"></form>
</a>
<br>
<?php
//Variablen wieder neu belegen
$h1=$h1x;
$text1=$text1x;
$text2=$text2x;
$text3=$text3x;
$info=$infox;
$marquee=$marqueex;
include("schreibe_alles.php");
?>
<a href="http://localhost/php.php">zurück zur Index-Seite</a>
</body></html>
Hier wird außerdem noch die Datei schreibe_alles.php gebraucht:
<?php
// h1-Datei aktualisieren:
$datei= fopen("h1.txt","w");
$output = fwrite($datei,$h1);
fclose($datei);
// text1-Datei aktualisieren:
$datei= fopen("text1.txt","w");
$output = fwrite($datei,$text1);
fclose($datei);
// text2-Datei aktualisieren:
$datei= fopen("text2.txt","w");
$output = fwrite($datei,$text2);
fclose($datei);
// text3-Datei aktualisieren:
$datei= fopen("text3.txt","w");
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
$output = fwrite($datei,$text3);
fclose($datei);
// info-Datei aktualisieren:
$datei= fopen("info.txt","w");
$output = fwrite($datei,$info);
fclose($datei);
// marquee-Datei aktualisieren:
$datei= fopen("marquee.txt","w");
$output = fwrite($datei,$marquee);
fclose($datei);
?>
Aufgabe: Es ist erforderlich, Sonderzeichen und Zeilenumbrüche zu konvertieren. Fügen
Sie deshalb noch folgende Zeilen ein (bevor PHP mit ?> geschlossen wird):
// Jetzt die Sonderzeichen und Umlaute konvertieren:
$h1=htmlspecialchars ($h1);
$text1=htmlspecialchars ($text1);
$text2=htmlspecialchars ($text2);
$text3=htmlspecialchars ($text3);
$info=htmlspecialchars ($info);
$marquee=htmlspecialchars ($marquee);
// Umbrüche in <br> konvertieren
$text1=nl2br($text1);
$text2=nl2br($text2);
$text3=nl2br($text3);
$info=nl2br($info);
?><br><br>
Aufgabe: Mit Hilfe von CSS-Anweisungen in der Datei standard.css soll die Datei jetzt noch
formatiert werden. Sie könnte z. B. so aussehen:
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
Aufgabe: Speichern Sie dazu die Dateien 43.php mit dem Namen 45.php und die Datei
44.php mit dem Namen 46.php.
Hier der Code für die 45.php, in der mit CSS-Klassen die Formatierung erreicht wird:
<html>
<head>
<!-- 45.php -->
<link rel="stylesheet" href="standard.css" type="text/css">
<title>IT-Consult</title>
</head>
<body>
<table width="800">
<tr>
<td align="left"><?php
include("lade_alles.php");
echo
echo
echo
echo
"<h1>$h1</h1><br>";
"<p class='text1'>$text1</p><br>";
"<p class='text2'>$text2</p><br>";
"<p class='text3'>$text3</p><br>";
echo "<p class='info'>$info<br></p><br>";
echo "<p class='marquee'><marquee>$marquee</marquee></p>"
?><br>
<a href="http://localhost/phptest/46.php"><font size="-2">AdminBereich</font></a><br><br>
<a href="http://localhost/php.php">zurück zur Index-Seite</a> </td>
</tr>
</table>
</body>
</html>
Dies sind die Stil-Anweisungen für die Bereiche text1, text2 usw. Sie müssen in der Datei
standard.css vorgenommen werden.
Ändern Sie nach Belieben ab:
.text1 {
font-family: Arial;
font-size: 12 pt;
border-style: dotted;
border-width: 2px;
border-color: #ff9900;
padding: 5px;
background-color: #CEEBFB;
}
.text2 {
font-family: Arial;
font-size: 11 pt;
border-color: #ff9900;
padding: 5px;
background-color: #CEEBFB;
}
.text3 {
font-family: Arial;
font-style: bold;
font-size: 13 pt;
border-style: dotted;
border-width: 2px;
border-color: #ff9900;
padding: 5px;
background-color: #CEEBFB;
}
.info {
font-family: Arial;
MySQL, PHP und HTML
Dynamische Website mit Datenbankanbindung
font-size: 11 pt;
border-style: dotted;
border-width: 2px;
border-color: #ff9900;
padding: 5px;
background-color: #FFEA95;
}
.marquee {
font-family: Arial;
font-size: 12 pt;
border-style: dotted;
border-width: 2px;
border-color: #ff9900;
padding: 5px;
background-color: #FFEA95;
}
In der Datei 46.php muss zunächst nur die form action-Zeile geändert werden:
<form action ="46.php" method ="post">
Aufgabe: Programmieren Sie noch einen Passwortschutz für die Datei, so dass sie nur von
autorisierten Nutzern geändert werden darf.
Herunterladen