tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
362
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    yax yax ist offline Mitglied Gold
    Registriert seit
    Jul 2010
    Beiträge
    175
    Hallo,

    ich habe folgendes Problem:

    ich schreibe eine Webseite die aus verschiedenen Textfeldern Daten ausliest. Wenn ich jetzt aber nicht alle Textfelder ausgefüllt habe, funtkioniert mein CGI-Programm nicht. Ich möchte aber, dass es dem User selber überlassen ist, wieviel textfelder er ausfüllt.

    Hier mein HTML-Code:
    HTML-Code:
    <html>
    <head>
    <title>Allgemein</title>
    </head>
    
    <body>
    
    <center><h2>Allgemeines</h2></center>
    
    <form action="http://localhost/cgi-bin/speichern.cgi">
    <pre>
    <b>Wohnort     : </b><input name="Wohnort" type="text" placeholder="Wo wohnst du?" size="28"><br><br>
    <b>Heimatstadt : </b><input name="Heimatstadt" type="text" placeholder="Wo bist du aufgewachsen?" 
    
    size="28"><br><br>
    <b>Sprachen    : </b><input name="Sprachen" type="text" placeholder="Welche Sprachen sprichst du?" 
    
    size="28"><br><br>
    <b>Über mich   : </b><textarea name="UeberMich" cols="20" rows="4" placeholder="Was kannst du über dich 
    
    sagen?"></textarea>
    </pre><br>
    <center><input type="image" src="speichern.jpg"></center>
    </form>
    
    </body>
    </html>
    Und mein CGI-Programm:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX_PAARE 255
    #define BUF 255
     
    struct CGI_DATEN {
      char *variable;
      char *wert;
      struct CGI_DATEN *next;
    };
     
    struct CGI_DATEN *ende = NULL;
     
    char *Strdub(char *str) {
         char *puffer = (char *)malloc(strlen(str)+1);
         if(puffer == NULL)
           return NULL;
         strcpy(puffer, str);
         return puffer;
    }
     
    char *getdata(void) {
         char *methode = getenv("REQUEST_METHOD");
         char *puffer;
         char *str, *cont_len;
         int size;
         
         if(methode == NULL)
           return NULL;
         else if(strcmp(methode, "GET") == 0) {
           str = getenv("QUERY_STRING");
           if(str == NULL)
             return NULL;
           puffer = Strdub(str);
           if(puffer == NULL)
             return NULL;
           return puffer;
         } else if(strcmp(methode, "POST") == 0) {
           cont_len = getenv("CONTET_LENGTH");
           if(cont_len == NULL)
             return NULL;
           size = (int) atoi(cont_len);
           if(size <= 0)
             return NULL;
           puffer = (char *)malloc(size+1);
           if(puffer == NULL)
             return NULL;
           if(NULL == fgets(puffer, size+1, stdin)){
             free(puffer);
             return NULL;
           }
           return puffer;
         }else
           return NULL;
    }
     
    struct CGI_DATEN *teilen(char *str) {
           char *paare[MAX_PAARE];
           char *s, *res;
           int i=0, j=0;
           
           struct CGI_DATEN *ptr_anfang = NULL;
           struct CGI_DATEN *ptr_daten = NULL;
           
           s = str;
           res = strtok(s, "&");
           while(res != NULL && i < MAX_PAARE) {
             paare[i] = (char *) malloc(strlen(res)+1);
             if(paare[i] == NULL)
               return NULL;
             strcpy(paare[i], res);
             res = strtok(NULL, "&");
             i++;
           }
           
           while(j < i) {
             if(ptr_anfang == NULL) {
               ptr_anfang = (struct CGI_DATEN *) malloc(sizeof(struct CGU_DATEN *));
               if(ptr_anfang == NULL)
                 return NULL;
               
               res = strtok(paare[j], "=");
               ptr_anfang->variable = (char *) malloc(strlen(res)+1);
               if(ptr_anfang->variable == NULL)
                 return NULL;
               strcpy(ptr_anfang->variable, res);
               
               res = strtok(NULL, "\0");
               ptr_anfang->wert = (char *) malloc(strlen(res)+1);
               if(ptr_anfang->wert == NULL)
                 return NULL;
               strcpy(ptr_anfang->wert, res);
               
               ptr_anfang->next = (struct CGI_DATEN *) malloc(sizeof(struct CGI_DATEN *));
               if(ptr_anfang->next == NULL)
                 return NULL;
               ptr_daten = ptr_anfang->next;
               j++;
             } else {
               res = strtok(paare[j], "=");
               ptr_daten->variable = (char *) malloc(strlen(res)+1);
               if(ptr_daten->variable == NULL)
                 return NULL;
               strcpy(ptr_daten->variable, res);
               
               res = strtok(NULL, "\0");
               ptr_daten->wert = (char *) malloc(strlen(res)+1);
               if(ptr_daten->wert == NULL)
                 return NULL;
               strcpy(ptr_daten->wert, res);
               
               ptr_daten->next = (struct CGI_DATEN *) malloc(sizeof(struct CGI_DATEN *));
               if(ptr_daten->next == NULL)
                 return NULL;
               ptr_daten = ptr_daten->next;
               j++;
             }
           }
           ende = ptr_daten;
           return ptr_anfang;
    }
      
    char convert(char *hex) {
       char ascii;
     
       /* erster Hexawert */
       ascii =
       (hex[0] >= 'A' ? ((hex[0] & 0xdf) - 'A')+10 : (hex[0] - '0'));
       ascii <<= 4; /* Bitverschiebung schneller als ascii*=16 */
       /* zweiter Hexawert */
       ascii +=
       (hex[1] >= 'A' ? ((hex[1] & 0xdf) - 'A')+10 : (hex[1] - '0'));
       return ascii;
    }
     
    void hex2ascii(char *str) {
       int x, y;
     
       for(x=0,y=0; str[y] != '\0'; ++x,++y) {
          str[x] = str[y];
          /* Ein hexadezimales Zeichen ? */
          if(str[x] == '%') {
             str[x] = convert(&str[y+1]);
             y += 2;
          }
          /* Ein Leerzeichen ? */
          else if( str[x] == '+')
             str[x]=' ';
       }
       /* geparsten String sauber terminieren */
       str[x] = '\0';
    }
     
    int main(void) {
        printf("Content-Type: text/html\n\n");
        struct CGI_DATEN *zeiger;
        char *str = getdata();
        if(str == NULL) {
          printf("Fehler bei str");
          return EXIT_FAILURE;
        }
        
        hex2ascii(str);
        
        zeiger = teilen(str);
        if(zeiger == NULL) {
          printf("Fehler bei teilen()");
          return EXIT_FAILURE;
        }
        
        printf("%s : %s", zeiger->variable, zeiger->wert);
        zeiger = zeiger->next;
        printf("%s : %s", zeiger->variable, zeiger->wert);
        zeiger = zeiger->next;
        printf("%s : %s", zeiger->variable, zeiger->wert);
        zeiger = zeiger->next;
        printf("%s : %s", zeiger->variable, zeiger->wert);
        zeiger = zeiger->next;
        
        return EXIT_SUCCESS;
    }

    Ich hoffe ihr könnt mir helfen

    Gruß Yax
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Du hast die per GET übertragenen Variablen anscheinend in eine einfach verkettete Liste übertragen.

    Dann mußt du doch nur prüfen ob der Zeiger gültig ist, bevor du ihn benutzt....

    Gruß

    \edit: Evlt. solltest du mal sagen was du mit "das Programm funktioniert nicht mehr" meinst.
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    yax yax ist offline Mitglied Gold
    Registriert seit
    Jul 2010
    Beiträge
    175
    Was meinst du mit überprüfen ob der zeiger gültig ist?

    Ich meinte, dass dann die Fehlermeldung 500 von meinem Server kommt
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    Ohne den Code jetzt genau angeschaut zu haben:
    vor Kurzem war auch so ein Problem hier, bei dem hat ein
    Code cpp:
    1
    
    fflush(stdout);
    am Programmende gefehlt.
    Versuchen schadet ja nicht.

    Gruß
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  5. #5
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    So wie deine Liste aufgebaut ist, ist der next-Pointer beim letzten Element NULL. D.h. die Ausgabe kannst du zu einer Schleife zusammenfassen, die so lange läuft, bis next auf NULL steht:

    Code :
    1
    2
    3
    4
    5
    
    while ( zeiger != NULL )
    {
      printf( "%s : %s", zeiger->variable, zeiger->wert );
      zeiger = zeiger->next;
    }
     

  6. #6
    yax yax ist offline Mitglied Gold
    Registriert seit
    Jul 2010
    Beiträge
    175
    Okay, stimmt, dass mit der Schleife hab ich total vergessen danke Endurion

    Aber mein Problem ist ja, dass wenn ich nur ein Textfeld ausfülle, und dann auf Speichern klicke, dann kommt da die Fehlermeldung 500. Sobald ich aber alle Textfelder ausfülle und dann auf speichern klicke, wird mir die eingabe ausgegeben.

    Hat jemand eine Lösung?
     

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von yax Beitrag anzeigen
    Okay, stimmt, dass mit der Schleife hab ich total vergessen danke Endurion

    Aber mein Problem ist ja, dass wenn ich nur ein Textfeld ausfülle, und dann auf Speichern klicke, dann kommt da die Fehlermeldung 500.
    Das deutet darauf hin, dass dein Programm einfach abstürzt.

    Verwende einen Debugger und schau nach wo das Problem liegt.

    Ich habe es gerade getestet und nachdem ich die Schleife mit der Prüfung des Zeigers einbaue stürzt das Programm auch nicht mehr ab.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  8. #8
    yax yax ist offline Mitglied Gold
    Registriert seit
    Jul 2010
    Beiträge
    175
    Meinst du die Schleife von Endurion ?
     

  9. #9
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von yax Beitrag anzeigen
    Meinst du die Schleife von Endurion ?
    Welche denn sonst? Du hast es anscheinend nicht mal ausprobiert...

    Bevor du einen Zeiger benutzt, mußt du doch erstmal prüfen ob der Zeiger gültig ist, also != NULL. Das hast du einmal nach Aufruf der Funktion teilen gemacht.

    Dann setzt du den Zeiger auf next und dereferenzierst den Zeiger einfach, ohne zu prüfen ob != NULL. Das funktioniert nur wenn mehr als 1 Textfeld gefüllt ist...

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  10. #10
    yax yax ist offline Mitglied Gold
    Registriert seit
    Jul 2010
    Beiträge
    175
    Also, es höhrt sich sehr logisch an, doch wenn ich diese Schleife in mein Programm einsetze, kommt wieder der Fehler 500 vom Server.
     

  11. #11
    yax yax ist offline Mitglied Gold
    Registriert seit
    Jul 2010
    Beiträge
    175
    Okay, ich habe es geschaft ich musste meine teilen()-Funktion ändern.

    Hier mein Code:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX_PAARE 255
    #define BUF 255
     
    struct CGI_DATEN {
      char *variable;
      char *wert;
      struct CGI_DATEN *next;
    };
     
    struct CGI_DATEN *ende = NULL;
     
    char *Strdub(char *str) {
         char *puffer = (char *)malloc(strlen(str)+1);
         if(puffer == NULL)
           return NULL;
         strcpy(puffer, str);
         return puffer;
    }
     
    char *getdata(void) {
         char *methode = getenv("REQUEST_METHOD");
         char *puffer;
         char *str, *cont_len;
         int size;
         
         if(methode == NULL)
           return NULL;
         else if(strcmp(methode, "GET") == 0) {
           str = getenv("QUERY_STRING");
           if(str == NULL)
             return NULL;
           puffer = Strdub(str);
           if(puffer == NULL)
             return NULL;
           return puffer;
         } else if(strcmp(methode, "POST") == 0) {
           cont_len = getenv("CONTET_LENGTH");
           if(cont_len == NULL)
             return NULL;
           size = (int) atoi(cont_len);
           if(size <= 0)
             return NULL;
           puffer = (char *)malloc(size+1);
           if(puffer == NULL)
             return NULL;
           if(NULL == fgets(puffer, size+1, stdin)){
             free(puffer);
             return NULL;
           }
           return puffer;
         }else
           return NULL;
    }
     
    struct CGI_DATEN *teilen(char *str) {
           char *paare[MAX_PAARE];
           char *s, *res;
           int i=0, j=0;
           
           struct CGI_DATEN *ptr_anfang = NULL;
           struct CGI_DATEN *ptr_daten = NULL;
           
           s = str;
           res = strtok(s, "&");
           while(res != NULL && i < MAX_PAARE) {
             paare[i] = (char *) malloc(strlen(res)+1);
             if(paare[i] == NULL)
               return NULL;
             strcpy(paare[i], res);
             res = strtok(NULL, "&");
             i++;
           }
           
           while(j < i) {
             if(ptr_anfang == NULL) {
               ptr_anfang = (struct CGI_DATEN *) malloc(sizeof(struct CGU_DATEN *));
               if(ptr_anfang == NULL)
                 return NULL;
               
               res = strtok(paare[j], "=");
               ptr_anfang->variable = (char *) malloc(strlen(res)+1);
               if(ptr_anfang->variable == NULL)
                 return NULL;
               strcpy(ptr_anfang->variable, res);
               
               res = strtok(NULL, "\0");
               if(res != NULL) {
                 ptr_anfang->wert = (char *) malloc(strlen(res)+1);
                 if(ptr_anfang->wert == NULL)
                   return NULL;
                 strcpy(ptr_anfang->wert, res);
               } else {
                 ptr_anfang->wert = (char *) malloc(strlen("")+1);
                 if(ptr_anfang->wert == NULL)
                   return NULL;
                 strcpy(ptr_anfang->wert, "");
               }
               
               ptr_anfang->next = (struct CGI_DATEN *) malloc(sizeof(struct CGI_DATEN *));
               if(ptr_anfang->next == NULL)
                 return NULL;
               ptr_daten = ptr_anfang->next;
               j++;
             } else {
               res = strtok(paare[j], "=");
               ptr_daten->variable = (char *) malloc(strlen(res)+1);
               if(ptr_daten->variable == NULL)
                 return NULL;
               strcpy(ptr_daten->variable, res);
               
               res = strtok(NULL, "\0");
               if(res != NULL) {
                 ptr_daten->wert = (char *) malloc(strlen(res)+1);
                 if(ptr_daten->wert == NULL)
                   return NULL;
                 strcpy(ptr_daten->wert, res);
               } else {
                 ptr_daten->wert = (char *) malloc(strlen("")+1);
                 if(ptr_daten->wert == NULL)
                   return NULL;
                 strcpy(ptr_daten->wert, "");
               }
               
               ptr_daten->next = (struct CGI_DATEN *) malloc(sizeof(struct CGI_DATEN *));
               if(ptr_daten->next == NULL)
                 return NULL;
               ptr_daten = ptr_daten->next;
               j++;
             }
           }
           ende = ptr_daten;
           return ptr_anfang;
    }
      
    char convert(char *hex) {
       char ascii;
     
       /* erster Hexawert */
       ascii =
       (hex[0] >= 'A' ? ((hex[0] & 0xdf) - 'A')+10 : (hex[0] - '0'));
       ascii <<= 4; /* Bitverschiebung schneller als ascii*=16 */
       /* zweiter Hexawert */
       ascii +=
       (hex[1] >= 'A' ? ((hex[1] & 0xdf) - 'A')+10 : (hex[1] - '0'));
       return ascii;
    }
     
    void hex2ascii(char *str) {
       int x, y;
     
       for(x=0,y=0; str[y] != '\0'; ++x,++y) {
          str[x] = str[y];
          /* Ein hexadezimales Zeichen ? */
          if(str[x] == '%') {
             str[x] = convert(&str[y+1]);
             y += 2;
          }
          /* Ein Leerzeichen ? */
          else if( str[x] == '+')
             str[x]=' ';
       }
       /* geparsten String sauber terminieren */
       str[x] = '\0';
    }
     
    int main(void) {
        printf("Content-Type: text/html\n\n");
        struct CGI_DATEN *zeiger;
        char *str = getdata();
        if(str == NULL) {
          printf("Fehler bei str");
          return EXIT_FAILURE;
        }
        
        hex2ascii(str);
        
        zeiger = teilen(str);
        if(zeiger == NULL) {
          printf("Fehler bei teilen()");
          return EXIT_FAILURE;
        }
        
        printf("%s : %s", zeiger->variable, zeiger->wert);
        zeiger = zeiger->next;
        printf("%s : %s", zeiger->variable, zeiger->wert);
        zeiger = zeiger->next;
        printf("%s : %s", zeiger->variable, zeiger->wert);
        zeiger = zeiger->next;
        printf("%s : %s", zeiger->variable, zeiger->wert);
        zeiger = zeiger->next;
        
        return EXIT_SUCCESS;
    }

    Danke für eure Hilfe
     

Ähnliche Themen

  1. HTML in dynamsichem Textfeld
    Von Sickone4 im Forum Flash Plattform
    Antworten: 1
    Letzter Beitrag: 20.06.09, 22:22
  2. zusätzliches leeres textfeld
    Von darkangel1208 im Forum PHP
    Antworten: 3
    Letzter Beitrag: 27.11.07, 00:30
  3. HTML-Textfeld spuckt kein HTML aus
    Von Blattspinat im Forum Flash Plattform
    Antworten: 4
    Letzter Beitrag: 10.10.07, 17:10
  4. [InDesign2.0] Leeres Textfeld in Mustervorlage
    Von CoarseBeat im Forum Desktop Publishing (DTP)
    Antworten: 4
    Letzter Beitrag: 28.05.06, 17:29
  5. onclick leeres Textfeld
    Von bspainkf36 im Forum Javascript & Ajax
    Antworten: 6
    Letzter Beitrag: 08.09.05, 20:29