Donnerstag, 21. Februar 2008

PHP- und HTML-Baustein: Kontaktformular (formmailer)

Gerade habe ich wieder eine Webseite fertiggestellt, in die ich ein Kontaktformular einzubauen hatte. Und wie immer dasselbe: Lösung aus dem letzten Projekt heraussuchen, überfliegen und Änderungen vornehmen. Entsprechend meinem Vorsatz, künftig solche Bausteine zu bereinigen und zu bearbeiten, sie dann anschließend als Baustein im Webworker-Archiv zu hinterlegen, habe ich eine Extrastunde investiert und das Skript überarbeitet. Alle Editierleichen mussten raus und der Code wurde auskommentiert. Nachfolgender Code ist das Ergebnis.

Das Thema taucht laufend in den Foren auf. Gefragt wird nach Konzept, Struktur und geeigneten formmailer-Skripten.

Nachfolgendes Skript wird in diejenige Seite eingebaut, in der das Kontaktformular erscheinen soll. Es verweist auf sich selbst, verarbeitet dort auch die übergebenen Daten und gibt Fehlermeldungen aus. Das Formular wird wiederholt, und im Falle eines Errors die fehlerhaften Daten voreingetragen. Vom Konzept her entspricht es den üblichen Empfehlungen auf entsprechende Foren-Fragen.

Das Skript ist bereits längere Zeit in mehreren Projekten im Einsatz. Es kann beliebig abgeändert und natürlich frei verwendet werden kann.


##### Ziel-email-Adresse, unbedingt ändern ######
$mailto = "irgendwer@irgendwas.de"; // ÄNDERN


##### Allgemeine Variablen vorbereiten
$formactionziel= $_SERVER["PHPSELF"];
$zeit=strftime("%c", time());
$mail_text="Anfrage vom $zeit \n \n";
$betreff= "Anfrage";
$from="From: Kontaktformular@".$_SERVER['SERVER_NAME'];
$meldung="";


######### Die HTML-Ausgabe beginnt
// es beginnt der gesamte HTML-Abschnitt, in welchem Formular und oder Meldungen erscheinen
echo "<div style='margin-left:2cm; font-family:Arial; font-size:10pt'>";

########## Abschnitt 1 ##########
// folgt ein Abschnitt, der nur greift, wenn bereits Daten übersandt wurden; die Daten werden verarbeitet, um sie entweder zur Speicherung oder, bei Fehlern im erneut aufzurufenden Formular voreinzutragen.

if (isset($_POST["submit"])) {

// übergebene Variablen ermitteln:
$felder="absendername strasse plz ort tel absenderemail anmerkung";
$felder=explode(" ", $felder);
unset($errors);
foreach($felder as $tmp) {

if(trim(stripslashes($_POST[$tmp]))=="asdf") $errors[]="$tmp = asdf? Was soll das!?";
// kleines Gimmick für den Fall, dass jemand rumspielt und asdf eingibt

$$tmp=trim(stripslashes($_POST[$tmp]));
}


// Sicherheits-Überprüfung der Daten aus Übervorsicht,
// eigentlich nicht nötig, sofern $mailto oben fest definiert ist

if ($mailto != "" and !preg_match("/^[^@]+@.+\.\D{2,5}$/", $mailto)) {
$errors[] = "die E-Mail-Adresse sieht nicht richtig aus<br />";
$absenderemail="!!??!!";
}

// Pflichtfelder checken ----------------------------------------------------------- evtl. ÄNDERN -----------------
// soweit eine der folgenden Felder KEIN Pflichtfeld ist, muss man
// die entsprechende Zeile löschen oder auskommentieren

if(empty($ort)) $errors[]="Ort fehlt<br />";
if(empty($plz)) $errors[]="Postleitzahl fehlt<br />";
if(empty($strasse)) $errors[]="Straße fehlt<br />";
if(empty($tel)) $errors[]="Telefonnummer fehlt<br />";
if(trim($anmerkung)=="asdf") $errors[]="Hast Du nichts Besseres zu tun?";


// Wenn keine Fehler da sind, kann die Post abgehen.
if (empty($errors)) {
$mail_text="
Anfrage
-------
Name: $absendername
Strasse: $strasse
Ort: $plz $ort
Telefon: $tel
Email: $absenderemail
Nachricht:
$anmerkung ";
// keine HTML-Zeilenumbrüche; die hier notierten Zeilenumbrüche erscheinen 1:1 im email-Text

// Refererdaten vorbereiten, um sie der email-Nachricht hinzufügen zu können
$referer=$_SERVER["HTTP_REFERER"];
$IP=$_SERVER['REMOTE_ADDR'];
$remotehost=$_SERVER['REMOTE_HOST'];

$refererdaten="
http_referer: $referer
IP=$IP
remote_host=$remotehost
";

// referer-Daten an den email-Text anhängen

$mail_text.="
--------------
Protokollierung interner Daten für Kontrollzwecke:
$refererdaten
";

// mail versenden
if (@mail($mailto, $betreff, $mail_text, $from)) {
$sent = true;
}else {
$errors[] = "keine Verbindung zum Mailserver - bitte nochmal versuchen<br />";
}

}
}

// Bestätigungsanzeige für den User

if($sent===true) {
echo "<p style='color:green; font-size:13pt'><b>Danke!</b><br />Nachricht erfolgreich versandt.</p>";

// hier könnte man auch abbrechen und link zurück auf die eigene Seite mit dem blanken Formula setzen,
// anderenfalls muss man zunächst die Formularinhalte wie folgt löschen
foreach($felder as $tmp) {
$$tmp="";
}
// Ende des Löschens der Formularinhalte
}

echo "Neue Nachricht: <br /><hr><br />";

###### Ende Abschnitt 1 ############

###### Abschnitt 2 #############
// Dieser Abschnitt schließt am Abschnitt 1 an, und greift nur, wenn dort ein Fehler bemerkt wurde
// sie bereitet im Falle einer Fehlermeldung die Fehlerhinweise vor
// und bereitet die übersandten Daten auf, um sie im Formula voreinzutragen

if (empty($sent)) {
if(isset($errors)) {
echo "<p>Hoppla. Fehler aufgetreten:</p><ul>";
foreach($errors as $f) {
echo "<li>".$f."</li>";
}
echo "</ul><br /><br />";

$action=$_SERVER["PHP_SELF"];

// folgendes wird in ähnlichen Skripten gern übersehen; wenn in Eingabefeldern ein Apostroph war, wurde das beim Übersenden mit slashes maskiert, und diese Slashes würden im Eingabefeld erscheinen. Diese müssen entfernt werden. Beim erfolgreichen Speichern in eine Datenbank dagegen übernimmt das php-Programm die Entfernung automatisch, so dass obige Routine nur notwendig ist, wenn die Variablen auf der Webseite wiedergegeben werden müssen

$absendername=htmlentities(stripslashes($absendername));
$absenderemail=htmlentities(stripslashes($absenderemail));
$strasse=htmlentities(stripslashes($strasse));
$anmerkung= htmlentities(stripslashes($anmerkung));
$ort=htmlentities(stripslashes($ort));


} // ende errors
}
####### Ende Abschnitt 2 ########

####### Abschnitt 3 #############
// ab hier der normale Content dieser Seite, der beim Erstaufruf erscheint, der Content besteht
// aus dem Formular, evtl. mit voreingetragenen Daten im Falle einer misslungenen Absendung
echo "
<form action='$formactionziel' method='post'>
<INPUT TYPE='TEXT' NAME='absendername' value='$absendername' SIZE='42'> Name, Vorname<br />
<INPUT TYPE='TEXT' NAME='strasse' value='$strasse' SIZE='42'> Straße und Hausnr.<br />
<INPUT TYPE='TEXT' NAME='plz' value='$plz' SIZE='6'> PLZ<br />
<INPUT TYPE='TEXT' NAME='ort' value='$ort' SIZE='42'> Ort<br />
<INPUT TYPE='TEXT' NAME='tel' value='$tel' SIZE='42'> Telefon<br />
<INPUT TYPE='TEXT' NAME='absenderemail' value='$absenderemail' SIZE='40'> E-Mail (optional)<br /><br />
Nachricht:<br />
<textarea name='anmerkung' cols='40' rows='10'>$anmerkung</textarea><br />
<br />
<INPUT TYPE='SUBMIT' name='submit' VALUE='Absenden'>
</form>
<br />
</div>";

Dienstag, 5. Februar 2008

Von Hyperlinks, Trackbacks und Meinungsbildung - Verweise in der Online-Literatur

Kapitel 1) Worum geht es?

1.1) Gegenstand dieser Untersuchung ist die Frage, wie man bei Aufsätzen, die im Web veröffentlicht werden, auf andere Onlineliteratur verweisen kann oder soll.

Die Verweistechnik ist in der gedruckten Fachliteratur, also im Printbereich, von jeher eine übliche Technik. Die Verwendung von Hyperlinks in HTML-Seiten ist dieser Verweistechnik ähnlich, wenn sie auch bisher mehr dazu verwendet wird, pauschal auf andere interessante Seiten zu verweisen. Das Trackback-System in den Blogs stellt ebenfalls Instrument zur Verfügung, das in faszinierender Weise dem klassischen System ähnelt. Und in Wikipedia ufert die Verweistechnik über Hyperlinks, die im Text eingestreut sind, extrem aus.

Die Entwicklung gibt Anlass, sich generell Gedanken über Querverweise auf Webseiten zu machen. Hier liegt noch viel Potential, denn die heutige Meinungsbildung wird mittlerweile stark durch private Seitenbetreiber im Web bewirkt .

Mit den Verweisen in den Schulen hat der Aufsatz nichts zu tun. Einige Leser können sich also beruhigt zurücklehnen.

1.2) Zu den hier verwendeten Begriffen

Unter Verweise (auch „Fundstellen“ oder „Nachweise“) verstehe ich dabei Hinweise auf online veröffentlichte Aufsätze, Artikel, Beiträge, Forenbeiträge, Informationen oder sonstige Texte, in denen etwas bestimmtes gesagt wird.

Für diese Texte benutze ich hier die Bezeichnung “ Onlineliteratur“. Damit meine ich also nicht nur veröffentlichte Bücher, sondern alle möglichen Texte, sofern sie nur einigermaßen zitierbar sind. Typische Beispiele

  • Angabe von Fundstellen für Aussagen anderer oder für Zitate

  • Angabe von Fundstellen für Aufsätze, in denen vergleichbare Meinungen vorkommen

  • Angabe von Fundstellen für Definitionen und Erklärungen (Beispiel Wikipedia)

1.3) Vorgehensweise

Zu klären sind folgende Fragen:

  • Auf welche Art kann ich auf andere Aufsätze verweisen

  • Wie publiziere ich Aufsätze, damit Verweise auf bestimmte Stellen im Aufsatz möglich sind.


Kapitel 2) Mögliche Arten der Verweisung

2.1) Vergleich zum Printbereich

Die in gedruckten Büchern überlicherweise verwendeten Methoden sind:

a) Fußnoten: hochgestellte Ziffern an den betreffenden Textstellen und zugehörige Fußnoten, die sich entweder am Ende einer Seite oder am Ende des Kapitels oder Aufsatzes befinden.

b) Klammer-Verweise, bei denen die Verweise mitten im Text in Klammern eingeschoben sind.

Das Fußnotensystem ist bei Monografien und Zeitschriftenaufsätzen verbreitet.

Klammer-Verweise findet man typischerweise in Gerichtsurteilen und den meisten Handbüchern und Kommentaren. Die Technik der Klammer-Verweise macht den Text oft schwer leserlich, was aber mit anderen Aspekten abzuwägen ist.

2.2) Wie kann ich Verweise in einer Webseite einbauen?

2.2.1) Fußnoten

Für Internetuser sind Fußnoten auf Webseiten ungewohnt, z.T. gar nicht verständlich, da unbekannt.

Fußnoten stoßen in Webseiten aber auch auf technische Probleme. Dieses System setzt eine feste Seite voraus, an deren unterem Ende die Fußnoten aufgelistet sind. Ein HTML-Dokument ist aber ein durchgehendes Dokument ohne Seitenmaße, sozusagen eine beliebig lange Schriftrolle, die noch dazu in der Seite verbreitert werden kann.

Fußnoten bieten sich also nur an, wenn Artikel auf mehrere HTML-Seiten verteilt ist. Dann könnte man unter dem Text die Fußnoten einfügen.

Möglich ist auch Verlinkung durch seiteninterne Anker. An der betreffenden Textstelle wird entweder eine Ziffer, noch besser ein kleines Textschnipsel eingefügt (Fußnote 1), dieser ist verlinkt mit der zugehörigen Fußnoten am Textende. Technisch wird dies realisiert durch einen Anker, der Hyperlink verweist also nicht auf eine andere Seite, sondern auf eine Stelle innerhalb derselben Seite.

Aber selbst das dürfte für die meisten Leser ungewohnt sein. Zum einen müssten sich die Leser überhaupt erst an das Fußnotensystem gewöhnen ("Fußnote 1" sagt vielen auch noch nichts). Zum anderen kommen auch heute noch viele User nicht mit den seiteninternen Verlinkungen klar. Manche verstehen es nicht, andere kennen das Prinzip, merken aber nicht, wenn sie innerhalb der Seite gesprungen sind (dazu gehöre auch ich).

Ein weiteres Problem bei verlinkten Fußnoten ist der Rücksprung. Der Leser merkte nicht, wie weit er mit dem Link nach unten gesprungen ist. Er muss zurückscrollen und die ursprüngliche Textstelle suchen.

Eine reverse Verlinkung der Fußnoten ist denkbar, aber ebenfalls ungewohnt, und umständlich zu realisieren.

2.2.2 ) Verweise

Klammerverweise im Fließtext sind am einfachsten und dürften aus meiner Sicht für Webseiten empfehlenswert sein.

Zwar sind sie gelegentlich schwer lesbar, aber da keine Platznot wie im Printbereich herrscht, können Zitate und/oder Fundstellen formatiert werden, z.B. durch Leerzeilen und Einrückung.

Beispiel:



Eine Verschlüsselung von Daten mit höchster Wichtigkeit ist erst bei einer Verschlüsselung ab dem dritten Grad sinnvoll

vergleiche "Aspekte der Kryptografie" von Gustav Ganz
http://www.gustav-ganz.de/aufsaetze/kryptografie.html

Dazu sind folgende Schritte notwendig ....



Kapitel 3) Verweisziele

3.1) Unbrauchbar sind Verweise auf eine domain als solche, also auf die Webpräsenz insgesamt. Pauschal verweisende Hyperlinks sind zwar im Web üblich, aber immer seltener. Die zunehmende Informationsflut zwingt dazu, die Verweise etwas genauer zu setzen.

Traditionell üblich und auch für Onlineliteratur empfehlenswert ist ein eingegrenzter Verweis auf den konkreten Abschnitt oder ein bestimmtes Kapitel. Denkbar sind:

3.1.1) bei kleinen Aufsätzen ein pauschaler Verweis auf die entsprechende HTML-Seite

3.1.2) bei zerlegten Aufsätzen, die auf mehrere HTML-Seiten verteilt ist, dürfte der pauschale Verweis auf die Seite ebenfalls kein Problem sein.

3.1.3) bei größeren Aufsätzen ergeben sich mehrere Ansätze:

a) Seitenanker, auf die verwiesen werden kann (seiteninterne Hyperlinks)

b) Gliederung des Textes mit Verweis auf Kapitel bzw. Abschnittnummer.


(z.B. auf "Kapitel 4", oder auf "Abschnitt IV", oder " Kapitel vierzehn", oder einfach " IV", oder, wie versuchsweise hier: "1.2.2.")


c) Verwendung von Randnummern, wie sie oft auch in der Fachliteratur verwendet wird

3.2) Zu den Seitenankern

Diese sind unsichtbar für den Leser. Der Leser muss auch nichts davon merken, der Anker sorgt nur dafür, dass ein Dritter von außen auf diese Stelle linken kann, und der Browser genau an diese Stelle hüpft. Die oben genannten Probleme für seiteninterne Links gelten hier nicht, denn es geht nicht um die Frage, ob man mit Ziffern auf die am Seitenrand stehenden Fußnoten linken soll, wobei bei den Fußnoten erst der Verweis auf einen anderen Aufsatz steht.

Hier geht es vielmehr darum, wie ein Schreibender die Stellen markieren kann, damit ein Dritter auf einen bestimmten Abschnitt verweisen oder linken kann.

Allerdings bleibt das Problem, wie Dritte solche Anker erkennen können.

3.3). Zu der Kapitelnummerierung

Diese habe ich testweise hier versucht. Nicht ausreichend ist dabei eine Quelltextformatierung mit H1, H2 usw. Notwendig ist ein lesbarer Gliederungspunkt.

Ein interessanter Aspekt dabei ist, dass die Formatierung mit H1 etc. aus Gründen der Barrierearmut oder Barrierefreiheit erwünscht ist, zumindest optimal wäre. Sehbehinderte, die sich über Hilfsmittel am Quelltext orientieren, erhalten hier wertvolle Informationen über die Gliederung einer Seite. Allerdings fällt meines Erachtens dieser Aspekt weg, wenn die Gliederung sowieso im Text selbst erscheint.

Ein zusätzlicher Vorteil der Kapitelnummerierung ist, dass der Text auch auf eine andere Seite übertragen werden kann. Ob man trotzdem zusätzlich einen Anker beim entsprechenden Kapitel einbaut, ist Geschmackssache.

3.4). Zur Verwendung von Randnummern.

Diese werden in Büchern unabhängig von einer zusätzlichen Gliederung am Seitenrand fortlaufend durch den ganzen Text hindurch notiert, und zwar immer am Seitenrand NEBEN dem Text.

Diese vom Autor willkürlich gesetzten Randnummern kennzeichnen aufeinander folgende Gedanken oder Aspekte, unabhängig davon, ob sie sich innerhalb eines Absatzes befinden oder sich erst alle paar Absätze wiederholen. Hintergedanke ist dabei die Zitierbarkeit mit genauer Zielangabe.

Der Verweis des Dritten auf diese Textstelle sieht dann etwa so aus:


vgl. Siegfired Smoerebroet, "Kryptografie im email-Verkehr", Randnummer 24 www.bertram-boedecker.de/kryptografie.html


Solche Randnummern lassen sich aber bei HTML-Texten nur umständlich realisieren. Man müsste mit relativer oder absoluter Positionierung arbeiten.

3.5) Eine weitere Möglichkeit wäre eine Einbindung als PDF-Datei. Dort gibt es feste Seiten mit Seitenumbrüchen, idR auf DIN-A 4 abgestimmt. Dann ist der übliche Verweis auf die konkrete Seite möglich.

Zur Technik: Der teuere Original Adobe Acrobat Writer ist nicht notwendig; es genügt ein normaler Text, auch aus Word oder OpenOffice-Dateien.

OpenOffice, eigentlich "OpenOffice.org"



vgl. http://de.wikipedia.org/wiki/OpenOffice

ferner: http://www.user-archiv.de/openoffice.html



kann Texte ohne Umweg direkt als PDF speichern (Exportieren). Text aus MS-WORD-Dateien kann mit FreePDF oder anderen Freewaremethoden in PDF umgewandelt werden.

Ein in HTML-Form liegender Text, den man z.B. schon früher in einer Webseite verwendet hat, kann durch eine ganz simple Methode auf OpenOffice übertragen werden. Es genügt ein Markieren auf der Browseroberfläche (nicht im Quelltext!), Kopieren und Einfügen. Herrlich ist dabei der Effekt, dass die Formatierungen (Fettschrift, Einrückung etc) mitgenommen werden. Dann das Ganze abspeichern im PDF-Format (Exportieren)

Kapitel 4) Allgemeine Gedanken zu Verweisen

4.1) Meines Erachtens sollte es auch im Web üblich sein, die Namen der Autoren zu nennen, auch wenn man dies im Web nicht allzu oft erlebt. Dies war auch eines der Grundprinzipien des User-Archivs beim Einstellen von Fundstellen in das Linkarchiv. Wir haben es deshalb nie als Linkarchiv, sondern als Literaturarchiv bezeichnet. Der link führte auch nie pauschal auf eine Webpräsenz, sondern auf einen bestimmten Beitrag, der mit Titel und Autor bezeichnet wurde. Dass wird dabei nach Möglichkeit auch den Autor nannten (er hat ein eigenes Feld in der Datenbank) ist nach meiner Auffassung eine Sache des Respekts und der Achtung. Schade ist es immer, wenn wir hervorragende Aufsätze finden, die mit einem Nickname oder Kürzel unterzeichnet sind.

4.2) Weiter denke ich, dass sich die zusätzliche Angabe der URL (Webadresse) empfiehlt, auch wenn sie sicherlich nicht notwendig ist.

Auch dies war eine Überlegung bei der Ausgestaltung des User-Archivs. Wir haben deshalb im Laufe der Jahre die generierten Linklisten so umgestellt, dass sowohl der Titel, als auch die komplette Webadresse erscheint. Sollte die Liste versehentlich als Plaintext abgespeichert worden sein, ist sie immer noch hilfreich.

4.3) Meines Erachtens . ist es auch sinnvoll, die URL selbst , und nicht nur den Titel zu verlinken. Die Umwandlung in einen Link kann dann bei PHP-basierten Systemen automatisch durch das Skirpt erfolgen, etwa bei der Speicherung oder später bei der Auswertung.

4.4) Es ist überlegenswert und wünschenswert, von den in Mode kommenden englischen Abkürzungen wegzugehen und die klassischen, schon jeher verwendeten Abkürzungen zu verwenden. Diese sind außerhalb von Fachaufsätzen oder der wissenschaftlichen Literatur zwar nicht sehr bekannt, aber schnell eingeführt und leichter zu merken. Beispiele:

  • IMHO (in my honest opinion) = m.E. (meines Erachtens)

  • e.g. = z.B. (zum Beispiel)

Dass die englischen Ausdrücke verwendet werden, kann man niemand vorwerfen. Die Ausdrücke werden von IT-Profis in der englischen Literatur gelesen und verständlicherweise übernommen. Schließlich besteht ein Bedarf danach. Das Ganze hätte sich wahrscheinlich nicht so entwickelt, wenn die in der Fachliteratur traditionellen Abkürzungen allgemein bekannter gewesen wäre. Dann hätte man viel einfacher hierauf zurückgreifen können.

Nun, das lässt sich nachholen ;-) Und zum Cool-Sein reichts auch, schließlich ist Wissen und Bildung wieder in.

4.5). Weitere üblichen Abkürzungen bei Verweisen in der traditionellen Fachliteratur

  • vgl = vergleiche (entspricht "siehe")
  • mwN = mit weiteren Nachweisen (dort findet man weitere Fundstellen bzw. Verweise)

  • für viele = nur ein Verweis auf einen beispielhaft herausgesuchten Artikel mit dem Hinweis, dass es hierfür viele andere Fundstellen gibt, in denen dasselbe behauptet wird

4.6) Eine Übernahme weiterer Wendungen (gleichgültig, ob abgekürzt oder nicht) aus der wissenschaftlichen Literatur wäre auch in gewöhnlichen Diskussionen oder Aufsätzen zu stritten Themen wünschenswert, wahrscheinlich aber schwer durchsetzbar.

str = streitig; auch:"umstritten"

h.M. = herrschende Meinung

ü.M. = überwiegende Meinung

a.A. = anderer Ansicht

Beispiel:

nach h.M. ist CSS bisher nicht dafür gedacht und vom Ansatz her nicht sonderlich geeignet, für Spaltenlayout zu sorgen. Trotzdem setzt sich das CSS-basierte Spaltenlayout immer mehr durch. Dies ist meines Erachtens auch sinnvoll, da es der Barriefreiheit dient (streitig; so wie hier: Alfons, www.alfons.de/barrierefrei.html, Betram, www.bertram.de/webdesign/csslayouts.html; a.A. Dora (www.dora.de/tabellen-vs-css.html m.w.N)

Als "Wünschenswert" habe ich dies bezeichnet, weil mittlerweile in vielen Web-Bereichen eine Meinungsbildung stattfindet, die im Grunde der wissenschafltichen Arbeit gleichsteht. Und zwar geht es nicht um Meinungen allgemein, sondern um die Entscheidung für bestimmte Techniken und Vorgehensweisen.

Dazu ist ein ständiger Austausch von Meinungen und Argumenten notwendig, immer mit dem Effekt, dass sich im Laufe der Zeit sinnvolle Lösungen ergeben, sich die "besseren" Argumente durchsetzen. Dies sollte allerdings möglichst schnell erfolgen, damit z.B. nicht noch mehr Webmaster an den Tücken von CSS-basierten Seitenlayout-Konzepte verzweifeln.

"Wahrscheinlich undurchsetzbar" habe ich dies genannt, weil dieser Verhaltenskodex viel Disziplin, Selbstüberprüfung, und fortgeschrittene Toleranz gegenüber anderen Meinungen kostet. Tolerenz, die man auch im wissenschafltichen bei Beginn des Studiums lernen muss.

Der Hinweis auf andere Ansichten, und das Heraussuchen von Fundstellen für das, was man in Erinnerung zu haben glaubt, zwingt aber die an einer Meinungsbildung Beteiligten zu einer fundierten Begründung, hilft anderen, sich an dieser Meinungsbildung fundiert zu beteiligen und bewirkt, dass während des gesamten Diskussionsprozesses schneller die Übersicht über Vor- und Nachteile bzw. Argumente und Gegenargumente entsteht, somit auch sich vorteilhaftere Meinungen früher herauskristallisieren.

Dies ist in wissenschaftlicher Literatur von jeher ein Muss und jemand, der sich an der wissenschaftlichen Meinungsbildung beteiligen will, ohne die Fundstellen und auch Gegenansichten zu erörtern, wird nicht sonderlich ernst genommen - bwz. deren Artikeln in Fachzeitschriften nur ungern veröffentlicht.


Nachtrag: Ein Aufsatz, auf den ich gerade gestoßen bin, zeigt sehr schön die Zitierweisen und die hier geschilderten Aspekte.


Urheberrechte bei Internetseiten, Michael Fülling
http://www.webwork-community.net/posting2550_33_0.html

Sonntag, 3. Februar 2008

Validierung von Formulardaten

Eine Aufgabe, die sich dem Webworker früher oder später stellt ist die Überprüfung von Formulareingaben, die der User sendet

a) wegen fehlender Eingaben, unlogischer Eingaben und offensichtlich fehlerhaften Eingaben (Buchstaben im Postleitzahlenfeld)

b) aus Gründen der Sicherheit

c) wegen SPAM-Schutz

Hier eine Hilfestellung für diejenigen, die sich das erste mal mit diesem Problem beschäftigen:

Merke: Grundsätzlich keine Überprüfung von Formulardaten durch Javascript oder AJAX ( so genannte "client-seitige Validierung"), auch nicht, wenn es nur eine Validierung der Gruppe a) geht. Gründe:

  • Javascript könnte deaktiviert sein, so dass sowieso eine Überprüfung durch das empfangende PHP-Skript notwendig ist. Ferner muss das empfangende PHP-Skript sowieso eine Sicherheitsvalidierung durchführen. Eventuelle Mehrbelastung des SERVERS bzw. des verarbeitenden Skripts kann vernachlässigt werden, ebenso die theoretische Zeitverzögerung beim Feedback.
  • Sofern es um Sicherheit geht, wird jeder Hacker das Javascript deaktivieren, so dass Javascript als Schutz völlig wertlos ist.
  • SPAM-Schutz ebenfalls sinnlos.
  • Da AJAX auf Javascript basiert, scheidet AJAX logischerweise ebenfalls aus.

Lösung: Überprüfung durch das empfangende PHP-Skript (so genannte server-seitige Validierung, weil die Überprüfung erst nach Empfang auf dem eigenen Server mittels PHP-Skript erfolgt.

  • Das Skript sorgt bei Fehlern für einen Wiederaufruf des HTML-Formulars, dies so oft, bis die Eingaben korrekt sind. Erst dann werden die Daten in vorgesehener Weise weiter verarbeitet. Diese Kombination von von Überprüfung und Neugenerierung des Formulars nennt man auch "Affenformular".

  • Bei dem Wiederaufruf des Formulars (denkbar wäre auch eine eigene Seite mit dem gleichen Formular) werden üblicherweise die übersandten Daten in den Feldern voreingetragen. Ferner wird man einen deutlichen Hinweis auf die Fehler in die Seite einbauen.
Die Funktionsweise des "Affenformular" ist in WIKIPEDIA etwas ausführlicher beschrieben, was allerdings bei der technischen Umsetzung nur ansatzweise Hilfen gibt: http://de.wikipedia.org/wiki/Affenformular

Eine ausführliche und empfehlenswerte Anleitung für die technische Realisierung gibt das Kapitel 27.2 in der FAQ der PHP-Newsgroup de.comp.lang.php "Von HTML zu PHP: Schreibe Formularverarbeitungen in Normalform": http://www.php-faq.de/q/q-stil-normalform.html
Zu dem Thema sind weitere Anleitungen im Netz erhältlich; das Problem ist relativ gut dokumentiert. Anfragen oder Suche in Foren sind wenig sinnvoll.

Was die Sicherheitsprüfung betrifft, empfiehlt sich als erstes die Lektüre des Kapitels "12. Sicheres Programmieren in PHP" http://www.php-faq.de/ch/ch-security.html
ferner das Kapitel über HTML-Formulare: http://www.php-faq.de/ch/ch-webvariablen.html

Die Suche nach weiteren Lösungen ist etwas schwieriger, da entsprechende Anleitungen in der Datenflut untergehen. Vor der Google-Suche kann man die Suche im User-Archiv (www.user-archiv.de) starten, da dort entsprechende Links handverlesen sind.

Was den SPAM betrifft, werden verschiedene Lösungen diskutiert. Das Spamming hat tatsächliche einige Seitenbetreiber dazu gebracht, ihre HTML-Formulare z.B. für Kommentare oder Linkvorschläge völlig zu streichen. Als Suchbegriffe für die Websuche empfehle ich "Spam", "Kommentar-Spam", "Trackback-Spam"

Folgende Ansätze werden häufig verwendet:

  1. Es wird eine Grafik eingeblendet, die Buchstaben und Zahlen enthält, die der User in einem zusätzlichen Feld eingibt (Stichwort "Captchas")
  2. Es werden typische bzw. bekannte SPAM-Absender-Adressen durch entsprechende Einträge in der htaccess-Datei oder im Verarbeitungsskript abgewehrt (Stichwort IP-Blocker)

Ein etwas gründlicherer Aufsatz über Abwehrmaßnahmen findet man auf testticker.de. Es handelt sich um einen Aufsatz von Achim Wagenkecht, erschienen in der Zeitschrift aus Internet Professionell Ausgabe 6/2006: "Know-how: Kommentar-Spam verhindern Weblog ohne Spam"
http://www.testticker.de/praxis/security/article20060514002.aspx

Captchas, zufallsgenerierte Zeichenfolgen, die schwer lesbar sind und deshalb von Maschinen nicht einfach ausgelesen werden können, sind umstritten, weil die Roboter immer intelligenter werden. Sie sind außerdem nicht barrierefrei: Die üblichen Hilfsmittel für Sehbehinderte können diese Barriere nicht überwinden.
Siehe zu Captchas auch: http://de.wikipedia.org/wiki/Captcha. Bei der Google-Suche sollte man den Begriff captchas verwenden.

Interessant für Webseitenbetreiber ist, dass es Skripte oder Codesnippets für die automatische Generierung von solchen Zufallsgrafiken gibt. Häufig wird das PHP-Skript CaptchaImageMaker genannt, das kostenlos herunter geladen werden kann. Hier die Anlaufstelle:
http://notepad.emaillink.de/2007/09/18/captchaimagemaker-schuetzt-vor-spam/

Eine Suche in den zahlreichen Skriptarchiven (statt über Google) nach Code-Snippets ist empfehlenswert. Auflistung von Skriptarchiven:
http://www.user-archiv.de/skript-archive.html

Einer von vielen Aufsätzen, hier auf "Dr. Web": Sichere Formulare - Teil 3: Pseudo-grafisches CAPTCHA mit PHP
http://www.drweb.de/webmaster/sichere-formulare-captcha.shtml

Eine weitere interessante Variante ist die Verwendung eines Schein-Feldes:

Ein zusätzliches Feld im Formular, das über CSS (display:none) ausgeblendet wird. Der normale User sieht dieses Feld nicht und weil es deshalb nicht ausgefüllt ist, wird es inhaltslos versandt. Im Falle eines Spamversuches liest ein Programm den Quelltext und das HTML-Feld aus und füllt zur Sicherheit auch dieses Feld mit aus. Der anschließende validierende Code bemerkt, dass diese Feld befüllt ist und bricht ab (gefunden über einen Hinweis von R. Hupfauf, http://www.hupfauf.net/)



Montag, 28. Januar 2008

Kopieren von Word-Texten in Wisysig-Editor

Ein Gespräch mit dem Schriftsteller, Journalisten und Lektor Peter H. Gogolin (http://ph-gogolin.blogspot.com/ und http://www.literaturbuero-gogolin.de/) brachte mich auf das alte Thema, wie Autoren vorhandene Texte, die sie mit einer Textverarbeitung geschrieben und lokal gespeichert haben, online publizieren können.

Zwei Möglichkeiten bieten sich unter anderem an:

Online-Publikation über ein Blog, oder der Einsatz einer CMS-Software (Content-Management-System), die auf dem eigenen Webspace installiert wird. Wenn es schnell und einfach gehen soll, ist die Einrichtung eines Blogs, zum Beispiel über Google bzw. blogger.com, die einfachste Methode. Bei Google einen Account anlegen, ein Blog anlegen, ein Standard-Layout wählen, das man später beliebig ändern kann, und die Texte in das Feld kopieren, in welchem ein neuer Beitrag (so genannter Post) einzugeben ist.

Einerlei, welche Methode man anwendet: in beiden Fällen wird man bei der Eingabe des Textes auf ein Eingabefeld stoßen, bei dem ein Wisywig-Editor verwendet wird, der eine Formatierung des Textes zulässt. Es gibt ein paar gängige Online-Wisyiwig-Editoren, die sowohl bei Blogger-Diensten als auch bei den verschiedenen Blog- oder Content-Management-Systemen verwendet werden (FCK-Editor, Tinymce etc.), und die sich im großen und ganzen einheitlich verhalten. Das Kopieren formatierter Texte ist jedenfalls stets möglich.

Über einen Button kann man auf den dahinterstehenden Quelltext umschalten. Auf diesen Aspekt konzentriert sich dieser Beitrag.

Vorhandene Texte zu übertragen, geht dabei ganz einfach, in dem man im parallel laufenden Textverarbeitungsprogramm den Text markiert, kopiert (über "Kopieren" oder mit STRG-C), das Fenster wechselt und den Text (über Einfügen oder STRG-V) in das Wisywig-Feld einfügt.

Das Besondere dabei: die Formatierungen werden direkt mitübertragen, und dabei automatisch in die für Webseiten geltenden Formatierungscodes übertragen. Das ist eine bemerkenswerte Leistung der Editoren, die ein blitzschnelles Übertragen formatierter Texte zulässt.

Dabei tritt beim Einsatz von MS-WORD-Texten ein typisches Problem auf, das Autoren verzweifeln lässt. Diese Dokumente arbeiten, unsichtbar im Hintergrund, mit einer Unmenge von kryptisch anmutenden Code, der leider automatisch mit übertragen wird. Das bläht den Quelltext auf, was noch nicht so schlimm sein muss; auch sieht der Quelltext häßlich aus, was aber im Grunde auch niemand etwas angeht. Sobald Sie aber manuell in den Quelltext eingreifen wollen, oder dort etwas nachsehen wollen, wird das unübersichtliche Code-Wirrwarr lästig.

Beispiel: ein beliebiger Textausschnitt aus einem Dokument mit Prüfungsaufgaben, bewusst übertrieben formatiert

  1. Ein Steuerpflichtiger gibt seine ESt-Erklärung für das Kalenderjahr 2003 am 30.4.2004 beim Finanzamt ab. Der Steuerbescheid wird vom Finanzamt am 17.7.2004 mittels gewöhnlichen Briefs zur Post gegeben. Er sieht eine Abschlusszahlung von 2.330 Euro vor.

- Wann ist der Steuerbescheid unanfechtbar (formell bestanskräftig)

- Wann wird der Steuerbescheid materiell bestandskräftig (= Ende der Festsetzungsfrist)
----------------------

Nach Übertragung in das HTML-Textfeld erscheinen im Quellcode:



ol type="1" start="1">
<li class="MsoNormal" style=""><span style="font-size: 11pt; font-family: Arial;">
Ein Steuerpflichtiger gibt seine
<strong>ESt-Erkl&auml;rung</strong> f&uuml;r das
Kalenderjahr 2003 am 30.4.2004 beim Finanzamt
ab</span><span style="font-size: 11pt; font-family:
Verdana;">. Der Steuerbescheid wird vom Finanzamt am
17.7.2004 mittels <strong>gew&ouml;hnlichen
Briefs</strong> zur Post gegeben.</span><span
style="font-size: 11pt; font-family: Arial;"> Er sieht
eine Abschlusszahlung von 2.330 Euro vor.
<o:p></o:p></span></li> </ol>
<p class="Textfeld"><!--[if !supportLists]--><span
style="font-size: 8pt;">-<span style="font-family:
&quot;Times New Roman&quot;; font-style: normal; font-variant: normal;
font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none;
font-stretch: normal;">&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;
</span></span><!--[endif]--><em><span
style="font-size: 10pt;">Wann ist der Steuerbescheid
<strong>unanfechtbar </strong><u>(formell
bestanskr&auml;ftig)</u>
<o:p></o:p></span></em></p>
<p class="Textfeld"><!--[if !supportLists]--><span
style="font-size: 8pt;">-<span style="font-family:
&quot;Times New Roman&quot;; font-style: normal;
font-variant: normal; font-weight: normal; font-size: 7pt;
line-height: normal; font-size-adjust: none; font-stretch:
normal;">&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&
nbsp; </span></span><!--[endif]--><em>
<span style="font-size: 10pt;">
Wann wird der Steuerbescheid <u>materiell bestandskr&auml;ftig
</u> (= Ende der Festsetzungsfrist)
<o:p></o:p></span>
</em></p>
<p class="MsoNormal"><
!--[if !supportEmptyParas]-->&nbsp;<
!--[endif]--><o:p></o:p></p>


-------------

In diversen Foren wird dann nach Möglichkeiten gefragt, solche Texte umzuwandeln, insbesondere, ob es geeignete Konverter gibt, die Word-Texte in HTML umwandeln.

Die Antworten sind enttäuschend und bei der Suche nach einem wirkliche funktionierenden Programm vergeht viel Zeit. Meine damaligen Recherchen über eine Umwandlungssoftware, allerdings schon 2 Jahre alt, waren faktisch erfolglos. Es kam nichts wirklich brauchbares heraus.

Weitere Experimente waren: Abspeichern von Word-Dokumenten innerhalb von Word als Rich-Text-Datei. Nur einfachste Formatierungen können in diesem Format gespeichert werden (fett, kursiv etc). Danach Datei schließen, neu aufrufen, kopieren und übertragen. Ergebnis: Die Methode funktioniert nicht: die speziellen Word- Formatierungen blieben erhalten.

Selbst ein Abspeichern als reine Textdatei mit Zeilenumbrüchen würde die Formatierungen mitschleppen. Aber diese Methode scheidet sowieso aus, weil ja Formatierungen wie fett, kursiv, Einrückungen und Aufzählungszeichen erhalten bleiben sollen.

Als einzige halbwegs brauchbare Möglichkeit, immer unter der Prämisse der Geschwindigkeit, blieb für mich ein Übertragen der Texte auf eine leere Datei im Freewareprogramm "OpenOffice.org" (landläufig OpenOffice genannt), dort speichern im hauseigenen Format, dann aus diesem Textdokument heraus nochmal markieren, kopieren und in das HTML-Eingabefeld übertragen. Damit werden nicht alle Formatierungen beseitigt, aber die meisten.

Eine mindest genauso gut funktionerende Variante ist das direkte Öffnen der Worddatei im Open Office-Programm. Das Programm akzeptiert Worddokumente, wandelt es also automatisch ins hauseigene Format um. Meiner Erfahrung nach scheitert die Umwandlung nur bei sehr komplexen Formatierungen, z.B. auf spezielle Weise positionierte Textfelder. Die Positionierungen werden u.U. verhackstückt. Ansonsten funktioniert das erstaunlich problemlos.

Wenn man dann diesen Text im OO-Dokument kopiert und überträgt, scheinen nochmehr von den Spezial-Formatierungen verschwunden zu sein. Es erscheinen fast nur noch die üblichen HTML-Formatierungen, die der Wisywig-Editor automatisch angelegt hat.

Selbst wenn man viele Dokumente hat, die übertragen werden sollen, scheint mir diese Prozedur noch immer schneller zu sein, als tagelang nach Konverter-Lösungen zu suchen. Vor allem, da diese Aktion in der Regel einmalig ist. Gleichzeitig kann man die Text für künftige Verwendungen im OpenOffice-Format abspeichern.

Start

Und es geht los.

Quereinsteiger - Manifest

Der berufstätige Webworker ist überfordert. Webworker, das sind alle, die Webseiten erstellen, schreiben, programmieren, administrieren. Sie können sich nicht auf ein Teilgebiet konzentrieren, wie etwa ein Programmierer oder Designer in einem IT-Unternehmen, sondern müssen Allrounder sein: Kaufmann, Selbstvermarkter, Kundenbetreuer und -babysitter, Designer und php-Programmierer. Sie müssen organisieren, sich mit Personalwesen herumschlagen, über Steuern Bescheid wissen, Rechnungswesen beherrschen, sich um Server, Hosting, Apache- und PHP-Einstellungen kümmern.

Und wenn ein Projekt ansteht, sei es ein eigenes oder für Dritte, sei es kommerziell oder nicht kommerziell, ist die Zeit stets zu knapp. In dieser Situation dann muss der Webworker sich mit HTML-, CSS-, PHP- oder mysql-Tücken herumschlagen, mit htaccess und mod_rewrite. Er muss in Windeseile experimentieren, Aufsätze recherchieren und lesen, dann, immer noch überfordert, in Foren nachfragen.

Diesen überforderten Webworkern ist dieses Blog gewidmet. Ich gebe hier Lösungen, Studien und Erfahrungen aus den letzten neun Jahren weiter, die das Arbeiten rationell machen sollen.

Warum Quereinsteiger? Nun diesen Leuten gilt meine besondere Sympathie. Webworker, die nebenher noch andere Berufe haben oder hatten, die anfingen, Webseiten zu schreiben, zunächst für sich, dann vielleicht auch für Freunde, Vereine. Im Laufe der Zeit kamen vielleicht auch kommerzielle Aufträge über Seiten für Unternehmen hinzu. Für sie ist der Zeitdruck besonders schlimm - denn sie haben Inhalte zu transportieren, und wollen keine php-Programmierer oder CSS-Spezialisten werden.

Diese Autodidakten gibt es in Hülle und Fülle. Journalisten, Physiker, Steuerfachleute, Dozenten aller Branchen, Autoren, Künstler, Fotografen, Theaterschauspieler und und und ... Ich gehöre auch dazu. Seit 1989, um genau zu sein, als ich die ersten Schritte machte.

Ich werde hier nicht nur Praktisches weitergeben, sondern dazwischen auch meine Experimente, für alle, die kreativ und avantgardistisch sind. Denn dieses andere Extrem ist auch in mir.