/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
sql forspørgelse i C
Fra : claus


Dato : 02-12-02 00:41

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;
}

 
 
Morten F. Hansen (02-12-2002)
Kommentar
Fra : Morten F. Hansen


Dato : 02-12-02 01:02

> Hvorfor... er der noget galt med at skrive sql sætningen på den måde i
> c (den virker jo direkte)?

Som jeg ser det får du aldrig sat din SQL-query-string rigtigt op i
SqlTemp-variablen før du laver din status = msqlQuery(socket,SqlTemp)

Først smider du noget ind i sqlTemp1, derefter i sqlTemp2, og herefter
igen noget i sqlTemp3. Dette ligner noget som senere skal samles.

sprintf(sqlTemp2,"where WO.WebbrugerID=2 and WO.WOWebID=WE.
WebID ",sqlTemp1); ligner lidt noget som skal samle, da du skriver
noget om sqlTemp1 til sidst, dog er der ingen tilsvarende %s i
strengen før.

sqlTemp3 bliver efter hvad jeg kan se aldrig declareret (ihvertfald
ikke en den kode-stump du har postet). Heller ikke SqlTemp bliver
declareret eller sat til noget fornuftigt. Det eneste sted du bruger
SqlTemp er faktisk i din msqlQuery(socket,SqlTemp), så hvordan kan
du forvente den indeholder noget brugbart?

Det er noget rod at arbejde med både sqlTemp og SqlTemp.. Det er
alt alt for nemt at bytte om på dem ved en fejl.

Prøv at skrive indholdet af din SQL-string ud inden du laver dit
msqlQuery() kald, ligesom du gør med status, så du kan se om
variablen indeholder hvad du regner med.



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste