Zudila AG

Webseiten-Erstellung
Webseiten-Programmierung
Webseiten-Wartung
8057 Zürich
Tel: +41 44 310 14 25
Fax: +41 44 310 14 26
Mob: +41 79 691 87 58
vCard, Skype: juergzuerich Skype: juergzuerich

PHP: Feedback v2.3



Browser: Firefox!
Umfrage

Hat Ihnen dieses Script geholfen?

ja

teilweise

wenig

nein



Feedback, Funktion

Von jeder Webseite aus muss ein Feedback möglich sein.
Es genügt nicht, auf Webseiten nur die E-Mail-Adressen anzugeben! Denn um auf diese antworten zu können ist ein Mailprogramm (z.B. Outlook) nötig, das ist nicht immer verfügbar.
Am einfachsten ist die Realisierung mit einem Link auf jeder Seite zu einem Feedback-Formular.

Im hier gezeigten Feedback-Formular kann aus mehreren Zieladressen die entsprechende Adresse ausgesucht werden (Verkauf, Einkauf, Buchhaltung, etc.).
Ein paar Pflichtfelder werden auf Inhalt überprüft und die Mail-Adresse muss plausibel sein.
Eventuell eingegebene Tags werden alle entfernt.
Die eingegebenen Angaben werden nach dem Absenden nochmals angezeigt.
An den Absender wird bei einer eingegebenen E-Mail-Adresse ein Bestätigungsmail gesendet.
Die Angaben können optional gleich auch in eine Newsletter-MySQL-Datenbank abgelegt werden.


Wir erstellen mit einem Editor eine Datei "feedback.php" und fügen folgendes Script ein:


Code Feedback

Erklärungen zum Code

Zu den Zeilen:

1 - 5: Hier der unvollständige head-Teil. Mehr dazu kann z. B. aus dem Quelltext dieser Webseite entnommen werden.

9: Falls wir die eingegebenen Adresse auch unter den Newsletter-Adressen speichern möchten, so inkludieren wir jetzt den Zugang zu unserer Datenbank. Dazu müssen die beiden "//" am Zeilenanfang entfernt werden.
Der MySQL-Datenbank-Zugang sollte immer in einer eigenen Datei stehen, um so bei einer Änderung der Zugangsdaten, diese nur an einem Ort anzupassen zu müssen.
Beispiel: inc.php

10: Die ausgelagerten Funktionen werden eingebunden. Wir benötigen nur die Überprüfung der E-Mail-Adresse.

13 - 22: Wir setzen alle vorkommenden Variablen auf NULL, in den nachfolgenden if-Anweisung ändern wir diese allenfalls.
Die Testvariablen haben alle die selbe Bezeichnung wir die eigentlichen Variablen, nur wurde nach dem $ ein t_ eingefügt.

25: Die Variable dient zum Verhindern der Formularanzeige nach dem erfolgreichen Absenden des Formulars.
Sie wird in Zeile 228 überprüft.

28: Es gibt Spam der sich eines Webformulares bemächtigt. Um das zu verhindern, geben wir unserem Formular einen sekündlich wechselnden Code mit.
Wir erstellen dazu eine scheinbar zufällige Zahl mit Hilfe des Datums. Diese Zahl geben wir dem Formular mit und überprüfen sie nach dem Submit.
Die Zahl generieren wir aus dem UNIX-Timestamp und verändern sie mittels Primzahlen.
PS: Eine noch sichere Möglichkeit wäre, ein Bild mit Text (Captcha) einzublenden und der Text müsste in ein Eingabefeld geschrieben werden. Dieser Lösungsweg würde aber einen erheblichen Mehraufwand erfordern.

30 - 220: Es folgt der Teil, der ausgeführt wird, wenn wir das Formular abschicken.

33 - 44: Als erstes prüfen wir, ob die im Formular vorgegebenen Feldlängen nicht überschritten werden. Die im Formular mit "maxlength=" begrenzten Eingabefelder können ausgetrickst werden.
Wurde das gemacht, so brechen wir die weitere Verarbeitung gleich ab!

46 - 47: Das Select-Feld im Formular (229 - 237) darf nur ein paar Werte aufweisen. Ist dies nicht der Fall, wird die Weiterverarbeitung sogleich abgebrochen.

50 - 51: Der in Zeile 28 errechnete Code wird in den UNIX-Timestamp zurückgerechnet.

54: Die Variable wird erstellt um die verstrichene Zeit zu prüfen.
Im Beispiel sind 15 Minuten vorgegeben, die Anzahl Sekunden können verändert werden.
Die vorgegebene Zeit sollte grosszügig gewählt werden.

55: Die Zeiten werden verglichen. Sind seit dem letzten Laden der Seite mehr als die festgelegten 15 Min. verstrichen, so bricht das Formular mit 'die' ab und gibt die angegebene Meldung zurück.
Der sofortige Abbruch erfolgt bewusst und es wird keine Erklärung dazu abgegeben.

58 - 71: Die per POST übergebenen Variablen werden überprüft.
Strip_tags entfernt vorsichtshalber alle Tags aus den Variablen. So ist es unmöglich irgendwelche Formatierungen (fett, unterstrichen) oder funktionsfähige Links in die Felder einzugeben.
Diese werden meist nur für Werbung missbraucht.
Trim entfernt die Leerschläge am Anfang und Ende des Variableninhalts.
Strtr ersetzt das '@' durch ' ' und entfernt Schrägstriche.
Damit haben wir Angriffsmöglichkeiten weitgehend ausgeschlossen.

59: Hier entfernen wir bewusst das '@' nicht. Es gibt Firmen, bei denen dies Bestandteil des Firmennamens ist.

74 - 97: Wir prüfen, ob die Pflichtfelder auch ausgefüllt wurden.
In den Variablen die mit "t_" beginnen, werden die Fehlermeldungen gespeichert. Sind keine Fehler vorhanden, sind die Variablen NULL.

74: Hier muss die Variable einen anderen Wert als "?" haben.

76 - 82: Die Felder dürfen nicht leer bleiben.

80: Die PLZ muss mindestens vier Stellen aufweisen.
Hier könnte die PLZ noch näher geprüft werden, so könnte die PLZ und der Ort mit einer Datenbanktabelle auf das Vorhandensein verglichen werden. Beispiel: Autocomplete
Eine Prüfung nur auf Ziffern, geht nicht bei allen Ländern (z.B. GB).
Sollte die PLZ auch in einer Datenbank abgelegt werden, so sollte die PLZ dort als Text und nicht als Zahl gespeichert werden. Deutschland verwendet PLZ die mit 0 beginnen, wird dies als Zahl gespeichert, so wird die 0 nicht als zu speichernder Teil angesehen.

83: Eine der drei möglichen Telefonnummern muss angegeben werden.

84 - 91: Telefonnummern können prinzipiell nur auf eine gewisse Plausibilität geprüft werden. Geprüft wird nur, ob keine Buchstaben, Klammern und Schrägstriche vorhanden sind. Zusätzlich muss die Nummer mindestens 9 Zeichen aufweisen.
Wenn die Telefonnummern auch in eine Datenbank sollen, so sollten die Nummern möglichst normalisiert (keine Leerschläge) abgelegt werden. Nur so ist später ein automatisiertes anwählen ab PC möglich.
PS: Wenn man auch noch ein Eingabefeld für das Land hinzufügt, so könnte auch die internationale Vorwahl zusätzlich überprüft werden.

92 - 96: Prüfen ob eine E-Mail-Adresse eingegeben wurde, falls ja, prüden mit der eingebundenen Funktion "check_email". Diese Funktion ist in Zeile 10 eingebunden.

100 - 102: Sind alle Prüfungen in Ordnung?

104 - 215: Alle Prüfungen sind i. O. Die Mails werden versendet und allenfalls der Datenbankeintrag vorgenommen.
Sind die Bedingungen nicht erfüllt, so folgt gleich Zeile 217, das Formular wird mit den eingetragenen Werten und den Fehlermeldungen ausgegeben.

104 - 144: Die Mails werden generiert.

104 - 109: Der "header" des Mails an uns wird erstellt.
Sollte es mit dem Mailversand irgendwelche Probleme geben, so liegt das Problem meistens im Hader, je nach Serverinstallation.

111 - 117: Der Mail-Empfänger wird zugewiesen. Die vorgegebenen Mailadressen sind durch die eigenen Mailadressen zu ersetzen.
Dieser Bereich kann beliebig verkleinert oder vergrössert werden, die Eintragungen müssen jedoch mit den Zeilen 230 - 236 und 46 übereinstimmen!

119 - 125: Nun erstellen wir den Text der an uns gesendet wird.

120 - 125: Um im Mail die Zeilenumbrüche richtig zu erstellen, sollte alles in einer Zeile stehen. Die "\n" sorgen für die nötigen Zeilenumbrüche.
Im Script vorhandene Zeilenwechsel werden auch im Mail als solch ausgegeben. Das kann auch bewusst so verwendet werden.

126: Der Text wird zusammengefügt.

128: Das Mail an uns wird versendet.
Das @ vor "mail" dient dazu, allfällige Fehlermeldungen zu unterdrücken.

130 - 144: Wir senden, sofern eine E-Mail-Adresse eingetragen wurde, ein Bestätigungsmail an den Verfasser des Feedbacks.
Das Zusammensetzen und Versenden des Mails erfolgt wie oben.

146 - 152: Wenn die eingegebene Adresse auch in der MySQL-Datenbank für die Newsletter verwendet wird, aktivieren wir diese Zeilen in dem wir die "//" am Zeilenanfang (147 - 152) entfernen.
PS: Zusätzlich muss natürlich auch in der MySQL-Datenbank die entsprechende Tabelle eingefügt werden!

155: Die php-Funktion "nl2br" wandelt die Zeilenumbrüche aus der Datenbankeintragung in korrekten HTML-Code um.

157 - 206: Die eingetragenen Angaben werden am Bildschirm nochmals angezeigt.
Damit geben wir dem Benutzer eine Bestätigung, die auch ausgedruckt werden kann.

205: Ein Link zur weiteren Navigation.

209 - 211: Zur Sicherheit werden alle Formularfelder geleert.

214: Das Formular soll nicht mehr angezeigt werden. Wir ändern die Variable, die wir in Zeile 25 auf "ja" gesetzt haben in "nein".

216 - 219: Sofern noch Fehler vorhanden sind und das Formular noch nicht abgesendet werden kann, wird gesetzt:
"$fehler" bekommt den Inhalt der Fehlermeldung die auf Zeile 223 allenfalls angezeigt wird.
"$zurueck" verhindert auf den Zeilen 338 - 342 das erneute Anzeigen des "input reset", da dies nach dem ersten Sendeversuch nicht mehr funktionieren kann.

221 - 349: Das gesamte Formular wird angezeigt, sofern die nicht Variable in Zeile 218 auf "nein" gesetzt wurde.

223: Allenfalls die Fehlermeldung aus Zeile 217.

224 - 347: Das per POST zu übermittelnde Formular.

226 - 330: Die einzelnen Felder in der Tabelle werden ausgefüllt.
Mit "value" geben wir die eingegebenen Werte an das Formular zurück, falls das Formular noch nicht abgesendet werden konnte. Mit den Variablen "$t_..." geben wir die allfälligen Fehlermeldungen an das Formular zurück.
Sollten die Felder im Quellcode nicht in der Reihenfolge stehen, wie sie normalerweise ausgefüllt werden, so ist in die input-Tags als zusätzliche Angabe der Reihenfolge mit "tabindex" zu schreiben, um die Reihenfolge der Durchschreitung mit der Tabulatortaste zu bestimmen. Dabei steht in den Inputfeldern "tabindex="1"", wobei die Zahl in jedem Feld erhöht wird.
Bei der Benutzung einer Datenbank, sollte in die input-Tags zusätzlich die Angabe "maxlength", damit wird die Maximallänge der einzelnen Felder bestimmt die nicht überschritten werden kann. Beispiel: maxlength="50". Dabei ist die Grösse mindestens so gross wie "size".
Beispiel:
<input type="text" name="firma" size="40" maxlength="50" tabindex="2" value="'.$firma.'" />
Nebenbei, oft werden, um das wunderschöne und sehr spezielle Design zu ermöglichen, die Eingabefelder so klein gehalten, dass der eingegebene Text kaum je als Ganzes gelesen werden kann. Der Benutzer mag das kaum!

230 - 236: Die gewünschte E-Mail-Adresse wird ausgesucht und danach in den Zeilen 111 - 117 zugeteilt.
Um das Formular im XHTML-Format zu erstellen, muss die Eingabe selected als "selected="selected"" geschrieben werden!

238: In der Fehlerausgabe dient die Leerstelle dazu, dass das Script nach XHTML validierbar ist.

327: Das Textfeld wird mit "rows" und "cols" in der Grösse festgelegt. Geben Sie die Grösse genügend gross an. Mit einem kleinen Feld signalisieren Sie deutlich, dass Sie eigentlich keinen Beitrag wünschen!
Schreiben Sie diese Zeile immer nur in einer Zeile, da sich sonst im Textfeld der Cursor nicht zuoberst links befindet.

336: Um die Tabelle XHTML-gerecht zu halten, muss in jeder Tabellenzelle immer etwas stehen. So also hier der Leerschlag.

338 - 342: Die Funktion "reset" funktioniert nur vor dem ersten Absenden des Formulars. Um diese danach nicht mehr mögliche Funktion auch nicht anzuzeigen, prüfen wir die allenfalls in Zeile 218 gesetzte Variable.

351 - 354: Die auf der Seite selbst nicht angezeigte Quellenangabe, ist nicht nur die Bedingung zur freien Nutzung dieses Skriptes, sondern ermöglicht auch in Zukunft, allenfalls benötigte Hilfe zu erhalten.

Vielleicht hat Ihnen unser Skript ein paar Stunden Arbeit erspart?

Copyright © 1998 - 2016, Zudila AG, CH 8057 Zürich Diese Seite (www.zudila.ch/scripte/php_feedback.php) wurde aktualisiert: 23.10.08

Besucher heute: 80 Seitenaufrufe heute: 296 gerade online: 1
Besucher gestern: 158 Seitenaufrufe gestern: 230 max. online: 135
Besucher pro Tag: 179,95 Seitenaufrufe pro Tag: 537,90 Eigene Seitenaufrufe: 1
Valid XHTML 1.0! Valid CSS! Valid WCAG 1.0, WAI-AAA!

www.zudila.ch   info@zudila.ch

nach oben
Herr Jürg Dieter Lüthard Jürg D. Lüthard Zudila AG www.zudila.ch Krokusweg 6 Switzerland 8057 Zürich Zürich +41 44 310 14 25 +41 79 691 87 58 +41 44 310 14 26
N 47º 24.2416 O 8º 32.9866
business Webseiten erstellen, programmieren, warten /
Web pages provide, program, wait /
Les pages Web fournissent, programment, attendent