Avatar billede zombien Juniormester
24. april 2008 - 12:12 Der er 18 kommentarer og
1 løsning

hvad er problemet i denne if struktur?

if brugertype <> "" then
if brugertype = "butik" then
  set sidetxt = conn.execute("select * from sidetxt where id = 13")
elseif brugertype = "bruger" then
  set sidetxt = conn.execute("select * from sidetxt where id = 14")
end if
end if

hvad er fejlen i denne if struktur...
selve scriptet opfanger værdi'en brugertype korrekt
men det lader ikke til, den kan gennemføre denne if struktur, af en årsag jeg ikke helt kender til, håber nogen kan komme med et bud
Avatar billede w13 Novice
24. april 2008 - 12:15 #1
If'en ser rigtig ud.
Får du en fejlmeddelelse da eller hvad sker der?

Du kan jo i øvrigt spare den yderste if, da de inderste alligevel kun tjekker, om brugertype indeholder bestemte værdier:

if brugertype = "butik" then
  set sidetxt = conn.execute("select * from sidetxt where id = 13")
elseif brugertype = "bruger" then
  set sidetxt = conn.execute("select * from sidetxt where id = 14")
end if
Avatar billede michael_stim Ekspert
24. april 2008 - 12:16 #2
Nu er jeg ikke den store ASP haj, men hedder det ikke bare sidetxt? Altså ikke set sidetxt.
Avatar billede w13 Novice
24. april 2008 - 12:18 #3
Michael_Stim>> Nej, når det skal sættes som object, skal det være med set.
Avatar billede softspot Forsker
24. april 2008 - 12:20 #4
michael_stim >> nej, for conn.execute returnerer et objekt (recordset) og i VBScript skal man benytte SET foran tildeling af objektvariable.

zombien >> der kan evt. være problemer med case-sensitivity i dine strenge, så derfor kan du evt. konvertere til lower-case inden din sammenligning:

if lcase(brugertype) = "butik" then
  set sidetxt = conn.execute("select * from sidetxt where id = 13")
elseif lcase(brugertype) = "bruger" then
  set sidetxt = conn.execute("select * from sidetxt where id = 14")
end if
Avatar billede softspot Forsker
24. april 2008 - 12:25 #5
Du kan også benytte den lidt mere regelrette metode (da den konstante streng du sammenligner med så heller ikke behøves at være lower case, altså små bogstaver):


if strComp(1, brugertype, "butik", vbTextCompare) = 0 then
  set sidetxt = conn.execute("select * from sidetxt where id = 13")
elseif strComp(1, brugertype, "bruger", vbTextCompare) = 0 then
  set sidetxt = conn.execute("select * from sidetxt where id = 14")
end if


Et alternativ til den valgte if-struktur kunne i øvrigt være en select-case, som bliver interessant når det er samme kriterie-variabel der skal checkes på (som i dit tilfælde):

select case lcase(brugertype)
  case "butik"
    set sidetxt = conn.execute("select * from sidetxt where id = 13")
  case "bruger"
    set sidetxt = conn.execute("select * from sidetxt where id = 14")
end select

eller lidt mere gustent, men med brug af den metode med strComp

select case true
  case strComp(1, brugertype, "butik", vbTextCompare) = 0
    set sidetxt = conn.execute("select * from sidetxt where id = 13")
  case strComp(1, brugertype, "bruger", vbTextCompare) = 0
    set sidetxt = conn.execute("select * from sidetxt where id = 14")
end select
Avatar billede zombien Juniormester
24. april 2008 - 12:26 #6
jamen, jeg får den typiske fejl

når man forsøger at hente noget ud fra databasen, og selve conn.execute ikke er bleven startet
så den ikke kan finde den korrekte værdi i databasen.

<-- fejl -->
Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A000D)
Typer stemmer ikke overens: 'sidetxt'
/handelssikkert.dk/sider/system/opretning.asp, line 128

<-- Linje 128 -->
response.write sidetxt("sidetxt")

softspot < har forsøgt med den lower-case, men lader ikke til at virke får bare den samme fejl
Avatar billede w13 Novice
24. april 2008 - 12:29 #7
Og du er 100% sikker på, at brugertype indeholder enten "butik" eller "bruger" og ikke noget med ekstra mellemrum eller sjove tegn?

Måske bliver der ikke fundet noget i databasen på where id=13 eller where id=14?

Har du en:

if not rs.eof then
...
end if

rundt om din:

response.write sidetext("sidetxt")

?
Avatar billede zombien Juniormester
24. april 2008 - 12:32 #8
w13, nej jeg har ingen eof eller bof rundt om
da jeg er 100 % sikker på der er noget af værdi 13 og 14...

i tilfælde af jeg køre uden if struktur, og tjekker de 2 sidetxt linjer virker de uden problemer
og jeg er sikker på den opfanger værdien bruger eller butik...
for ellers ville den ikke kunne køre videre fra forgående side

da brugertype ikke må være tomt, samt det er via radiobuttons man vælger typen
Avatar billede w13 Novice
24. april 2008 - 12:35 #9
Så prøv lige at debugge med:

if lcase(brugertype) = "butik" then
  set sidetxt = conn.execute("select * from sidetxt where id = 13")
  Response.Write "butik - "&sidetxt.eof
elseif lcase(brugertype) = "bruger" then
  set sidetxt = conn.execute("select * from sidetxt where id = 14")
  Response.Write "bruger - "&sidetxt.eof
else
  Response.Write "Else: "&brugertype
end if

Hvad får du udskrevet?
Avatar billede softspot Forsker
24. april 2008 - 14:26 #10
Hvis conn.execute slet ikke bliver kaldt (hvilket lader til at være tilfældet), så er værdien af sidetxt Empty og det kan kontrolleres med funktionen isEmpty.

if not isEmpty(sidetxt) then
  if not sidetxt.eof then
    '...
  end if
else
  response.write "FEJL! Der er ikke læst data fra databasen. brugertype indeholder: " & brugertype
end if
Avatar billede softspot Forsker
24. april 2008 - 14:27 #11
Hvordan får brugertype sin værdi?
Avatar billede zombien Juniormester
24. april 2008 - 15:08 #12
jeg har ændret en del i koden, for jeg kunne simpelthen ikke finde fejlen
ligemeget hvad jeg forsøgte, så lige p.t. køre alle variabler via sessions
ikke det mest optimale, men det fungere da...
Avatar billede w13 Novice
24. april 2008 - 15:27 #13
Ja, men du skal nok regne med, at det kommer til at sløve i længden.
Avatar billede zombien Juniormester
24. april 2008 - 15:31 #14
jeps er jeg klar over...
Avatar billede softspot Forsker
24. april 2008 - 15:33 #15
aaarh, der skal vist en del variable til for at det kommer til at påvirke hastigheden på serveren i højre grad end et databaseopslag... trods alt :)
Avatar billede w13 Novice
24. april 2008 - 15:35 #16
Det kommer vel an på, hvor populær siden bliver (hvor mange brugere der er). ;)
Avatar billede softspot Forsker
24. april 2008 - 19:59 #17
Jeg har den opfattelse, at læsning af data der ligger i hukommelsen til hver en tid performer bedre end data der skal findes i en diskbaseret database. Så er der tale om data der typisk kun skal læses og sjældent opdateres, jamen, så er det måske en rigtig god idé for performance, at man lægger data i hukommelsen, som et supplement til databasen. Skulle sitet gå hen og blive så populært som du foreslår, er der nok også råd til at smide "lidt" ekstra hukommelse i serveren, så den kan trække "lidt" flere brugere. Der er en god grund til at caching ofte sker i hukommelsen... :)
Avatar billede w13 Novice
24. april 2008 - 20:35 #18
Nu ved jeg ikke så meget om det tekniske bag, men man kan i hvert fald spare noget, hvis man ingen sessions bruger, og slår det helt fra: http://support.microsoft.com/kb/244465

Har også for nylig læst artikler, som argumenterede for at man skulle bruge så få sessions som muligt.

Men ja, den slags _er_ ofte flueknepperi. :)
Avatar billede zombien Juniormester
16. august 2010 - 18:06 #19
lukket
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