Formulare - Affenformular, Auswertung und Feedback

Die HTML-Tags für einfaches Formular finden Sie unter
http://www.html-seminar.de/formulare.htm

Der Aufbau vom HTML-Tag <form ...> ist einfach:
über das Attribut action="" wird angegeben, welche Internetseite aufgerufen wird, wenn das Formular abgesendet wird.

Zusätzlich wird über das Attribut method="get|post" die Art des Versendens vorgegeben – dazu weiter unten mehr.

<form action="formular-m-anzeige.php" method="get">
 
<p>Ihr Vorname:
<input type="text" name="vorname">
</p>
 
<p>
<input type="submit" value="absenden">
</p>
 
</form>

Die Ausgabe im Browser ist sehr einfach und bisher passiert mit eingegebenen Daten nichts. Nach Absenden wird dieselbe PHP-Datei aufgerufen.

Ihr Vorname:

Jetzt wird das Script ergänzt um einen Teil, der mit den übergebenen Daten etwas macht - hier werden die abgesendeten Informationen einfach angezeigt.

<?php
echo "eingetragener Vorname: ". $_GET['vorname'];
?>

<form action="formular-m-anzeige.php" method="get" >
 
<p>Ihr Vorname:
<input type="text" name="vorname">
</p>
 
<p>
<input type="submit" value="absenden">
</p>
 
</form>

Die Anzeige sollte im Browser erfolgen - kopieren Sie den Dateinamen einfach in den Browser mit anfangs localhost

Wenn nun in das Feld Vorname ein Eintrag erfolgt und der Button absenden angeklickt wird, wird das PHP-Programm ausgeführt.

Im Browser wird nun der eingetragene Vorname in der ersten Zeile angezeigt und wieder ein leeres Formular angezeigt.

Interessant ist die URL-Zeile des Browers. Dort sehen Sie nach dem Absenden, dass die ursprüngliche URL ergänzt wurde:

http://localhost/formular-m-anzeige.php?vorname=Axel&Button=absenden

Es werden nun die eingetragenen Informationen wie Vorname und der Wert des Buttons übertragen.

Innerhalb des PHP-Programmes kann nun auf die Informationen zugegriffen werden. Es ist eine Variable, die zwecks Sicherheit über die Konstruktion $_GET['variablenname'] abgefragt wird.

Beobachen Sie die Zeile oben. Geben Sie Ihren Namen ein und klicken Sie auf den Button - wie sieht die Zeile im Vergleich aus, wenn nach dem Eintragen des Namens nur die Returntaste gedruckt wird?

Was tun – wenn es nicht tut?

Was bei Formularen mit PHP schief gehen kann

Aus meiner Kurserfahrung kann ich sagen, dass folgende Probleme gerne auftreten. Es schleicht sich schnell ein Tippfehler ein und man wundert sich, warum nun das Formular nicht so reagiert, wie man gerne hätte. Folgend die 4 häufigsten Fehler bei der Formularerstellung mit PHP

  • die aufgerufene Datei ist eine ganz andere
  • Die Art der Übergabe aus dem HTML-Formular ist eine andere, als auf der PHP-Seite erwartet
  • auf der PHP-Seite wird versehentlich das Array falsch bezeichnet ($_get bzw. $_post ist eine schlechte Idee)
  • Die Variablennamen enthalten Schreibfehler bzw. haben noch ein $ vorneweg

Die einzelnen Punkte mit Erklärung, warum was schief geht und wie man es umgeht:

die aufgerufene Datei ist eine ganz andere

In unserem Beispiel haben wir aufgerufen über den HTML-TAG:

<form action="formular-m-anzeige.php" method="get">

Unsere Datei, die mit PHP die übergebenen Inhalte auswertet muss also exakt so heißen, sprich im Beispiel "formular-m-anzeige.php". Auf Klein- und Großschreibung achten!

Die Art der Übergabe aus dem HTML-Formular ist eine andere, als auf der PHP-Seite erwartet

In unserem Beispiel wählen wir als Übergabeart get über das Attribut method aus.

<form action="formular-m-anzeige.php" method="get">

Also müssen wir auf der PHP-Seite auch mit der entsprechenden Abfrage $_GET arbeiten. Wird versehentlich mit $_POST auf der PHP-Seite gearbeitet – wundert man sich, warum keine Inhalte übergeben werden.

Auch ist auf die Schreibweise von get/post zu achten (siehe nächsten Punkt).

auf der PHP-Seite wird versehentlich das Array falsch bezeichnet ($_get bzw. $_post ist eine schlechte Idee)

Ganz wichtig ist die korrekte Schreibweise – die für den Einsteiger verwirrend ist. Auf der HTML-Seite schreiben wir im Formular

<form action="formular-m-anzeige.php" method="get">

Also komplett klein (ansonsten ist es kein valider HTML-CODE!)

PHP auf der PHP-Seite spricht den Inhalt aber über $_GET an. Also komplett groß geschrieben. Nimmt man hier versehentlich Kleinschreibung, bekommt man kein Ergebnis.

Die Variablennamen enthalten Schreibfehler bzw. haben noch ein $ vorneweg

Auf der HTML-Seite vergebe ich über das Attribut name="..." des HTML-TAGs input den Namen, unter dem ich es in PHP ansprechen kann,

<input type="text" name="vorname">

In PHP muss ich exakt unter dieser Bezeichnung den Inhalt abrufen, also:

$_GET['vorname']

Probleme kommen sofort, wenn man solche falschen Konstruktionen wie:

$_GET[VORNAME], $_GET[Vorname] oder noch mit versehentlichem $, also $_GET[$vorname] es versucht. Immer erhält man nur einen leeren Inhalt zurück.

Die möglichen Fehler sind hoch, aber dadurch lernt man. Also niemals aufgeben und sich immer selber der durch Kontrollausgaben kontrollieren!

Unterschied GET und POST

Bisher haben wir mit GET die Daten übertragen. Bei GET werden die Daten über die URL-Zeile übertragen. Diese sind für jeden sichtbar und sind im Umfang begrenzt (je nach Einstellung des Webservers - i.d.R. 4kb)

Als Alternative wurde POST eingesetzt. Die Daten werden ebenfalls zum Webserver übertragen, allerdings für den normalen Nutzer nicht mehr sichtbar. Die Abfrage der Inhalte erfolgt dann über $_POST['Variablenname']

Im PHP-Kurs wird zwecks Nachvollziehbarkeit nur die GET-Methode verwendet.

Tipp: Eine Abfrage, die sowohl über die GET- wie POST-Methode beinhaltet, ist $_REQUEST['Variablenname'] - diese ist allerdings später beim ausgewachsenen Programmieren nicht wirklich erwünscht, da dadurch Sicherheitskonzepte aufgeweicht werden.

AUFGABE: Erstellen eines Formulars mit hidden-Feld

Über das HTML-Element input type="hidden" können für den Benutzer nicht sichtbare Informationen übertragen werden <input type="hidden" name="werteins" id="werteins" value="x">

Aufgabe ist, über ein Formular mit hidden-Feld einen Wert im Hintergrund zu übertragen. Der Wert des hidden-Feldes soll über eine Variable mit dem Namen "$aktion" übertragen werden. In dieser Variable soll als Wert 3 übertragen werden.

$aktion wird übergeben mit hidden - Kontrolle, ob eine 3 übergeben wird (über Variable)

Beachten Sie die Browserzeile!

Aufgabe: anstatt dem Wert 3 soll die aktuelle Uhrzeit übertragen (Tipp date)

Da sehr oft mit Formularen gearbeitet wird, hier eine weitere Aufgabe zum Üben.

Lösungsvorschlag

Eine Lösungsweg:

Es gibt natürlich noch andere Wege nach Rom, bzw. Lösungswege. Wichtig ist, dass es funktioniert und man dabei etwas lernt.

Formularwerte über IF kontrollieren

Ziel ist, dass nach Ausfüllen eines Formulars eine Aktion stattfindet, wenn der Vorname eingetragen wurde.

Der Ablauf ist:

  1. Beim ersten Aufruf ist $_GET['vorname'] noch leer (Feld vorname nicht eingetragen UND abgesendet).
  2. Nach dem Absenden wird wieder dasselbe PHP-Script aufgerufen, diesmal in der URL mit den eingetragenen Feldern http://localhost/affenformular.php?vorname=Ax&Button=absenden
  3. Das Script überprüft, ob die Variable vorname ausgefüllt wurde. Früher ging es, einfach $vorname zu kontrollieren. Heute ist es durch Sicherheitsbedingungen notwendig, über $_GET die entsprechende Variable zu kontrollieren, also $_GET['vorname'] (technisch gesehen ist das $_GET ein ARRAY, dazu in späteren Kapiteln mehr).
    • Fall 1: Ist die Variable leer, wird einfach wieder das Formular angezeigt.
    • Fall 2: Ist die Variable gefüllt, wird der Teil nach dem else ausgeführt.

Dazu wird über if kontrolliert, ob die Variable "vorname" leer ist. Für die Kontrolle wird die Funktion empty verwendet. Diese Funktion testet, ob eine Variable leer ist oder einen Inhalt erhält. Je nachdem gibt es als Rückwert richtig oder falsch - in Programmiersprachen kommt dann TRUE oder FALSE (dabei steht TRUE für 1 und FALSE für 0).

Für empty sind dabei verschiedene Schreibweisen zulässig, einfach nach Vorliebe des Programmieres. Zu sehen sind folgende Varianten, die alle gleich funktionieren:

  • if ( empty ($_GET['vorname']) == TRUE )
  • if ( empty ($_GET['vorname']) == 1 )
  • if ( empty ($_GET['vorname']) )
PHP-Quellcode für Affenformular: affenformular.php
<?php
if ( empty ($_GET['vorname']) == TRUE )
{
    echo '
    <form action="affenformular.php" method="get">
 
    <p>Ihr Vorname:
    <input type="text" name="vorname" size="50">
    </p>
 
    <p>Absendebutton:
    <input type="submit" value="absenden">
    </p>
 
    </form>
    ';
}
else
{
    // beliebige Aktion, z. B. E-Mail senden, DB-Eintrag
    echo "eingetragener Vorname: " . $_GET['vorname'];
}
?>

Als Affenformular werden Formulare bezeichnet, die sich selber aufrufen und die die gemachten Eingaben auf ihre Gültigkeit überprüfen. Erst wenn die gewünschten Eingaben vorhanden sind (z. B. korrekte E-Mail-Adresse, PLZ, etc.) findet eine Weiterverarbeitung statt.

Der Name Affenformular kommt daher, dass selbst bei tausendfachem Aufruf durch tausend Affen nichts bewirkt wird.

AUFGABE: Erstellen Sie ein Affenformular mit dem hidden-Feld mit Namen "aktion" und dem Wert "1"

  • Affenformular erstellen
  • hidden-Field mit dem Name "kontrolle" und dem Wert "1"
  • Bauen Sie im ersten Bereich des IF-Bereichs folgende Zeilen an:
  • if ( $_GET['kontrolle'] == 1 ) { echo "<p><b>Leere Felder zählen nicht, gehen Sie nicht über Los, ziehen Sie keine ...</b></p>"; }

PHP-Programm erstellen und erklären Sie, für was das if innerhalb des ersten if-Bereichs gut ist.

Beim ersten Start wird ein leeres Formular ausgegeben:

Wird keine Eingabe bei dem Feld Vorname gemacht, erscheint ein Fehlerhinweis.

Wird eine Eingabe gemacht, wird der zweite Teil der IF-Anweisung ausgeführt.

Zur Kontrolle Ihres Ergebnisses können Sie hier einen Lösungsweg ansehen.

Aufgabe: Erstellen Sie das Formular mit zusätzlichen Feld Nachnamen. Wichtig ist, dass beide Felder ausgefüllt werden

TIPP: bei if können auch mehrere Bedingungen eingegeben werden und logisch mit and oder or verbunden werden, z.B.

if ( empty ($_GET['vorname']) == TRUE 
     and 
     empty ($_GET['nachname']) == TRUE 
   )
{
   // wenn beide Bedingungen zutreffen, 
   // dann folgende Anweisungen ausführen
}
 
if ( empty ($_GET['vorname']) == TRUE 
     or 
     empty ($_GET['nachname']) == TRUE )
{
   // wenn eine der beiden Bedingungen zutrifft, 
   // dann folgende Anweisungen ausführen
}
 

Zur Kontrolle Ihres Ergebnisses können Sie hier einen Lösungsweg ansehen.

Aufgabe: Fehlermeldung und bereits eingegebene Werte übernehmen

Nutzen Sie das Prinzip der letzten Aufgabe. Annahme ist, dass jemand zwar seinen Nachnamen einträgt, aber den Vornamen nicht einträgt. Im obigen Beispiel muss er dann wieder alle Felder eintragen. Ändern Sie das Script so, dass es zusätzlich zu der Fehlermeldung auch schon den bereits eingetragenen Wert übernimmt.

Eingeben von Nachnamen und absenden - Fehlermeldung kommt und der Nachname wird übernommen und muss nicht nochmals eingetragen werden.

Zur Kontrolle Ihres Ergebnisses können Sie hier einen Lösungsweg ansehen.

Beispiel aus der Praxis

Ein direktes Beispiel aus der Praxis ist das Formular zum anfordern des eBooks vom PHP-Kurs.com. Sind nicht alle Pflichtfelder beim Anklicken des "Absendenbuttons" ausgefüllt worden, erhalten Sie eine Auflistung mit noch notwendigen Angaben und den bereits schon eingetragenen.

Ein weiteres Pluspunkt an diesem Formular ist der fehlende "Abbrechen-Button". So ein Button löscht alle Eingaben in einem Forumlar. Wird dieser versehentlich gedrückt (was im Eifer des Gefechtes vorkommen kann), werden beim zweiten Ausfüllen (wenn das der Besucher überhaupt macht) die Angaben knapper ausfallen. Daher ist es sinnvoll, solch einen Button erst gar nicht anzubieten.

Dateinamen der PHP-Datei ermitteln

Zeitweise ist es notwendig (und einfacher), den Dateinamen eines PHP-Programmes zu ermitteln.

Der Dateinamen ist in der Variablen $PHP_SELF hinterlegt. Allerdings kann bei register_globals = Off diese nicht direkt abgefragt werden - eine Konstruktion wie im nächsten Beispiel hilft.

<?php
// bei register_globals = Off
$PHP_SELF = $_SERVER['PHP_SELF'];
 
echo "Dateiname: ";
print_r ($PHP_SELF);
?>

Angewendet wird dies z.B. im Affenformular (siehe Formulare).

Beispiel (nur der Teil, der zum Veranschaulichen wichtig ist):

<?php         
// bei register_globals = off
$PHP_SELF = $_SERVER['PHP_SELF'];
 
echo '<form action="'. $PHP_SELF .'" method="get" >';
 
...

Diese Methode hat den Vorteil, dass man das Formular auch unter einem beliebigen Namen speichern kann, ohne jedesmal im Formular das "action"-Attribut zu ändern (was man gerne vergisst).