CGI-Beispiel: Formular


Zum Text der Seite

Inhalt

Beispiel 2 - ein kleinea Formular

Dieses Beispiel stammt aus einem älteren Kurs und wird im Kurs Einführung in dynamische Web-Seiten mit PHP/MySQL wesentlich eleganter und vollständig gelöst

Erfassung der Wunschzensuren der Kursteilnehmer
Name: Vorname: Geschlecht: Bereich:
Zensur:   1   2    3    4    5    6

HTML-Quellcode des Formulars (ohne Layout-Tabelle>:

<form method="post" action="http://pool.urz.uni-halle.de/cgi-bin/kurse/daten.cgi" target="_blank">
  <fieldset>
    <legend>Erfassung der Wunschzensuren der Kursteilnehmer</legend>
    <input type="hidden" name="record" value="0">
      Name: 
      <input type="text" name="nachname" size="20" maxlength="48">
      Vorname: 
      <input type="text" name="vorname" size="20" maxlength="48">
      Geschlecht: 
      <select name="geschlecht">
        <option value="0" selected>weiblich</option>
        <option value="1">männlich</option>
      </select>
      Bereich: 
      <input type="text" name="bereich" size="32" maxlength="128">
      Zensur:
      1 <input type="radio" name="zensur" value="1" checked>
      2 <input type="radio" name="zensur" value="2">
      3 <input type="radio" name="zensur" value="3">
      4 <input type="radio" name="zensur" value="4">
      5 <input type="radio" name="zensur" value="5">
      6 <input type="radio" name="zensur" value="6">
      <input type="submit" name="submit" value="Abschicken" class="taste" title="Daten absenden">
      <input type="reset" name="reset" value="Zurücksetzen" class="taste" title="Felder zurücksetzen">
    </fieldset> 
  </form>

Datenstruktur des Formulars:

die Name der Formularelemente (Eingabefelder, Knöpfe u. a.) sind auf das Engste mit dem CGI-Programm verknüpft. D. h., Formular und CGI-Programm bilden eine Einheit.

Falls für eine Aufgabe ein CGI-Programm vorliegt, müssen Sie im Formular die vom Programm vorgegebenen Namen benutzen.

Tab. 15: Daten des Formulars
Formularelement HTML-Tag CGI-Daten
Action <form method="post" action="http://pool/cgi-bin/kurse/daten.cgi" name="daten"> method=GET|POST
interne Satznummer <input type="hidden" name="record" value="0"> record=int.Satznummer
Name <input type="text" name="nachname" size="20" maxlength="48"> nachname=Nachname
Vorname <input type="text" name="vorname" size="20" maxlength="48"> vorname=Vorname
Geschlecht <select name="geschlecht">
<option value="0" selected>weiblich</option>
<option value="1">männlich</option>
</select>
geschlecht=0|1
Bereich <input type="text" name="bereich" size="32" maxlength="128"> bereich=Bereich
Zensur <input type="radio" name="zensur" value="1" checked>
<input type="radio" name="zensur" value="2">
<input type="radio" name="zensur" value="3">
<input type="radio" name="zensur" value="4">
<input type="radio" name="zensur" value="5">
<input type="radio" name="zensur" value="6">
zensur=1|2|3|4|5|6
Abschicken <input type="submit" name="submit" value="Abschicken"> submit=Abschicken
Zurücksetzen <input type="reset" name="reset" value="Zurücksetzen"> [nichts]

Quelltext des CGI-Programms

Achtung - dies ist nur ein Demo-Programm - es kann aus Gründen der Sicherheit und Zuverlässiglkeit nicht 1:1 übernommen werden!

/****************************************************************
 * CGI-Programm zur Bearbeitung des Formulars im Kurs 
 * Web-Design (Zensuren).
 *
 * daten.c  Version 1.0: 
 *    (C) Ulrich Kehl, URZ der Uni Halle 2001 
 *    kehl@urz.uni-halle.de
 *
 * History:
 *    15. 6. 2001 - Version 1, Beginn der entwicklung.
 *
 * License:
 *    GPL
 *
 ********************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>

/*** globale Variable ***/
static char localhost[]="127.000.000.001";    /* IP-Adresse d. Clienten */
static char name[PATH_MAX+1];                 /* Name des Programms */

char * get_cgi_value ( char *, char * );
void put_html_page ( int, char *, char *, int, char *, int );
void message_and_exit ( int, char * );

/*******************************
 *** Hauptprogramm daten.cgi ***
 *******************************/
int main ( argc, argv )
int argc;
char **argv;
{
    char        *strings, *buffer;            /* Hilfsgroessen */ 
    int         nread, content_length;

/*  Variablen fuer die Formulardaten mit RICHTIGER Laenge */
    char        vorname[49], nachname[49], bereich[129];
    int         geschl, zensur, record;

/*** Name des Programms bestimmen ***/
    strings = strrchr ( argv[0], '/' );
    if ( ! strings )
        strings = argv[0];
    else 
        strings++;
    strcpy ( name, strings );

/*** HTTP-Header ausgeben ***/
    printf ( "Content-Type: text/html\n\n" );

/*** Abfragen der Umgebungsvariablen ***/
/*** IP-Adresse des Clienten ***/
    strings = getenv ( "HTTP_X_FORWARDED_FOR" );
    if ( ! strings )
        strings = getenv("REMOTE_ADDR");
    if ( strings )
        strcpy ( localhost, strings );
/*  Aufruf von unerlaubten Rechnern */
    if ( ! strstr(localhost,"141.48.144") && ! strstr(localhost,"141.48.3"))
        message_and_exit ( 32, "Formular darf nur im URZ-Pool"
                           " benutzt werden !" );

/*** CGI-Datenuebernahme  ***/
    strings = getenv ( "REQUEST_METHOD" );    /* GET oder POST */
    if ( ! strings ) 
        message_and_exit ( 16, "Programm nicht als HTML-ACTION gerufen !" );

/*  method=POST */
    content_length = 0;
    if ( strcmp(strings,"POST") == 0 ) { 
        content_length = atoi(getenv("CONTENT_LENGTH"));
        buffer = calloc ( (content_length+1), sizeof(char) );
        nread = fread ( buffer, sizeof(char), content_length, stdin );
        if ( nread != content_length ) {     /* interner Fehler */
            message_and_exit ( 4, "Fehler beim Lesen der Daten" );
        } 
        *(buffer+nread) = '\0';
/*  method=GET */
    } else {
        buffer = getenv ( "QUERY_STRING" );
        content_length = strlen ( buffer );
    }

/*** Daten wieder in ASCII konvertieren und auf Variablen Speichern ***/
    strcpy ( vorname, get_cgi_value("vorname",buffer) );
    strcpy ( nachname, get_cgi_value("nachname",buffer) );
    geschl = atoi ( get_cgi_value("geschlecht",buffer) );
    strcpy ( bereich, get_cgi_value("bereich",buffer) );
    zensur = atoi ( get_cgi_value("zensur",buffer) );
    record = atoi ( get_cgi_value("record",buffer) );

/*** Test der Daten (als Beispiel ) ***/
    if ( ! strlen(nachname) )
        message_and_exit ( 2, "Sie haben vergessen,"
                           " Ihren Namen einzugeben !" );

/*** Verarbeitung der Daten ***/
/*** Hier sollten die Daten z. B. in eine Datenbank gespeichert werden ***/
    put_html_page ( record, vorname, nachname, geschl, bereich, zensur );

/*** Programm beenden ***/
    if ( buffer )
        free ( buffer );

    exit ( 0 );
}

/***** Unterprogramme *****/

/*** CGI-Value nach Namen suchen und in ASCII konvertieren ***/
char *get_cgi_value ( char *name, char *buffer )
{
    char *s = buffer;
    int n = 0;
    char hex_char[] = "xx";
    static char value[129] = "value not set";

/*** Namen suchen ***/
    while ( 1 ) {
        s = strstr ( s, name );
        if ( ! s )
            return ( value );
        if ( *(s+strlen(name)) == '=' )
            break;
    }

/*** Value konvertieren ***/
    s += strlen(name)+1;
    while ( s ) {
        switch ( *s++ ) {
        case '&':
            value[n++] = '\0';
            return ( value );
        case '+':
            value[n++] = ' ';
            break;
        case '%':
            hex_char[0] = *s++; hex_char[1] = *s++;
            value[n++] = (unsigned char)strtol ( hex_char, NULL, 16 );
            break;
        default:
            value[n++] = *(s-1);
        }
    }
    return ( value );
}

/*** Fehlernachricht ausgeben und Programm beenden ***/
void message_and_exit ( int code, char *text )
{

/*** HTML-Geruest ***/
    char html[] = {
"<html>
<head>
<title>Fehlermeldung</title>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">
</head>

<body bgcolor=\"#660066\" text=\"#FFFF99\">
<h1 align=\"center\">Fehler im CGI-Programm %s</h1>
<p><font size=\"+1\">Fehler-Nr.: <b>%d</b>, Text: <b>%s</b></font></p>
<p><b><font size=\"+1\">Formular bitte nochmals absenden! Danke!</font></b></p>
</body>
</html>"
    };

/*** Fehlernummer und -text in HTML basteln (lassen) ***/
    printf ( html, name, code, text );
    fflush ( stdout );

/*  Programm beenden */
    exit ( 0 );
}

/*** Als Arbheitsaufgabe von daten.cgi NUR! Ausgabe dieser 
     in einer HTML-Seite ***/
void put_html_page ( int record, char *vorname, char *nachname, 
                     int geschl, char *bereich, int zensur )
{

/*** HTML-Geruest ***/
    char html[] = {
"<html>
<head>
<title>Antwort</title>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">
</head>

<body bgcolor=\"#000066\" text=\"#CCFFFF\">
<h2 align=\"center\"><font color=\"#FFFFFF\">Quittung</font></h2>
<p><font size=\"+1\">Sehr geehrte%s 
  <font size=\"+2\"><i><b>%s %s</b></i></font>, 
  Ihre gewünschte Zensur <font size=\"+2\"><b><i>%d</i></b></font> 
  wird im Bereich <font size=\"+2\"><i><b>%s</b></i></font> 
  registriert und nicht berücksichtigt!</font></p>
<p><font size=\"+1\">Viel Erfolg im Kurs !</font></p>
</body>
</html>"
    };

/*** Ausgabe ***/
    printf ( html, (geschl?"r Herr":" Frau"), vorname, 
        nachname, zensur, bereich );

    fflush ( stdout );
}

/***** End Of File *****/

Anfang
  Seitenanfang
 Trennstrich  ...Zählervorherige Seite  Trennstrich  nächste SeiteHTML...

Kurs Web-Design