Avatar billede claushelth Nybegynder
02. december 2002 - 00:23 Der er 3 kommentarer og
1 løsning

sql forspørgelse i C (200 gode point)

Hej Eksperter
(msql og C)

Jeg sidder og roder med en msql (MiniSql) database og er ved at programmerer nogle udtrækninger fra databasen. Jeg har 3 tabeller (brugertabel,websitetabel,weboversigttabel).
Udtrækningen sker i c på en linux med redhat(Skulle være uden betydning)

Tabeller:
Brugertabel viser brugernr og password.
Websitetabel viser navne på hostnavne (www adr)samt hvor mange hits de i alt har opnået.
Weboversigttabel er en mange til mange, og viser hvor hvilke sider brugeren har besøgt samt antal gange brugeren har været der.

Jeg skal lave et kald og få det skrevet ud med nogle html tags. (Det med HTML bliver gjort i en anden funktion, og er ikke væsenligt her).
Mit sql kald går fint igennem databasen hvis jeg skriver det direkte derinde, men herfra får jeg 0 rækker som svar, på trods af at jeg skal have 2. (int status viser hele tiden hvor mange resultater jeg får).
Kaldet returnere først nul...sevfølgelig, og derfefter -1 (skulle være 2)
    status = 0;
    printf("1.a: %d\n",status); 
    status = msqlQuery(socket,SqlTemp);
    printf("1.b: %d\n",status);

Hvorfor... er der noget galt med at skrive sql sætningen på den måde i c (den virker jo direkte)?
Jeg har en lignende funktion der gør det samme med en anden udtrækning som virker (den er slået fra så længe jeg tester denne).

Kaldet fra main:
char Htmltemp[1000];
char *Htmltemp_p = Htmltemp;

BrugerSamletHits(socket,Log,Htmltemp_p);
printf("Statestik over brugers websider: %s\n",Htmltemp_p);

Funktionen:

/* BRUGER Se brugerens samlede hits, sorteret i faldende
                                              orden */

int BrugerSamletHits(int socket,char* Log,char   
                    *StringSamRes_p)
          // Log benyttes ikke endnu, der er
          // givet en kostant i sql
{
    char sqlTemp1[100];
    char sqlTemp2[100];
    char sqlTemp[400];

    int status=0;            //gemmer resultatet af antal
                        // udtraekninger i en forespoergsel
    m_result *result;      //gemmer data for den
                          // paagaeldende foresporgsel
    int AntalKol=0;          //opbevarer antallet af
                          // kolonner fra foresporgslen
    int j, i;
    m_row raekke;
    char Temp1[100];      //opbevarer en websidens navn
              // og dens hits, som er anfoert i databasen
    char SamletRes[1000] = "\0";//opbevarer foresporgslen

    sprintf(sqlTemp1,"select WE.Website,WO.AntalBesoeg
              from WEBOVERSIGT as WO,WEBTABEL as WE ");

    sprintf(sqlTemp2,"where WO.WebbrugerID=2 and
              WO.WOWebID=WE.WebID ",sqlTemp1);

    sprintf(sqlTemp3,"order by WO.AntalBesoeg desc \n");

    //select WE.Website,WO.AntalBesoeg from WEBOVERSIGT
    // as WO,WEBTABEL as WE where WO.WebbrugerID=2
    //and WO.WOWebID=WE.WebID order by WO.AntalBesoeg
    // desc \n        "select saetning samlet"

    printf("1.a: %d\n",status); //kontroler status 
     
    status = msqlQuery(socket,SqlTemp);

    printf("1.b: %d\n",status); //kontroler status igen
   
    result = msqlStoreResult();       
    AntalKol = msqlNumFields(result);  //gemmer antallet 
                            //af raekker i forespoergslen


    printf("1.c: %d\n",status);//kontroler status igen
   
    for (j = 0; j < status && j < 10; j++)
    {
            raekke = msqlFetchRow(result);
            for (i=0; i < AntalKol; i++)
            {
              sprintf(Temp1, "%s\t", raekke[i]);
              printf("2: %s\n",Temp1);
              strcat(SamletRes,Temp1);
            }
            strcat(SamletRes,"\n");
    }
   
    strcat(SamletRes,"\0");

    printf("3: %s\n",SamletRes);
    strcpy(StringSamRes_p, SamletRes);

    TilHtmlKode(StringSamRes_p, StringSamRes_p);

    return 0;
}
Avatar billede claushelth Nybegynder
02. december 2002 - 01:27 #1
Der er et par skrivefejl i koden:
I den sidste sql forespørgsel:
sprintf(sqlTemp3,"order by WO.AntalBesoeg desc \n");
er
sprintf(sqlTemp,"order by WO.AntalBesoeg desc \n");
og i selve kaldet:
status = msqlQuery(socket,SqlTemp);
er
status = msqlQuery(socket,sqlTemp);
Dette gør ingen foreskel. Status returnere stadig -1 (ingen rækker i tabel???)
Avatar billede claushelth Nybegynder
02. december 2002 - 01:43 #2
Jeg var lidt hurtig til at copy/paste
Jeg har selvfølgelig også glemt at til føje de forskellige sqlTemp til hinanden, men det klaret nu, samt jeg udskriver den sidste temp, for at kontrollere at den får det rigtige sql kald:

sprintf(sqlTemp1,"select WE.Website,WO.AntalBesoeg from WEBOVERSIGT as
                                              WO,WEBTABEL as WE");
sprintf(sqlTemp2,"where WO.WebbrugerID=2 and WO.WOWebID=WE.WebID ",sqlTemp1);

sprintf(sqlTemp3,"order by WO.AntalBesoeg desc",sqlTemp2);

printf("sqlTemp indeholder: %s",sqlTemp); //Jeg får det korrekte kald udskrevet
Avatar billede claushelth Nybegynder
02. december 2002 - 01:44 #3
Men den fejler stadig ved status (status = -1) ....æv
Avatar billede claushelth Nybegynder
02. december 2002 - 02:05 #4
Ligemeget....Efter at have nærlæst sqlkoden, var der en væmmelig skrivefejl..igen igen igen :-)
Det var selvfølelig, som også beskrevet i toppen, Weboversigttabel og ikke Weboversigt som skulle kaldes....æv, men alligevel JUHUUUU.
Tak alligevel
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester