get parameter in cgi/c++ abfragen

kann mir vl. mal wer sagen, wie man in cgi/c++ zum henker die get parameter abfragt!? ich krach schon fast zusammen vor lauter googlen. also dokumentationen und tutorials zu c++ über cgi sind wohl echt ne seltenheit!?
 
Lang ist es her, dass ich C/C++ für CGIs benutzt habe. *in.erinnerungen.kram* Wenn ich mich recht entsinne, wird die Umgebungsvariable QUERY_STRING gesetzt, die man dann einfach mittels getenv() abfragt.

Code:
...
char *request = getenv("REQUEST_METHOD");
char *cgi_string;
if( strcmp(request, "GET") == 0 ) {
  cgi_string = getenv("QUERY_STRING");
  if(cgi_string == NULL) {
    // keine parameter
  } else {
    // parameter verarbeiten
  }
}
Irgendwie in der Art funktionierte das.
 
ehm ja und was ist der query string jetz fürn typ. echt string? soll ich mir das jetz selbst in ein struct array zerlegen? sone kacke. aber danke. // edit. AH. das fragezeichen is nich mit drin kein prob
 
Ja, es ist echt ein String, den du selbst zerlegen musst. Im Buch 'C von A bis Z' ist aber ein entsprechendes Beispiel drin:

Code:
struct CGI_DATEN *erstellen(char *str) {
   char* s;
   char* res;
   /* Irgendwo gibt es auch eine Grenze, hier sind
      MAX_PAARE erlaubt */
   char *paare[MAX_PAARE];
   struct CGI_DATEN *ptr_daten = NULL;
   struct CGI_DATEN *ptr_anfang = NULL;
   int i=0, j=0;
   /* Zuerst werden die Variablen/Werte-Paare anhand des Zeichens
    * '&' getrennt, sofern es mehrere sind */
   s=str;
   res=strtok(s,"&");
   while( res != NULL && i < MAX_PAARE) {
      /* Wert von res dynamisch in char **pair speichern */
      paare[i] = (char *)malloc(strlen(res)+1);
      if(paare[i] == NULL)
         return NULL;
      paare[i] = res;
      res=strtok(NULL,"&");
      i++;
   }
   /* Jetzt werden die Variablen von den Werten getrennt und
    * an die Struktur CGI_DATEN übergeben */
   while ( i > j ) {  /* Das erste Element ? */
      if(ptr_anfang == NULL) {
         ptr_anfang =(struct CGI_DATEN *)
           malloc(sizeof (struct CGI_DATEN *));
         if( ptr_anfang == NULL )
            return NULL;
         res = strtok( paare[j], "=");
         if(res == NULL)
            return NULL;
         ptr_anfang->variable =(char *) malloc(strlen(res)+1);
         if( ptr_anfang->variable == NULL )
            return NULL;
         ptr_anfang->variable = res;
         res = strtok(NULL, "\0");
         if(res == NULL)
            return NULL;
         ptr_anfang->wert =(char *) malloc(strlen(res)+1);
         if( ptr_anfang->wert == NULL )
            return NULL;
         ptr_anfang->wert = res;
         /* printf("%s %s<br>",
          * ptr_anfang->variable, 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 { /* Die restlichen Elemente */
         res = strtok( paare[j], "=");
         if(res == NULL)
            return NULL;
         ptr_daten->variable =(char *) malloc(strlen(res)+1);
         if(ptr_daten->variable == NULL)
            return NULL;
         ptr_daten->variable = res;
         res = strtok(NULL, "\0");
         if(res == NULL)
            return NULL;
         ptr_daten->wert =(char *) malloc(strlen(res)+1);
         if(ptr_daten->wert == NULL)
            return NULL;
         ptr_daten->wert = res;
         /* printf("%s %s<br>",
          * ptr_daten->variable, 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;
   /* Anfangsadresse der Liste struct CGI_DATEN zurückgeben */
   return ptr_anfang;
}

CGI_DATEN ist dabei so deklariert:

Code:
struct CGI_DATEN {
   char *variable;
   char *wert;
   struct CGI_DATEN *next;
};
 
Code:
#include <iostream>
#include <stdlib.h>
#include <vector>
using namespace std;

struct CGI_DATEN {
   char *variable;
   char *wert;
   struct CGI_DATEN *next;
};

struct CGI_DATEN *erstellen(char *str)
{
	unsigned short int MAX_PAARE = 10;
	char* s;
	char* res;
	/* Irgendwo gibt es auch eine Grenze, hier sind MAX_PAARE erlaubt */
   char *paare[MAX_PAARE];
   struct CGI_DATEN *ptr_daten = NULL;
   struct CGI_DATEN *ptr_anfang = NULL;
   int i=0, j=0;
   /* Zuerst werden die Variablen/Werte-Paare anhand des Zeichens
    * '&' getrennt, sofern es mehrere sind */
   s=str;
   res=strtok(s,"&");
   while( res != NULL && i < MAX_PAARE) {
      /* Wert von res dynamisch in char **pair speichern */
      paare[i] = (char *)malloc(strlen(res)+1);
      if(paare[i] == NULL)
         return NULL;
      paare[i] = res;
      res=strtok(NULL,"&");
      i++;
   }
   /* Jetzt werden die Variablen von den Werten getrennt und
    * an die Struktur CGI_DATEN übergeben */
   while ( i > j ) {  /* Das erste Element ? */
      if(ptr_anfang == NULL) {
         ptr_anfang =(struct CGI_DATEN *)
           malloc(sizeof (struct CGI_DATEN *));
         if( ptr_anfang == NULL )
            return NULL;
         res = strtok( paare[j], "=");
         if(res == NULL)
            return NULL;
         ptr_anfang->variable =(char *) malloc(strlen(res)+1);
         if( ptr_anfang->variable == NULL )
            return NULL;
         ptr_anfang->variable = res;
         res = strtok(NULL, "\0");
         if(res == NULL)
            return NULL;
         ptr_anfang->wert =(char *) malloc(strlen(res)+1);
         if( ptr_anfang->wert == NULL )
            return NULL;
         ptr_anfang->wert = res;
         /* printf("%s %s<br>",
          * ptr_anfang->variable, 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 { /* Die restlichen Elemente */
         res = strtok( paare[j], "=");
         if(res == NULL)
            return NULL;
         ptr_daten->variable =(char *) malloc(strlen(res)+1);
         if(ptr_daten->variable == NULL)
            return NULL;
         ptr_daten->variable = res;
         res = strtok(NULL, "\0");
         if(res == NULL)
            return NULL;
         ptr_daten->wert =(char *) malloc(strlen(res)+1);
         if(ptr_daten->wert == NULL)
            return NULL;
         ptr_daten->wert = res;
         /* printf("%s %s<br>",
          * ptr_daten->variable, 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;
   /* Anfangsadresse der Liste struct CGI_DATEN zurückgeben */
   return ptr_anfang;
}

int main(int argc, char *argv[])
{
	cout << "Content-Type: text/html\r\n\r\n";

	cout << "<html><head><title>hello</title></head><body><h1>Welcome</h1>" << endl;

	if (strcmp(getenv("REQUEST_METHOD"), "GET") == 0)
	{
		CGI_DATEN *get_parameters = erstellen(getenv("QUERY_STRING"));

		unsigned short int CGI_DATEN_COUNT = sizeof(get_parameters) / sizeof(CGI_DATEN);

		for (unsigned short int i = 0; i < CGI_DATEN_COUNT; i++)
		{
			cout << "<p>" << CGI_DATEN.valiable << " = " << CGI_DATEN.wert << "</p>" << endl;

			CGI_DATEN = CGI_DATEN.next;
		}
	}

	cout << "</body></html>";

	return 0;
}
hilfe, ich bin zu blöd.
110 C:\Programme\xampp\htdocs\sj2\forum.cpp expected primary-expression before '.' token
 
Wenn ich mich nicht täusche, ist CGI_DATEN eine Struktur. Davon direkt die Members abzufragen macht ja relativ wenig Sinn.

Im letzten Absatz hast du einen Pointer auf CGI_DATEN erstellt mit dem Namen get_parameters. Innerhalb der Schleife musst du natürlich dann auch auf genau den Pointer zugreifen.

So sollte der Inhalt der for-Schleife aussehen:

Code:
cout << "<p>" << get_parameters->variable << " = " << get_parameters->wert << "</p>" << endl;
get_parameters = get_parameters->next;

Dann klappts auch mit den Pointern :)
 
Zurück
Oben