Avatar billede pokejohn Nybegynder
28. april 2005 - 18:05 Der er 13 kommentarer og
1 løsning

Fejl ved brug af "request.querystring"

Jeg har en side hvor nogle data bliver hentet fra en database. De bliver så listet på en række og ved hver post er der et link som åbner et popup vindue. I dette popup vindue skulle der så kun vises data fra en ene bestemte post.. Jeg har spurgt om det tidligere og fik det til at virke, men kun i et test dokument og med en test database. Så kopierede jeg det over i et nyt dokument, og rettede lidt i koden så det passede med den nye database, og vupti - så virkede det ikke..
Det virker fint nok med den første side der lister alle posterne, men når jeg åbner popupvinduet melder den denne fejl:

Microsoft OLE DB Provider for ODBC Drivers error '80040e21'
ODBC driver does not support the requested properties.
/lordpoke/popup.asp, line 17

Linje 17 = rs.Open strSQL, strDSN, 1

Min kode for siden hvor alle posterne bliver listet er:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>TITLE</title>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>

<body>

<table style="width:100%;height:100%;" cellpadding="0" cellspacing="0">
<tr>
    <td style="height:100%;vertical-align:middle;">

    <table style="width:760px;border:2px solid #005522;margin:0px auto;" cellpadding="0" cellspacing="0">
    <tr>
        <td style="width:430px;border-right:2px solid #005522;padding:10px;vertical-align:top;" rowspan="7">
          <table cellpadding="0" cellspacing="6">
          <%
          intPage = Request("page")
          If isNumeric(intPage) = False Or intPage < 1 Then
            intPage = 1
          End If
           
          Set rs = Server.CreateObject("ADODB.RecordSet")
          strSQL = "SELECT vnr, mrk, mdl, vinfo, hp FROM t_produkter WHERE hp = true"
          strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("database.mdb")
          rs.Open strSQL, strDSN, 1
         
          If Not (rs.BOF Or rs.EOF) Then
            rs.PageSize = 4
            rs.AbsolutePage = intPage
            intRecCount = rs.PageSize
            intPageCount = rs.PageCount
            Do While Not rs.EOF And intRecCount > 0
           
            If rs("hp") = true then
          %>
          <tr>
              <td style="width:100px;height:100px;"><img src="billeder/<% Response.Write rs("vnr") %>.jpg" width="100" height="100"></td>
              <td style="width:276px;height:100px;"><font class="pro_l">
              <% response.write (rs("mrk") & "&nbsp;" & rs("mdl") & "&nbsp;(" & rs("vnr") & ")") %>
              </font><br>
              <%
              If len(rs("vinfo")) > 30 Then
                Response.write(left(rs("vinfo"),30) & "...")
              Else
                Response.Write rs("vinfo")
              end if
              %>
              <br><br>Klik <a href="#" onClick="MyWindow=window.open('popup.asp?vnr=<% response.write rs("vnr")%>','MyWindow','toolbar=no,location=yes,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,width=600,height=800'); return false;">HER</a> for mere info</td>
          </tr>
          <%
            End If
            intRecCount = intRecCount - 1
            rs.MoveNext
            Loop
          End If
         
          rs.Close
          Set rs = Nothing
          %>
          </table></td>
        <td class="menu" style="height:135px;"><font class="os">Produkter</font><br>
        <%
        Response.Write "Side " & intPage & " af " & intPageCount & "<br>"
        If Clng(intPage) > 1 Then
          Response.Write "<a href=produkt.asp?page=" & intPage - 1 & ">Forrige side</a>"
        Else
          Response.Write ""
        End If
        Response.Write "&nbsp;"
        For intNum = 1 To intPageCount
        Response.Write "<a href=produkt.asp?page=" & intNum & ">" & intNum & "</a> "
        Next
        Response.Write "&nbsp;"
        If Clng(intPage) < Clng(intPageCount) Then
          Response.Write "<a href=produkt.asp?page=" & intPage + 1 & ">Næste side</a> "
        Else
          Response.Write ""
        End If
        %></td>
    </tr>
    <tr>
        <td class="menu">Forside</td>
    </tr>
    <tr>
        <td class="menu">Billeder</td>
    </tr>
    <tr>
        <td class="menu">Firmaprofil</td>
    </tr>
    <tr>
        <td class="menu">PHOTOCARE.DK</td>
    </tr>
    <tr>
        <td style="width:310px;height:175px;background-image:url(logotest.jpg);"></td>
    </tr>
    </table>

    </td>
</tr>
</table>

</body>
</html>

...og min kode for mit popup vindue ser sådan ud:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>Paging af et recordset</title>
</head>
<body>

<table border="1">
  <%
  Set rs = Server.CreateObject("ADODB.RecordSet")
  strSQL = "SELECT vnr, mrk, mdl, vinfo FROM t_produkter where vnr=" & request.querystring("vnr") & ""
  strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("database.mdb")
  rs.Open strSQL, strDSN, 1
  %>
  <tr>
    <td><img src="billeder/<% Response.Write rs("vnr") %>.jpg"></td>
  </tr>
  <tr>
    <td><font class="pro_l">
    <% response.write (rs("mrk") & "&nbsp;" & rs("mdl") & "&nbsp;(" & rs("vnr") & ")") %>
    </font><br>
    <%
    Response.Write rs("vinfo")
    %></td>
  </tr>
  <%
  rs.Close
  Set rs = Nothing
  %>
</table>

</body></html>


Det virker hvis jeg sletter:
where vnr=" & request.querystring("vnr") & ""
eller erstatter det med:
where hp = true"

Jeg har siddet og rodet med det et stykke tid og syntes ikke at jeg kommer nærmere end konklusion..
Nogen der kan hjælpe?
Avatar billede and_ Nybegynder
28. april 2005 - 18:16 #1
Udskriv din sql, når den fejler:

Set rs = Server.CreateObject("ADODB.RecordSet")
strSQL = "SELECT vnr, mrk, mdl, vinfo, hp FROM t_produkter WHERE hp = true"
response.write(strSQL & "<br><br>")
strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("database.mdb")
          rs.Open strSQL, strDSN, 1


skift selv slutningen ud med kriterier du har
vnr = tal eller tekst?
Avatar billede and_ Nybegynder
28. april 2005 - 18:21 #2
Og så poster du lige dine udskrevne sqlsætninger herinde ;)
Avatar billede busschou Praktikant
28. april 2005 - 21:15 #3
lige en kommentar
Du vælger alle felter i din database hvor hp=true
Derefter løber du dem igennem
For hver post har du en
if rs("hp") = true then
Den er vist pænt overflødig den if sætning, eftersom alt du henter fra databasen jo har rs("hp") = true jvnf din sql sætning ;o)
Avatar billede pokejohn Nybegynder
28. april 2005 - 22:49 #4
@Busschou
Korrekt - det er et levn fra før jeg laver kriteriet i starten!

@and
Skal jeg bare indsætte response.write(strSQL & "<br><br>") i popup.asp?
Avatar billede pokejohn Nybegynder
28. april 2005 - 22:56 #5
Hvis jeg gør det skriver den bare:
SELECT vnr, mrk, mdl, vinfo FROM t_produkter where vnr=111111

Også kommer samme fejl igen..
Avatar billede and_ Nybegynder
28. april 2005 - 22:58 #6
jeps, men nu kan vi se udtrækket

er vnr tekst eller tal?
Avatar billede pokejohn Nybegynder
28. april 2005 - 23:01 #7
vnr er tekst...
Avatar billede and_ Nybegynder
28. april 2005 - 23:03 #8
så er det derfor!

tekst skal have '' når du sammenligner ;)

strSQL = "SELECT vnr, mrk, mdl, vinfo, hp FROM t_produkter WHERE vnr = '" & request.querystring("vnr") & "'"
Avatar billede and_ Nybegynder
28. april 2005 - 23:04 #9
og så kunne vi jo udvide den lidt, så du slipper for din if-sætning:

strSQL = "SELECT vnr, mrk, mdl, vinfo, hp FROM t_produkter WHERE (vnr = '" & request.querystring("vnr") & "' and hp = true)"
Avatar billede and_ Nybegynder
28. april 2005 - 23:05 #10
Dog vil jeg mene at du skal gå lidt mere op i validering af input, da du kan blive offer for sql-injections

læs:
http://activedeveloper.dk/artikler/default.asp?articleid=370
Avatar billede pokejohn Nybegynder
28. april 2005 - 23:14 #11
Takker...
Det virker nu!

Det er ikke i den fil med den udnødvendige IF sætning, hvor koden skal indsættes, så hp = true) behøver ikke være med..
Avatar billede and_ Nybegynder
28. april 2005 - 23:16 #12
ok ;o)

Takker for points :)
Avatar billede pokejohn Nybegynder
28. april 2005 - 23:18 #13
Jeg skimtede lige artiklen.. Jeg tror ikke, at jeg gider til at sætte mig ind i det! De to eneste der skal se siden er min lærer og min censor, og vi skal ikke tænkte på sikkerhed (som jeg forstår, er det artiklen handler om) da det ikke indgår i pensum!
Avatar billede and_ Nybegynder
28. april 2005 - 23:27 #14
tja... Vi kunne da lige hurtigt kradse noget sammen til dig :)
Det giver jo nok lidt højere når de kan se at du tænker på lidt på sikkerheden også...

Lav enten en ny fil som du kan inkludere på de sider hvor du skal validere input, du kan også bare nøjes med at sætte den ind på de sider hvor du skal bruge den, dog er det smartere med inkludering, da du så kun skal rette et sted..
Det samme kan du også gøre med dine connections!

function validertxt(txt)
  if not len(txt) = 0 then
    txt = replace(txt, "'", "''")
    txt = replace(txt, """", """""")
  end if
  validertxt = txt
end function

og så skal din sql se således ud:
strSQL = "SELECT vnr, mrk, mdl, vinfo, hp FROM t_produkter WHERE vnr = '" & validertxt(request.querystring("vnr")) & "'"


Denne function er dog lidt "skrabet" (dovenskab :), men den sikrer da at man ikke kan bruge ' eller " som kan få scriptet til at fejle..

Du kan bruge denne til alt du sætter ind i basen, dog skal du huske at "vende" valideringen igen når du udskriver teksten fra basen...
Samme funktion, bare omvendt ;)
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