Um Daten aus einem Formular an den Server zu ü,bermitteln, setzen wir post
ein.
Damit werden die Daten unsichtbar übergeben. Sollten Sie ein Passwort-Feld einsetzen, können
Sie das input
-Feld mit type="passwort
deklarieren, damit neugierige
Zeitgenossen keine Change haben, dem User beim eintippen den Passwortes zuzuschauen. Damit wären wir
schon bei einem Kennwortschutz für Webseiten.
Kennwortschutz für Webseiten
Zuerst schreiben Sie eine Login-Datei, die wie folgt aussehen könnte:
<html>
<head>
<title>Login</title>
</head>
<body>
<form method="post" action="geheim.php">
Username: <input name="name" type="text"><br>
Kennwort: <input name="pass" type="password"><br>
<input type="submit" value="Login">
</form>
</body>
</html>
Nach Wahl des Login-Button wird die Datei geheim.php
aufgerufen. In dieser Datei
lesen wir zuerst die übermittelte Daten mit $_POST
ein. und überprüfen
die Eingabe auf richtigkeit.
<?php
$user = $_POST['name'];
$pass = $_POST['pass'];
$okuser = "Anwender" ;
$okpass = "Passwort" ;
if ($user == $okuser && $pass == $okpass) {
echo "Korrekte Eingabe" ;
} else {
echo "Falsche Eingabe" ;
}
?>
Dieses hat allerdings ein Sicherheitsrisiko. Fällt auf den Webserver mal der PHP-Interpreter aus, wird
diese Datei im Quelltext angezeigt. Dieses wird mit hoher wahrscheinligkeit nicht vorkommen, aber hundertprozentig
Sicher kann man nicht sein. Daher sollten Sie die Passwortdaten in einer externen Datei einbinden, und mit
include
einbinden. Um diese Datei zusätzlich zu schützen, nennen Sie die Datei so,
das diese mit einer Raute beginnt, z.B. #zugang.php
. Ruft man diese Datei jetzt über
den Browser auf, interpretiert er diese als Sprungmarke, und kann nicht aufgerufen werden. In dieser Datei
können Sie dann die Zugangsdaten speichern.
Einen besseren Schutz erhalten Sie, wenn Sie diese Datei in einem anderen Ordner legen, der durch
.htaccess geschützt ist.
<?php
$okuser = "Anwender" ;
$okpass = "Passwort" ;
?>
Unsere geheim.php sieht jetzt so aus:
<html>
<head>
<title>Login</title>
</head>
<body>
<?php
include "#zugang.php" ;
$user = $_POST['name'];
$pass = $_POST['pass'];
if ($user == $okuser && $pass == $okpass) {
include "#anzeige.php" ;
} else {
echo "Falsche Eingabe" ;
}
?>
</body>
</html>
Wird das Kennwort richtig eingegeben, wird der Inhalt von #anzeige.php angezeigt, ansonsten ist nur
falsche Eingabe zu sehen. Anzeigebeispiel.
Kontaktformular
Wenn Sie Ihren Besuchern die Möglichkeit bieten möchen, Kontakt per eMail über ein Kontakt-Formular
aufzunehmen, kann mit einen einfachen Script erledigen. Allerdings gibt es dabei ein kleines Problem. Einige
Free-Webspace-Anbieter haben die Mail-Funktion deaktiviert.
Zuerst legen Sie wieder eine Formular an, das in der Regel nur 3 Felder braucht. Den Namen und die Mail-Adresse
des Absenders sowie die Nachricht.
<html>
<head>
<title>Kontakt-Formular</title>
<style type="text/css">
* {
font-family: Arial, Helvetica, sans-serif;
}
body {
background-color: #eeeeff;
margin: 20px;
}
td {
vertical-align: top;
text-align : left;
}
h2 {
font-size: 20px;
}
</style>
</head>
<body>
<h2>Kontakt-Formular</h2>
<form method="post" action="versand.php">
<table>
<tr><td>Ihr Name:</td>
<td><input name="name" type="text" size="54"></td></tr>
<tr><td>Ihre Mailadresse:</td>
<td><input name="mail" type="text" size="54"></td></tr>
<tr><td>Ihre Nachricht:</td>
<td><textarea name="text" rows="10" cols="52"></textarea></td></tr>
</table>
<br>
<input type="submit" value="Versenden">
</form>
</body>
</html>
Diese Datei speichern wir dann ab z.b. unter "kontakt.html". Durch drücken des Buttons
"Versenden" wird die PHP-Datei "versand.php" aufgerufen, in der wir zuerst kontrollieren,
ob alle drei Felder ausgefüllt sind.
<?php
$fehler = "";
$name = $_POST['name'];
$mail = $_POST['mail'];
$text = $_POST['text'];
if (empty($name)) {
$fehler .= "<li>der Absendername fehlt</li>" ;
}
if (empty($mail)) {
$fehler .= "<li>die Mailadresse fehlt</li>" ;
}
if (empty($text)) {
$fehler .= "<li>keine Nachricht eingetragen</li>" ;
}
?>
Ist die Variable $fehler leer, können wir das Formular nun mit der mail()
-Funktion
versenden. Dabei wird in der Reihenfolge die Mail-Adresse des Empfängers, Betreffzeile und Mitteilung
angegeben. Zusätzlich kann noch die Absender-Adresse angegeben werden. Fehlt diese Angabe, wird
standartmäßig die Adresse me@localhost
eingetragen. Dabei darf From:
nicht vergessen werden.
mail("empfaenger@domain.de","Betreff","Mitteilung","From: Absender");
Die Absender-Daten geben Sie am besten so an, das Sie sofort erkennen, dass das Mail von Ihrem
Kontaktformular kommt, und den Absender aus dem Formular packen Sie in die Nachricht. Nun können
Sie für ein Zeilenumbruch natürlich nicht das <br>-Element nehmen, sondern müssen den
ASCII-Codes 13 und 10 einsetzen. Dafür benutzen wir die chr()
-Funktion.
<?php
if (empty($fehler)) {
$return = chr(13).chr(10);
$an = "adresse@domain.de" ;
$betreff = "Mein Kontaktformular" ;
$von = "From: Kontaktformular <null@MeineHTML.de>" ;
$datum = "Datum: ".date("j.n.Y").$return;
$zeit = "Zeit: ".date("H:i").$return;
$abs = "Von: ".$name." <".$mail.">".$return;
$trennen = "-----------------------------------------------".$return;
$nachricht = $datum.$zeit.$abs.$trennen.$text;
mail($an,$betreff,$nachricht,$von);
}
?>
Die Nachricht kommt dann so in Ihre Mailbox an:
Nun kann es sein, dass mit get
oder post
eine Variable mit Anführungszeichen
" oder Hochkomma ' übergeben wird, und von PHP automatisch maskiert, also mit einem Backslash \
versehen wird. Diese Besonderheit von PHP nennt man "Magic Quotes". Um festzustellen, ob Magic Quotes
aktiviertist, gibt es die Funktion get_magic_quotes_gpc()
und kann mit if
abgefragt
werden. Mit stripslashes()
können Sie dann diese Backslash´s löschen
if (get_magic_quotes_gpc()) {
$text = stripslashes($text);
Als nächstes soll die versendete Nachricht auf den Bildschirm angezeigt werden. Dazu müssen
zunächst alle evtl. HTML und PHP-Code aus der Nachricht entfernt werden, denn ansonsten kann dies zu
einen Absturz des Browsers oder zu unvorherbaren Darstellung kommen. Dazu wird die strip_tags()
-Funktion
eingesetzt. Der zweite Schritt ist die Umwandlung der Sonderzeichen mit der htmlentities()
.
Zu guter letzt müssen wir den Zeilenumbruch von chr(13)chr(10) wieder in dein <br>
mit der Funktion str_replace()
umwandeln. Außerdem fehlt noch die Ausgabe, falls ein Feld
nicht ausgefüllt wurde, d.h. der String $fehler nicht leer ist.
<?php
if (empty($fehler)) {
$return = chr(13).chr(10);
$nachricht = strip_tags($nachricht);
$nachricht = htmlentities($nachricht);
$nachricht = str_replace($return,"<br>",$nachricht);
echo "<p>Ihre Nachricht wurde versendet.</p>" ;
echo "<p>$nachricht</p>" ;
} else {
echo "<p>Ihre Nachricht wurde nicht gesendet, weil</p>" ;
echo "<ul>$fehler</ul>" ;
}
?>
Dieses setzen wir jetzt alles zusammen und Speichern dies wie ober bereits erwähnt unter versand.php
ab:
<?php
$fehler = "";
$name = $_POST['name'];
$mail = $_POST['mail'];
$text = $_POST['text'];
if (empty($name)) {
$fehler .= "<li>der Absendername fehlt</li>" ;
}
if (empty($mail)) {
$fehler .= "<li>die Mailadresse fehlt</li>" ;
}
if (empty($text)) {
$fehler .= "<li>keine Nachricht eingetragen</li>" ;
}
if (empty($fehler)) {
if (get_magic_quotes_gpc()) {
$text = stripslashes($text);
}
$return = chr(13).chr(10);
$an = "adresse@domain.de" ;
$betreff = "Mein Kontaktformular" ;
$von = "From: Kontaktformular <null@MeineHTML.de>" ;
$datum = "Datum: ".date("j.n.Y").$return;
$zeit = "Zeit: ".date("H:i").$return;
$abs = "Von: ".$name." <".$mail.">".$return;
$trennen = "-----------------------------------------------".$return;
$nachricht = $datum.$zeit.$abs.$trennen.$text;
mail($an,$betreff,$nachricht,$von);
}
?>
<html>
<head>
<title>Kontakt-Formular</title>
</head>
<body>
<?php
if (empty($fehler)) {
$return = chr(13).chr(10);
$nachricht = strip_tags($nachricht);
$nachricht = htmlentities($nachricht);
$nachricht = str_replace($return,"<br>",$nachricht);
echo "<p>Ihre Nachricht wurde versendet.</p>" ;
echo "<p>$nachricht</p>" ;
} else {
echo "<p>Ihre Nachricht wurde nicht gesendet, weil</p>" ;
echo "<ul>$fehler</ul>" ;
}
?>
</body>
</html>
Anzeigebeispiel
Checkboxen
Checkboxen eignen sich hervoragend dazu, wenn mehrere Antworten möglich sein können.
Ein Formular könnte so aussehen:
<h2>Welche "Websprachen" beherrsche Sie</h2>
<p>Mehrere Antworten sind möglich</p>
<form method="post" action="ergebnis.php">
"input name="html" type="checkbox">(X)HTML<br>
"input name="xml" type="checkbox">XML<br>
"input name="css" type="checkbox">CSS<br>
"input name="php" type="checkbox">PHP<br>
"input name="js" type="checkbox">JavaScript<br>
"input name="perl" type="checkbox">Perl<br>
"input name="andere" type="checkbox">andere<br>
"input name="keine" type="checkbox">keine<br>
"input type="submit" value="Versenden">
</form>
Durch drücken des Buttons Versenden wird das Script ergebnis.php
aufgerufen.
<?php
$text = "Sie haben folgendes gewählt:<br> - " ;
if (isset($_POST['html'])) $text .= "(X)HTML - ";
if (isset($_POST['xml'])) $text .= "XML - ";
if (isset($_POST['css'])) $text .= "CSS - ";
if (isset($_POST['php'])) $text .= "PHP - ";
if (isset($_POST['js'])) $text .= "JavaScript - ";
if (isset($_POST['perl'])) $text .= "Perl - ";
if (isset($_POST['andere'])) $text .= "andere - ";
if (isset($_POST['keine'])) $text .= "keine - ";
echo " $text <br>"
?>
Anzeigebeispiel
Umfrage-Formular
Hier möchte ich Ihnen Zeigen, wie Sie ein Umfrageformular universell gestalten können.
Wenn Sie einmal Ihre Umfrage ändern möchten, brauchen Sie nicht das ganze PHP-Script
umschreiben, sondern nur eine inkludierte Datei, hier umfrage.php, mit der ich hier anfange:
In dieser Datei speichern Sie die Frage in die Variablen $frage
und die möglichen
Antworten in ein Array. Anschließend werden die Antworten noch sortiert. Die Antworten werden
sollen in der Datei musik.txt
gespeichert werden. Existiert diese Datei noch nicht, wird
diese angelegt. Zusätzlich wird noch die Beschriftung des Buttons festgelegt.
<?php
$frage = htmlentities("Welche Musik hören Sie am liebsten ?");
$werte = array("Blues","Classic Rock","Country","Dance","Disco","Funk","Hip-Hop",
"Jazz","Metal","Oldies","Pop","Reggae","Rock","Techno","Soul","Rave","Opera");
sort($werte);
$anzahl = count($werte);
$button = " Abstimmen ";
$datei = "musik.txt";
$return = chr(13).chr(10);
if (!file_exists($datei)) {
$erg = fopen($datei,"w");
for ($i=0; $i < $anzahl; $i++) {
$eintrag = $werte[$i].$return."0".$return;
fwrite($erg,$eintrag);
}
fclose($erg);
}
?>
Als zweites legen Sie das Umfrageformular an. Als erstes wird die umfrage.php inkludiert. Die Frage
habe ich hier in eine Überschrift gefasst. Innerhalb einer for
-Schleife werden
die Antworten ausgegeben.
<?php
include ("umfrage.php");
?>
<html>
<head>
<title>Umfrage</title>
</head>
<body>
<h2>
<?php
echo "$frage";
?>
</h2>
<form method="post" action="ergebnis.php">
<?php
for ($i = 0; $i < $anzahl; $i++) {
echo "<input type=\"radio\" name=\"umfrage\" value=\"$i\"> $werte[$i]<br>";
}
?>
<input type="submit" value="<?= $button ?>">
</form>
<a href="../formular.html">Zurück zum Kurs</a>
</body>
</html>
Wird der Button gedrückt, wird dann die PHP-Datei ergebnis.php
aufgerufen. Auch
hier wird die umfrage.php
inkludiert. Als nächstes wird mit if (!isset($_POST['umfrage']))
geprüft, ob abgestimmt wurde. Die gewählte Antwort aus dem Umfrage-Formular wird in der Variablen
$wahl
gespeichert. Innerhalb einer for
-Schleife wirden die Werte aus der Datei (hier
musik.txt) eingelesen. Wird dabei der Satz erreicht, in der die Antwort mit der Wahl
übereinstimmt, wird die Anzahl um ein Zähler erhöht. Zum Schluss wird das Ergebnis in die
Datei zurückgeschrieben, und die Array-Liste mit der arsort()
neu sortiert. Da wir hier
assoziative Arrays einsetzen, können wir mit arsort()
nach den zweiten Wert sortieren,
also die abgegebenen Stimmen absteigend, mit asort()
aufsteigend, sortieren. Wollen Sie nach
den ersten Wert sortieren, also nach den Antworten, setzen Sie ksort()
aufsteigend, bzw.
krsort()
für absteigend an. Zum Schluss wird mit Hilfe der forach
-Funktion
in der drei Variablen angegeben werden (der Name des Arrays, der Schlüssel (hier die Antwort), und
der Wert (hier die Anzahl der Stimmen)), die Werte ausgegeben.
<?php
include ("umfrage.php");
?>
<html>
<head>
<title>Umfrage</title>
</head>
<body>
<h2>
<?php
echo "$frage";
?>
</h2>
<?php
if (!isset($_POST['umfrage'])) {
echo "<p>Bitte erst abstimmen - Dann sehen Sie das Ergebnis</p>";
} else {
$wahl = $werte[$_POST['umfrage']];
$satz = "";
$alle = 0;
$liste = array();
$erg = fopen($datei,"r");
for ($i=0; $i < $anzahl; $i++) {
$titel = trim(fgets($erg));
$ezahl = trim(fgets($erg));
if ($wahl == $titel) $ezahl++;
$alle = $alle + $ezahl;
$liste[$titel] = $ezahl;
$satz = satz.$titel.$return.$ezahl.$return;
}
fclose($erg);
$erg = fopen($datei,"w");
fwrite($erg,trim($satz));
fclose($erg);
}
echo "<p>Bisher abgegebene Stimmen: $alle<br>\n";
echo "<p>Ihre Antwort lautet: $wahl</p>\n";
echo "<p>Der aktuelle Stand:</p>\n";
echo "<table>\n";
arsort($liste);
foreach ($liste as $key => $counter) {
echo "<tr><td>$counter</td><td>$key</td></tr>\n";
}
echo "</table>\n";
?>
<a href="../formular.html">Zurück zum Kurs</a>
</body>
</html>
Anzeigebeispiel