22. juli 2005 - 10:50Der er
72 kommentarer og 1 løsning
Hjælp til sql, case eller sådan noget
Hej, alle
Er temlig ny i alt det her. Og så er det jo sådan at man støder ind i alle mulige underlige ting :)
Jeg sider og har en db udtræk, som jeg laver via url. Nu er det sådan at jeg også gerne ville have, at "filen" også skal indeholde en case/session hvor der også bliver taget højde for sprog.
Jeg får følgende fejl:
Der opstod en Microsoft VBScript-kompileringsfejl (0x800A0401) Slut på sætning var ventet /link_indhold.asp, line 12, column 56 Case "dk" strSql = "Select ID = & Request.Querystring("id") AS sprog from Link"
Koden er: (håber ikke i griner af den) <% 'SQl udtræk fra databaseb via Case til link_indhold.asp sprog = Session("Sprog") Select Case sprog Case "dk" strSql = "Select ID = & Request.Querystring("id") AS sprog from Link" strOver = "Overskrift_dk" Case "uk" strSql = "Select ID = & Request.Querystring("id") AS sprog from Link" strOver = "Overskrift_uk" Case "de" strSql = "Select ID = & Request.Querystring("id") AS sprog from Link" strOver = "Overskrift_de" Case else strSql = "Select ID = & Request.Querystring("id") AS sprog from Link" strOver = "Overskrift_dk" End Select
' Set RS skal komme efter SQL forespørgsel for at lukke tro jeg nok Set RS = Conn.Execute(strSQL)
Do While Not rs.EOF
'Udskrivning til skærm. Først overskriften der efter teksten Response.Write RS(strOver) Response.Write "<p>" & RS("sprog") & " "
rs.MoveNext Loop %>
Linje 12 er: Case "dk" strSql = "Select ID = & Request.Querystring("id") AS sprog from Link"
Men jeg kan ikke lige hitte ud af hvad den vil have? Kan i hjælpe
<% 'SQl udtræk fra databaseb via Case til link_indhold.asp sprog = Session("Sprog") Select Case sprog Case "dk" strSql = "Select ID = "& Request.Querystring("id")&" AS sprog from Link" strOver = "Overskrift_dk" Case "uk" strSql = "Select ID = "& Request.Querystring("id")&" AS sprog from Link" strOver = "Overskrift_uk" Case "de" strSql = "Select ID = "& Request.Querystring("id")&" AS sprog from Link" strOver = "Overskrift_de" Case else strSql = "Select ID = "& Request.Querystring("id")&" AS sprog from Link" strOver = "Overskrift_dk" End Select
' Set RS skal komme efter SQL forespørgsel for at lukke tro jeg nok Set RS = Conn.Execute(strSQL)
Do While Not rs.EOF
'Udskrivning til skærm. Først overskriften der efter teksten Response.Write RS(strOver) Response.Write "<p>" & RS("sprog") & " "
busschou >> njaaah, du har til dels ret i at strengen ikke er korrekt formatteret til at få det resultat der forventes, men det er ikke det der er løsningen på det problem som janomel har... selvom janomel ville være kommet til dette ligeså snart den anden fejl var blevet rettet. :)
janomel >> som ny behøves du ikke lige pt at sætte vildt og voldsomt ind i sql injection, men det betyder at folk kan misbruge din database. Derfor hvis id er et tal, bør du typecaste det som et tal for at undgå folk kan misbruge din database Det gør du ved tilføje CInt foran --- <% 'SQl udtræk fra databaseb via Case til link_indhold.asp sprog = Session("Sprog") Select Case sprog Case "dk" strSql = "Select ID = "& CInt(Request.Querystring("id"))&" AS sprog from Link" strOver = "Overskrift_dk" Case "uk" strSql = "Select ID = "& CInt(Request.Querystring("id"))&" AS sprog from Link" strOver = "Overskrift_uk" Case "de" strSql = "Select ID = "& CInt(Request.Querystring("id"))&" AS sprog from Link" strOver = "Overskrift_de" Case else strSql = "Select ID = "& CInt(Request.Querystring("id"))&" AS sprog from Link" strOver = "Overskrift_dk" End Select
' Set RS skal komme efter SQL forespørgsel for at lukke tro jeg nok Set RS = Conn.Execute(strSQL)
Do While Not rs.EOF
'Udskrivning til skærm. Først overskriften der efter teksten Response.Write RS(strOver) Response.Write "<p>" & RS("sprog") & " "
ok ja 1) fordi du skriver strOver = "Overskrift_dk" er det ikke det samme som at der i din database er et felt kaldet "strOver" 2) du skal i øvrigt altid have " med RS("strOver")
når du laver strOver = "Overskrift_dk" Så har en streng til rådighed som hedder "strOver" og har værdien "Overskrift_dk" Det retter intet i din database
i øvrigt er der noget helt galt HVad er det præcis du ønsker med de to linjer her -- strSql = "Select ID = "& CInt(Request.Querystring("id"))&" AS sprog from Link" strOver = "Overskrift_dk" -- den øverste er ikke sql, så skulle den hedde strSql = "Select * from Link Where ID = "& CInt(Request.Querystring("id"))" Det andet giver ingen mening?
misforstå mig ikke, men det kunne virke som om du er meget begynder? Har du læst noget videre om asp og sql? ellers så prøv læse her først før du laver alt for meget forgæves :o) www.w3schools.com
så skulle du lave den sådan her strSql = "Select * from Link Where ID = "& CInt(Request.Querystring("id"))" Den vælger alle de poster i din database hvor ID er lig det angivet i adresselinjen Dernæst kan du så som du allerede gør hente RS("strOver")
busschou >> Indrømmer at jeg roder noget rundt i det...
Det hele går ud på at lave et db udtræk, via url...
Kommer lige med koder/fil.....
Først link.asp Viser kategorier:
<% ' SQL forespørgsel - Sidn skal vise? strSQL = "Select * from Link_kat Order By kategori " ' Udfør forespørgsel (rs indeholder nu resultatet) Set rs = Conn.Execute(strSQL)
' Start koloner. Der laves direkte i db udtræket i = 0 ' Gennem løb Recordset (rs) med en løkke
Do While Not rs.EOF
' Danner kolloner. i = i + 1 if i = 4 then 'antallet af kolonner er 3 response.write "<tr>" i = 1 end if
' Link strNavn = rs("kategori") & " "
' lav et link til link_kat.asp med Id-værdien i URL strLink = "<a href='link_kategori.asp?id=" & rs("Id") & "'>" & strNavn & "</a><p>"
' Liste med links Response.Write "<td>" & rs("Pic") & "<p>" & "<center> " & strLink & "</td>"
' Slut koloner if i = 0 then response.write "</tr>" end if
Derefter indehold i kategorierne via link_kategorier.asp.
<% ' SQL forespørgsel strSQL = "Select * From Link Where Kategoriid = " & Request.Querystring("id") ' Udfør forespørgsel (rs indeholder nu resultatet) Set rs = Conn.Execute(strSQL)
' Gennemløb Recordset (rs) med en løkke Do
' Det der skal skrives ud strNavn = rs("Navn") & "<p> "
' lav et link til historie_indhold.asp med Id-værdien i URL strLink = "<a href='link_indhold.asp?id=" & rs("Id") & "'>" & strNavn & "</a>"
' Liste med links Response.Write " " & rs("Pic") & " " & " " & strLink & " "
Og endelig de enkelte poster via link_indhold.asp:
<% ' SQL forespørgsel strSQL = "Select * From Link Where Kategoriid = " & Request.Querystring("id") ' Udfør forespørgsel (rs indeholder nu resultatet) Set rs = Conn.Execute(strSQL)
' Gennemløb Recordset (rs) med en løkke Do
' Det der skal skrives ud strNavn = rs("Navn") & "<p> "
' lav et link til historie_indhold.asp med Id-værdien i URL strLink = "<a href='link_indhold.asp?id=" & rs("Id") & "'>" & strNavn & "</a>"
' Liste med links Response.Write " " & rs("Pic") & " " & " " & strLink & " "
Du kan læse meget brugervenligt om sql på det link jeg gav dig, det synes jeg du skal prøve, for det er næsten nemmest :o) Syntaksen for et select statement er Select felt1, felt2,... From tabel1, tabel2, ... Where betingelse1, betingelse2, ... Order By sortering1, sortering2, ... --- Select * vælger alle felter i din tabel uden du behøves angive dem
Du har gemt sproget i sessionen og ønsker finde ud af hvilken overskrift du skal hente,, yes? --- <% 'SQl udtræk fra databaseb via Case til link_indhold.asp sprog = Session("Sprog") Select Case sprog Case "dk" strOver = "Overskrift_dk" Case "uk" strOver = "Overskrift_uk" Case "de" strOver = "Overskrift_de" Case else strOver = "Overskrift_dk" End Select
' Set RS skal komme efter SQL forespørgsel for at lukke tro jeg nok strSQL = "Select * from Link Where ID = "& CInt(Request.Querystring("id"))" Set RS = Conn.Execute(strSQL)
Do While Not rs.EOF
'Udskrivning til skærm. Først overskriften der efter teksten Response.Write RS(strOver) Response.Write "<p>" & RS("sprog") & " "
Der opstod en Microsoft VBScript-kompileringsfejl (0x800A0409) Strengkonstanten er uafsluttet /link_indhold.asp, line 23, column 74 strSQL = "Select * from Link Where ID = "& CInt(Request.Querystring("id")"
ja når den siger det, så er det fordi den ikke kan finde elementet i samlingen RS, og RS er det du har hevet ud af din tabel, Ergo kan den ikke finde kolonnen "sprog" i din tabel Enten har du ikke en kolonne kaldet "sprog" eller også er det fordi den er case sesitive og du har kaldt den "SPROG" eller "Sprog" eller osv :o)
Du kan ikke gemme noget i en Case, lige som du ikke kan gemme noget i en If Det er blot ren "tjekken" på data og ikke andet Der udover må du så holder styr på hvor du gemmer data Noget gemmer du måske i database, andet i en session, tredie i en streng i asp, måske engang du også gemmer i en cookie -- Når du fortæller asp at RS = conn.execute(dinsql). Så refererer RS _kun_ til resultatet af din sql sætning, og indeholder kun oplysninger om det du har hevet ud af databasen
nej nej Det jeg mener er når du siger ID = Cint(request.querystring("id")) Så vil der fx så ID = 2 Men ID er unikt ikke sandt? Altså der _kan kun_ være een post i din tabel med det ID ikke?
Ok da du kun har et ID er en løkke overflødig, altså du skal ikke spørge om den vil løbe noget igennem fra ende til anden når der kun er een :o) Der er heller ingen grund til at lave sprog = Session("Sprog") da du hele tiden har sessionen til rådighed og kan spørge på den direkte! :o)
--- <% 'Udvælg overskrift udfra sprog gemt i session Select Case Session("Sprog") Case "dk" strOver = "Overskrift_dk" Case "uk" strOver = "Overskrift_uk" Case "de" strOver = "Overskrift_de" Case else strOver = "Overskrift_dk" End Select
'sql sætning, CInt fordi id er et tal strSQL = "Select * from Link Where ID = "& CInt(Request.Querystring("id"))"
'udføsel af sqlsætning - RS indeholder nu det som opfylder sql sætningen Set RS = Conn.Execute(strSQL)
'Hvis RS indeholder noget (Not RS.EOF betyder "ikke er tom") If Not RS.EOF Then 'Udskrivning til skærm. Først overskriften der efter teksten Response.Write RS(strOver) Response.Write "<p>" & Session("sprog") & "</p>" End If %>
Det er også ok at lave en løkke, det er slet ikke det :o) Det er bare overflødigt når du ved der kun er eet element Men ok det er nok fint for dig i starten :o) -- Din session har du ved hånden lige fra du første gang erklærer den :o)
Nå jeg bruger det sidste forslag kommer den igen ud med:
Der opstod en Microsoft VBScript-kompileringsfejl (0x800A0409) Strengkonstanten er uafsluttet /link_indhold.asp, line 22, column 75 strSQL = "Select * from Link Where ID = "& CInt(Request.Querystring("id"))"
baah det var den samme copy paste fejl som før Du skal fjerne det sidste sæt gåseøjne strSQL = "Select * from Link Where ID = "& CInt(Request.Querystring("id")) -- Du skal nok lære de fejl beskeder med tiden Strengkonstanten er uafsluttet betyder logisk nok at den mangler en afslutning på din streng Det betyder så altid at der er kludder i ens " og & i strengen
syntes det er en sjov idee. Med gestus, til dem der hjulpet en :) Syntes det er en remlig måde og acceptabel måde at sige mange tak, "uden dig havede jeg ik det her"
tjo, det kan man sige, Men ville gerne takke på min måde
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.