|
[CGIProgrammierung unter C] |
HTML (Hyper Text Markup Language) ist eine reine Formatierungsprache. Das bedeutet, dass diese Sprache lediglich dazu dient, um Elemente einer Webseite Visuell zu positionieren. Diese Informationen werden an den Browser übergeben, dieser Interpretiert sie, setzt diese dann in das sichtbare HTML Dokument um, welches anschliessend im Browser zu sehen ist. Direkte Programmabläufe sind in der HTML-Sprache nicht möglich. Zudem werden die Kompletten Daten der sichtbaren Webseite bei dem Benutzer hinterlegt.
Soll nun eine Anwendung, wie z.B. eine Suchabfrage, ein Gästebuch oder einfach nur die Aufgabe ein Bestätigungsformular auszugeben, verwendet werden, so wird nun ein Ausführbares Programm von der HTML-Seite angesprochen. Diese Programme die solche Aufgaben erledigen nennen sich CGI –Programme (CGI = Common Gateway Interface). CGI Programme können grundsätzlich in fast allen Programmiersprachen geschrieben werden. In diesem Fall halt eben in C.
Ein CGI-Programm läuft auf einem Server und gibt einfach die Daten für eine HTML Seite mit den entsprechenden Werten an den Browser zurück. Das CGI-Programm, dass eine Seite zurückgibt, wird im Gegensatz zu dem restlichen Teil der Webseite nicht heruntergeladen, sondern bleibt auf dem Server und wird von dort aus ausgeführt.
Der Vorgang:
- Die HTML-Datei sendet die Eingegebenen Daten über ein Formular zu
- Das CGI-Programm erhält eine Zeichenkette mit den entsprechenden Daten, die anschließend verarbeitet werden.
- Das Ergebnis der verarbeiteten Daten wird nun in Form einer HTML-Seite zurück an den Browser gesendet.
- Aufbau der HTML-Datei
Die HTML-Datei, in denen der/die Wert/e eingegeben werden muss ein Formular enthalten, welches die entsprechenden Daten aufnehmen und versenden kann. Dieses Formular wird in den Body (dieser befindet sich zwischen den Beiden Body Tags <body> und </body>) der HTML-Seite eingefügt.
![]()
Das Formular wird durch die beiden Tags <form ...> und </form> deklariert. D.H. dass der Browser die HTML-Datei einliest und anhand des <form ...> Tags erkennt, dass das Formular dort anfängt und bei </form> erkennt, dass das Formular zu ende ist. Im ersten Form Tag werden die Werte zum senden der Daten festgelegt. Hier werden Daten wie das auszuführenden Programm (action) und die Art der Übermittlung (method) festgelegt.
Zwischen diesen beiden Tags befinden sich die entsprechenden Eingabefelder, gekennzeichnet durch den Tag < input ...>. In ihnen wird festgelegt, welche Art von Eingabefeld im HTML-Dokument erscheinen soll und welche Ausgabe dieses erfüllen soll. In diesem Beispiel wird bei dem ersten Eingabefeld ein Textfeld erscheinen, um einen Wert einzugeben und im zweiten Eingabefeld wird das Eingabefeld des Buttons Submit festgelegt.
Diese HTML-Datei muss vorhanden sein um eine Eingabe von Daten zu ermöglichen.
- Aufbau des C-Programms
Ziel des Programms: Das Programm soll die Daten aufnehmen, diese verarbeiten und letztendlich die Daten wieder ausgeben.
3.1 Übergabe der Parameter
Zunächst soll es möglich sein die Umgebungsvariablen zu übernehmen. Die Prozedur ist denkbar einfach. Das Formular übergibt die Daten in dieser Form:
![]()
In diesem Fall wurde im Feld "Wert" Der Text "dies ist ein text" eingegeben. Die Umgebungsvariable wird mit diesem Programm aufgerufen. Um an die Daten der Umgebungsvariable gelangen zu können muss man natürlich erst einmal wissen wie diese heisst. Da es zwei Möglichkeiten gibt Daten zu übergeben ( GET oder POST ) gibt es auch zwei verschiedene Umgebungsvariablen. In unserem Fall benutzen wir die Methode GET, welche die Umgebunsvariable "QUERY_STRING" benutzt. Nun muss das aufgerufene Programm nur noch an diese Umgebungsvariable herankommen. Die geschieht mit dem Befehl getenv. Dieser Befehl ist in C in der stdio.h Headerdatei enthalten. Er wird wie folgt im Zusammenhang mit einer GET Umgebungsvariablen aufgerufen:
![]()
3.2 Ausgeben des Parameters
Die Ausgabe der Antwortseite geschieht über den Befehl printf. Will man nun die Umgebungsvariable "QUERY_STRING" ausgegeben geschieht dies so:
Soll diese Ausgabe nun in dem Browser zu sehen sein, so muss eine komplette HTML-Seite in dem Programm ausgegeben werden. Vorweg muss aber noch eine Ausgabe stehen, die dem Browser übermittelt, welche Art von Datei nun Folgt.
Dies wird so übermittelt:
Soll nun eine Eingabe gefolgt von einer Ausgabe mit dem Inhalt des Wertes der Eingabe erscheinen, so sieht der Quellcode dieses Programms so aus:
ACHTUNG: Dieses Programm muss in einem Verzeichnis liegen, welches auf dem HTTP-Server als CGI-BIN Verzeichnis angegeben ist! Ansonsten funktioniert dieses Programm nicht, weil der Browser sonst versucht dieses Programm herunterzuladen anstatt es auszuführen.
3.3 Weiterarbeiten mit Werten aus der Umgebungsvariable
Bis jetzt ist es geschafft ein Programm zu schreiben, welches über eine Ein- und Ausgabe verfügt. Doch nun soll der Wert der Umgebungsvariablen übergeben werden und dieser soll letztendlich weiterverarbeitet werden, da man mit dem alleinigem Wert der Umgebungsvariablen nichts anfangen kann. Deshalb soll der Wert der Umgebungsvariablen an eine andere Variable übergeben werden, womit dann anschließend weitergearbeitet wird. Die Übergabe ist dennoch nicht gerade einfach, da eine normale Übergabe des Inhalts der Variablen an einem Speicherfehler scheitert. So muss nun die Variable, die den Inhalt aufnehmen soll eine bestimmte Grösse zugewiesen werden. Zudem muss die Variable ein Zeiger haben, damit diese den Inhalt aus der Umgebungsvariable übernehmen kann.Alles in allem sieht dies so aus:
In der ersten Zeile wird der Variablen (string), in der der Inhalt der Umgebungsvariablen gespeichert werden soll, die Grösse zugewiesen. In der zweiten Zeile wird der Variable dann der Wert der Umgebungsvariable zugewiesen. Die Variable string wird wie folgt deklariert:
Somit ist erreicht, dass der Wert ohne Problem übernommen werden kann. Nun kann mit dieser Variable bequem weitergearbeitet werden.Das nun aufkommende Problem ist das Entnehmen der Werte aus der Umgebungsvariable. Geht man davon aus, das ein Formular mit zwei Eingabefeldern, einmal für den Vor- und einmal für den Nachnamen verwendet wurden und der Vorname Willi und der Nachname Meier ist, so entsteht darauf folgende Umgebungsvariable:
Nun muss diese Zeichenkette auseinander genommen werden. D.H. :
- es wird jeder Buchstabe bis zu einem gleich einzeln durchlaufen,
- bei einem & Zeichen ist der Wert zuende und ein neuer fängt an.
- der letzte Teil der Zeichenkette in diesem fall : &send=Anfrage+Senden wird einfach nicht beachtet und ausgelassen.Nun muss eine Prozedur geschrieben werden, die genau diese Werte herausfiltert und diese einzelnen Werte (Vornamen und Nachnamen) jeweils einer Variablen zuweist. Zu beachten ist, dass das ende der Variablen immer durch das die Zeichenfolge \0 gekennzeichnet ist. Also muss so lange gefiltert werden bis ein Vektor (ein Zeichen aus dem Wert einer Variablen) in der Char variablen den Wert \0 enthält.
Ein Beispielscript:
3.3.1 Hexadezimalzahlenumwandlung
Doch nicht nur das + Zeichen ist zu beachten. Werden Sonderzeichen oder Umlaute wie ä, ö, ü verwendet so werden diese als Hexadezimalzahl dargestellt. Grund dafür ist, dass man sonst kaum noch eine Möglichkeit hätte vernünftig mit der Umgebungsvariablen zu arbeiten. Also muss nun der Inhalt der Umgebungsvariablen auch nach diesen Werten durchsucht werden und anschliessend umgesetzt werden.
Der Hexadezimalwert wird daran Erkennbar, dass vor diesem Wert ein % Zeichen steht. Die darauf folgenden zwei Zeichen gehören zum Hexadezimalwert. Beispiel:
![]()
Jeder Umlaut bzw. jedes Sonderzeichen hat seinen eigenen Wert. Es gilt nun diesen Wert herauszufiltern und diese Zeichen durch ein einzelnes zu ersetzen.
Dies muss nun mit jedem einzelnen Sonderzeichen und Umlaut geschehen, der auch Übersetzt werden soll.
Hilfreiche Quellen:
SELFHTML - http://www.teamone.de/selfhtml/tga.htm ff.
|
Verfasser: Sven Wagener Euer Sven Wagener 24.07.2000 |