30. august 2000 - 10:08Der er
4 kommentarer og 1 løsning
CGI - QueryString dekodning
Jeg har MEGET længe forsøgt, at lave en funktion, der kunne opdele en QueryString i et array med strenge, der indeholdte variabelnavnene, og et, der indeholdte verdierne.
printf(\"Liste over tegn positioner:\\n\\n\"); for(I=0;I<=AntalOg;I++) printf(\"&-tegn nr. %i paa position %i (%c)\\n\",I+1,OgPositioner[I]+1,QueryString[OgPositioner[I]]); for(I=0;I<=AntalLigm;I++) printf(\"=-tegn nr. %i paa position %i (%c)\\n\",I+1,LigmPositioner[I]+1,QueryString[LigmPositioner[I]]); printf(\"\\n\\n\");
Gider ikke kigge hele din kode (i øvrigt fuldstændig ukommenteret) igennem for at finde dine syntaksfejl o.s.v, men jeg har et eksempel jeg har lavet som virker. Jeg er på kursus i øjeblikket, men kan cut´n paste det fra work på fredag hvis det har nogen interesse ?
Hej Emil. Her kommer så min kode og jeg var lidt hurtig til at kritisere dig for manglende kommentarer da jeg efter at ha kigget i gemmerne fandt dette eksempel der heller ikke er vildt godt kommenteret.
Jeg bruger en hægtet liste til at holde styr på name-value pairs. Databasedelen af programmet er ikke interessant for dig, så det kan du skippe. Det der sker kan du følge i de første par linier i main. Der bliver lavet en liste og en parser, parseren returnerer den færdige liste ind i liste pointeren. Den liste har så metoder til at returnere value af et givent name. I tilfældet med babeprogrammet her taster brugeren et navn ind som bliver sendt som querystring og opl. om navnet findes i en DB og der skrives så lidt til skærmen.
TPairList(); void NewPair(char*, char*); //startes fra TParser og modtager char* GetValue(char*); //Name og Value fra TParser, til //initaialisering af nyt TPair. };
//TPairlist methods
TPairList::TPairList() { First = NULL; //kommer til at pege på par 1. }
char* TPairList::GetValue(char* aName) { int Flag = 1; //sat til sandt TPair* hjelpepeger = First;
else { if(hjelpepeger -> Next != NULL) { if(strcmp(hjelpepeger -> Next -> Name, aName) == 0) {return hjelpepeger -> Next -> Value;}
else { hjelpepeger = hjelpepeger -> Next; //ryk en frem }
}
else { char* error=\"Navnet kunne ikke findes ... \"; cout<<\"\\nSøgt navneværdi: \"<<aName<<endl; return error; }
}
}//slut yderste else } //slut while - løkke }
void TPairList::NewPair(char* aName, char* aValue) { int True = 1; int False = 0; if(First == NULL) First = new TPair(aName, aValue); else { TPair* hjelpepeger = First; while(True) { if(hjelpepeger -> Next == NULL) { hjelpepeger -> Next = new TPair(aName, aValue); True = False; //stop løkke } else hjelpepeger = hjelpepeger -> Next; //ryk én frem } } }
class TParser { private:
char* Query; //Peger på starten af QUERYSTRING char* Method; int Length; //længden af Query char* Source; //Source rykker frem gennem Query char* Name; //Name og Value sendes til Liste char* Value;
public: TPairList* PairList;
TParser(); //Konstruktøren indlæser \"QUERY_STRING\" char* GetValue(char*); //sender forespørgsel til Pairlist void InsertSpaces(); TPairList* Parse(); //Parser og returnerer liste };
return PairList; //send listen med pair´s til main
} //end Funktion
// //end deklaration af klasser til cgi-delen: TPair, TPairList & TParser. END // // //START på deklaration af klasser til Databaseconnecting & SQL - processing. //
void main() { TPairList* List; //oprettelse af instanser TParser* Parser = new TParser(); List = Parser -> Parse(); //parse og returnér liste
//START DB & SQL
Databases* db; try { db = new Databases(\"d97529\", \"d97529\");
strcpy((char*)aName.arr, List -> GetValue(\"navn\")); //initialiser til navnet fra cgi aName.len = strlen(List -> GetValue(\"navn\")); //altså navnet fra hjemmesiden
EXEC SQL WHENEVER SQLERROR DO err(); EXEC SQL SELECT ID, NAVN, ALDER, POINTS INTO :Babes FROM BABES WHERE NAVN = :aName;
Det afhænger selvfølgelig af antallet af parametre i din query string, men det kunne måske være værd at overveje at bruge en hash-tabel til at gemme parametrene i "key" => "value" par, og dekode din query string (dvs. dekode URL-encoding) med et enkelt gennemløb af strengen.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.