Avatar billede totalpc Seniormester
12. juli 2011 - 20:45 Der er 28 kommentarer og
1 løsning

Parameterisering af databasekald med ASP og ADO - igen

Jeg prøver at benytte mig af ovenstående, men kan ikke få det til at virke med mit søgescript.

1. hjælp til at få det til at virke
2. Når det virker, er ting som
    txtSearch = request("search")
    txtSearch = Replace(txtSearch,"'","")
så nødvendige?

Jeg har nok rodet lidt meget rundt i connectionstring kaldet, så ret mig endelig.


<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->
<table>
    <tr>
        <td>
            Indtast et eller flere søgeord adskilt af mellemrum. Husk at vælge om du vil søge efter et eller alle ord.
        </td>
    <tr>
</table>
<%
checkbox=Request("checkbox")
radiotype=Request("radiotype")
%>
<table border="0" width="400" cellpadding="0" style="border-collapse: collapse">
  <tr>
    <td class="broed">
      <form method="POST" action="?page=search" style="padding: 0; float:left; height: 0; text-align:left">
      <input value="<%=request.form("search")%>" type="text" name="search" size="18"><br>
      <input type="radio" name="radiotype" value="typeOR"  <% if (radiotype="typeOR" AND request.form("search") = "") OR (radiotype="" AND request.form("search") = "") OR radiotype="typeOR" then %> checked  <% else %><% end if %>> søg efter et af ordene <br>
            <input type="radio" name="radiotype" value="typeAND" <% if (radiotype="typeAND" AND request.form("search") = "") OR (radiotype="typeAND") then %> checked  <% else %><% end if %>>  resultatet skal indeholde samtlige ord <br>
      <br>Vælg kategorier der skal søges i:<br>
      <input type="checkbox" name="checkbox" value="3"  <% if contains(checkbox,"3")  or request.form("search") ="" then %> checked<% end if %>>  Jeg  <br>
      <input type="checkbox" name="checkbox" value="4"  <% if contains(checkbox,"4")  or request.form("search") ="" then %> checked<% end if %>>  Jeg <br>
      <input type="checkbox" name="checkbox" value="5"  <% if contains(checkbox,"5")  or request.form("search") ="" then %> checked<% end if %>>  Jeg  <br>
      <input type="checkbox" name="checkbox" value="8"  <% if contains(checkbox,"8")  or request.form("search") ="" then %> checked<% end if %>>  len <br>
      <input type="checkbox" name="checkbox" value="21" <% if contains(checkbox,"21") or request.form("search") ="" then %> checked<% end if %>>  åde <br>
      <input type="checkbox" name="checkbox" value="22" <% if contains(checkbox,"22") or request.form("search") ="" then %> checked<% end if %>>  ronik <br>
      <input type="checkbox" name="checkbox" value="23" <% if contains(checkbox,"23") or request.form("search") ="" then %> checked<% end if %>>  rer <br>
      <input type="checkbox" name="checkbox" value="24" <% if contains(checkbox,"24") or request.form("search") ="" then %> checked<% end if %>>  ng <br>
      <input type="checkbox" name="checkbox" value="26" <% if contains(checkbox,"26") or request.form("search") ="" then %> checked<% end if %>>  g  <br>
      <input type="checkbox" name="checkbox" value="27" <% if contains(checkbox,"27") or request.form("search") ="" then %> checked<% end if %>>  ere <br>
      <input type="checkbox" name="checkbox" value="28" <% if contains(checkbox,"28") or request.form("search") ="" then %> checked<% end if %>>  et <br>
      <input type="checkbox" name="checkbox" value="29" <% if contains(checkbox,"29") or request.form("search") ="" then %> checked<% end if %>>  søges <br>
      <input type="checkbox" name="checkbox" value="30" <% if contains(checkbox,"30") or request.form("search") ="" then %> checked<% end if %>>  olm  <br>
      <input type="checkbox" name="checkbox" value="31" <% if contains(checkbox,"31") or request.form("search") ="" then %> checked<% end if %>>  lyst <br><br>
      <input name="send" align="top" type="submit" vale="Søg">
      </form>
    </td>
  </tr>
</table>
<%

'Funktion til at finde ud f om en checkbox findes
function contains(str, substr)
  contains = instr("," & replace(str," ","") & ",", "," & substr & ",") > 0
end function

if checkbox ="" and request.form("search") <> "" then
    response.write "<p align=center><FONT size=1 face=verdana color=red><b>Der skal søges i mindst en kategori</b></font></p>"
else

If request.form("search") <> "" Then
'Er dette nødvendigt ?   
    txtSearch = request("search")
    txtSearch = Replace(txtSearch,"'","")

'Opbyg where parametre for hvert søgeord

searchtext = split(txtsearch, " ")
for each item in searchtext

  if trim(item) <> "" then
        if request("radiotype") = "typeOR" then
            sql1 = sql1 & "m.GuestBookID = g.ID AND (  (GuestBookID IN ( "& checkbox &" ) AND PATINDEX('%" & item& "%',Message)>0 )) OR "
      sql2 = sql2 & "s.MessagesID = m.ID AND m.GuestBookID = g.ID AND ( ( m.GuestBookID IN(  "& checkbox &"  ) AND PATINDEX('%" & item & "%',s.svar)>0)) OR "
    elseif request("radiotype") = "typeAND" then
          sql1 = sql1 & "m.GuestBookID = g.ID AND (  (GuestBookID IN ( "& checkbox &" ) AND PATINDEX('%" & item& "%',Message)>0 )) AND "
      sql2 = sql2 &  "s.MessagesID = m.ID AND m.GuestBookID = g.ID AND ( ( m.GuestBookID IN(  "& checkbox &"  ) AND PATINDEX('%" & item & "%',s.svar)>0)) AND "
    End if
  end if

next
'Fjern OR eller AND i slutningen
        if request("radiotype") = "typeOR" then
            sql1 = left(sql1,len(sql1)-len(" OR "))
            sql2 = left(sql2,len(sql2)-len(" OR "))
        elseif request("radiotype") = "typeAND" then
        sql1 = left(sql1,len(sql1)-len(" AND "))
            sql2 = left(sql2,len(sql2)-len(" AND "))
        End If

SQL = "SELECT 'MESSAGE' AS [Kategori], m.ID, m.ID AS [MessageID], m.Message AS [tekst], m.GuestBookID AS [MainID], m.Name AS [Navn], m.PostedTime, g.GuestBookName FROM [dbo].[TblMessages] m, [dbo].[TblGuestBooks] g WHERE ? UNION SELECT 'SVAR' AS [Kategori], s.svarID AS [ID], m.ID AS [MessageID], svar as [tekst], s.MessagesID AS [MainID], s.navn AS [Navn], s.PostedTime, g.GuestBookName FROM [dbo].[T_Svar] s, [dbo].[TblMessages] m, [dbo].[TblGuestBooks] g WHERE s.MessagesID = m.ID AND m.GuestBookID = g.ID AND ? ORDER BY 3, PostedTime ASC"

Set CString = Server.CreateObject("ADODB.Connection")
cString.open "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

function GetCommand(sql)
  dim cmd
  set cmd = Server.CreateObject("ADODB.Command")
  set cmd.ActiveConnection = cString
  cmd.CommandText = sql
  cmd.CommandType = adCmdText
  set GetCommand = cmd
end function

Set cmd = GetCommand(sql)
set rs = cmd.Execute(, array(sql1,sql2))


if rs.eof then
  response.write "<p align=center><FONT size=1 face=verdana><b>Ingen resultat af søgningen</b></font></p>"
else

%>
<br>
<table width="100%">
    <tr>
        <TD>Søgeresultat herunder. Pt kun til test. Når testen er færdig skal man kunne klikke på teksten og komme til det indlægget/svaret!</td>
    </tr>
</table>
  <br>
<table width="100%">
    <tr>
        <TD width="10%">Type</td><TD width="10%">Kategori</td><TD width="45%">Tekst</td><TD width="15%">Dato</td><TD width="20%">Navn</td>
    </tr>
</table>   

<%   

Do While not rs.EOF
%>
<table width="100%">
    <tr>
<%
if rs("kategori") = "SVAR" then
    kategori="Svar til indlæg"
elseif rs("kategori") = "MESSAGE" then
    kategori="Indlæg"
End If
response.write "<td width=""10%"">" & Kategori &"</TD>"
response.write "<td width=""10%"">" & rs("guestbookname") &"</TD>"
response.write "<td width=""45%"">" & rs("tekst") &"</a></TD>"
'response.write "<td width=""45%""><a href=""#"" >" & Replace(Left(rs("tekst"),80), "<br>", " ") &"</a></TD>"
response.write "<td width=""15%"">" & FormatDateTime(rs("PostedTime"), vbShortDate) &"</TD>"
response.write "<td width=""20%"">" & rs("navn") &"</TD>"
response.write "<HR>"

    rs.MoveNext
Loop
%>
</TR>
</table>
<%
End If

    RS.Close
    Set RS = Nothing

End if
End If
%>
Avatar billede totalpc Seniormester
12. juli 2011 - 20:47 #1
PT står der stadig ? når jeg laver en response.write sql
Avatar billede arne_v Ekspert
12. juli 2011 - 21:08 #2
replace af quotes er ikke noedvendigt og vil resultere i forkerte data naar man bruger parameters
Avatar billede arne_v Ekspert
12. juli 2011 - 21:09 #3
koden er lidt stor at gennemskue
Avatar billede totalpc Seniormester
12. juli 2011 - 21:24 #4
Jeg har fjernet replace af quotes.
Skal jeg prøve at rydde lidt ud i det urelevante for spørgsmålet?
Avatar billede softspot Forsker
12. juli 2011 - 21:43 #5
Du har fået vendt rundt på koncpetet med parametre. Du kan ikke indsætte en del-SQL-sætning som en parameter til en SQL-sætning og din måde at opbygge del-SQL-sætningerne på er umiddelbart åben for SQL-injections.

Jeg ved ikke hvad PATINDEX SQL-kommandoen gør (det kan være du lige kan forklare det kort?), men du skal i det mindste benytte ADO Command-parametre som input til den funktion.

Dine checklister et andet angrebspunkt i din SQL-sætningsopbygning. Optimalt set (fra et sikkerhedsmæssigt synspunkt) opbygger du en parameter-streng og en tilhørende liste af værdier til dine IN SQL-opslag. Eksempelvis skal en checklist med værdierne 1,4,6,7 omdannes til en streng ("?,?,?,?") som sammensættes med SQL-sætningen, samt et array med værdierne (dvs. array(1,4,6,7)), hvor arrayets værdier tilføjes den samlede parameterliste i KRONOLOGISK orden...

Spørgsmålet er, om du ikke ville få lettere ved at overskue tingene, hvis du splittede opslagene lidt op, og lavede subqueries ud af noget af det (jeg kan dog ikke helt gennemskue om og hvordan pt.)...?
Avatar billede totalpc Seniormester
12. juli 2011 - 22:11 #6
Puha....tror lige jeg læser din guide igen i morgen tidlig og kigger det hele igen med friske øjne.

Pathindex finder blot startpositionen for en string og så bruger jeg den bare sådan at hvis den er større end 0 har den fundet søgeordet!
Avatar billede softspot Forsker
12. juli 2011 - 22:23 #7
Jeg har prøvet at tilpasse din kode (men ikke testet det!), så den forsøger at tage højde for de ting jeg nævner. Se om du kan bruge det til noget:

<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->
<table>
    <tr>
        <td>
            Indtast et eller flere søgeord adskilt af mellemrum. Husk at vælge om du vil søge efter et eller alle ord.
        </td>
    <tr>
</table>
<%
checkbox=Request("checkbox")
radiotype=Request("radiotype")
%>
<table border="0" width="400" cellpadding="0" style="border-collapse: collapse">
  <tr>
    <td class="broed">
      <form method="POST" action="?page=search" style="padding: 0; float:left; height: 0; text-align:left">
        <input value="<%=request.form("search")%>" type="text" name="search" size="18"><br>
        <input type="radio" name="radiotype" value="typeOR"  <% if (radiotype="typeOR" AND request.form("search") = "") OR (radiotype="" AND request.form("search") = "") OR radiotype="typeOR" then %> checked  <% else %><% end if %>> søg efter et af ordene <br>
        <input type="radio" name="radiotype" value="typeAND" <% if (radiotype="typeAND" AND request.form("search") = "") OR (radiotype="typeAND") then %> checked  <% else %><% end if %>>  resultatet skal indeholde samtlige ord <br>
        <br>Vælg kategorier der skal søges i:<br>
        <input type="checkbox" name="checkbox" value="3"  <% if contains(checkbox,"3")  or request.form("search") ="" then %> checked<% end if %>>  Jeg  <br>
        <input type="checkbox" name="checkbox" value="4"  <% if contains(checkbox,"4")  or request.form("search") ="" then %> checked<% end if %>>  Jeg <br>
        <input type="checkbox" name="checkbox" value="5"  <% if contains(checkbox,"5")  or request.form("search") ="" then %> checked<% end if %>>  Jeg  <br>
        <input type="checkbox" name="checkbox" value="8"  <% if contains(checkbox,"8")  or request.form("search") ="" then %> checked<% end if %>>  len <br>
        <input type="checkbox" name="checkbox" value="21" <% if contains(checkbox,"21") or request.form("search") ="" then %> checked<% end if %>>  åde <br>
        <input type="checkbox" name="checkbox" value="22" <% if contains(checkbox,"22") or request.form("search") ="" then %> checked<% end if %>>  ronik <br>
        <input type="checkbox" name="checkbox" value="23" <% if contains(checkbox,"23") or request.form("search") ="" then %> checked<% end if %>>  rer <br>
        <input type="checkbox" name="checkbox" value="24" <% if contains(checkbox,"24") or request.form("search") ="" then %> checked<% end if %>>  ng <br>
        <input type="checkbox" name="checkbox" value="26" <% if contains(checkbox,"26") or request.form("search") ="" then %> checked<% end if %>>  g  <br>
        <input type="checkbox" name="checkbox" value="27" <% if contains(checkbox,"27") or request.form("search") ="" then %> checked<% end if %>>  ere <br>
        <input type="checkbox" name="checkbox" value="28" <% if contains(checkbox,"28") or request.form("search") ="" then %> checked<% end if %>>  et <br>
        <input type="checkbox" name="checkbox" value="29" <% if contains(checkbox,"29") or request.form("search") ="" then %> checked<% end if %>>  søges <br>
        <input type="checkbox" name="checkbox" value="30" <% if contains(checkbox,"30") or request.form("search") ="" then %> checked<% end if %>>  olm  <br>
        <input type="checkbox" name="checkbox" value="31" <% if contains(checkbox,"31") or request.form("search") ="" then %> checked<% end if %>>  lyst <br><br>
        <input name="send" align="top" type="submit" vale="Søg">
      </form>
    </td>
  </tr>
</table>
<%

'Funktion til at finde ud f om en checkbox findes
function contains(str, substr)
  contains = instr("," & replace(str," ","") & ",", "," & substr & ",") > 0
end function

function GetCommand(sql)
  dim cmd
  set cmd = Server.CreateObject("ADODB.Command")
  set cmd.ActiveConnection = cString
  cmd.CommandText = sql
  cmd.CommandType = adCmdText
  set GetCommand = cmd
end function

function checkboxParamString(checkbox)
  dim u,i,tmp
  tmp = ""
  u = ubound(split(checkbox,","))
  for i = 0 to u
    if len(tmp) > 0 then tmp = tmp & ","
    tmp = tmp & "?"
  next
  checkboxParamString = tmp
end function

' Tilføj data i slutningen af arrayet arr.
' Hvis appendData er et array, tilføjes alle værdier i
' appendData til arr.
sub appendParams(byref arr, appendData)
  dim lenNewArr
  dim idx, uba
 
  if isArray(appendData) then
    lenNewArr = ubound(appendData) + 1
    if lenNewArr > 0 then
      uba = ubound(arr)
      redim preserve arr(uba + lenNewArr)
      for idx = 1 to lenNewArr
        arr(uba + idx) = appendData(idx - 1)
      next
    end if
  else
    redim preserve arr(ubound(arr) + 1)
    arr(ubound(arr) + 1) = appendData(idx-1)
  end if
end sub

if checkbox ="" and request.form("search") <> "" then
  response.write "<p align=center><FONT size=1 face=verdana color=red><b>Der skal søges i mindst en kategori</b></font></p>"
else

  If request.form("search") <> "" Then
    'Er dette nødvendigt ?   
    txtSearch = request("search")
    txtSearch = Replace(txtSearch,"'","")

    'Opbyg where parametre for hvert søgeord

    if request("radiotype") = "typeOR" then
      SearchTypeKeyword = " OR "
    else
      SearchTypeKeyword = " AND "
    end if

    params1 = array()
    params2 = array()
   
    searchtext = split(txtsearch, " ")
    for each item in searchtext

      if trim(item) <> "" then
        if len(sql1) > 0 then sql1 = sql1 & SearchTypeKeyword
        sql1 = sql1 & _
                "m.GuestBookID = g.ID " & _
                "AND ((GuestBookID IN ("& checkboxParamString(checkbox) &") " & _
                      "AND PATINDEX('%' + ? + '%',Message)>0 ))"

        call appendParams(params1, split(checkbox,","))
        call appendParams(params1, item)
               
        if len(sql1) > 0 then sql2 = sql2 & SearchTypeKeyword
        sql2 = sql2 & _
                "s.MessagesID = m.ID " & _
                "AND m.GuestBookID = g.ID " & _
                "AND ((m.GuestBookID IN("& checkboxParamString(checkbox) &") " & _
                      "AND PATINDEX('%' + ? + '%',s.svar)>0))"
                     
        call appendParams(params2, split(checkbox,","))
        call appendParams(params2, item)
      end if

    next

    SQL = "SELECT " & _
            "'MESSAGE' AS [Kategori], " & _
            "m.ID, m.ID AS [MessageID], " & _
            "m.Message AS [tekst], " & _
            "m.GuestBookID AS [MainID], " & _
            "m.Name AS [Navn], " & _
            "m.PostedTime, " & _
            "g.GuestBookName " & _
          "FROM " & _
            "[dbo].[TblMessages] m, " & _
            "[dbo].[TblGuestBooks] g " & _
          "WHERE " & _
            sql1 & " " & _
          "UNION " & _
          "SELECT " & _
            "'SVAR' AS [Kategori], " & _
            "s.svarID AS [ID], " & _
            "m.ID AS [MessageID], " & _
            "svar as [tekst], " & _
            "s.MessagesID AS [MainID], " & _
            "s.navn AS [Navn], " & _
            "s.PostedTime, " & _
            "g.GuestBookName " & _
          "FROM " & _
            "[dbo].[T_Svar] s, " & _
            "[dbo].[TblMessages] m, " & _
            "[dbo].[TblGuestBooks] g " & _
          "WHERE " & _
            "s.MessagesID = m.ID " & _
            "AND m.GuestBookID = g.ID " & _
            "AND " & _
            sql2 & " " & _
          "ORDER BY " & _
            "3, " & _
            "PostedTime ASC"

    Set CString = Server.CreateObject("ADODB.Connection")
    cString.open "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    params = array()
   
    call appendParams(params, params1)
    call appendParams(params, params2)
   
    Set cmd = GetCommand(sql)
    set rs = cmd.Execute(, params)


    if rs.eof then
      response.write "<p align=center><FONT size=1 face=verdana><b>Ingen resultat af søgningen</b></font></p>"
    else
 
%>
<br>
<table width="100%">
    <tr>
        <TD>Søgeresultat herunder. Pt kun til test. Når testen er færdig skal man kunne klikke på teksten og komme til det indlægget/svaret!</td>
    </tr>
</table>
  <br>
<table width="100%">
    <tr>
        <TD width="10%">Type</td><TD width="10%">Kategori</td><TD width="45%">Tekst</td><TD width="15%">Dato</td><TD width="20%">Navn</td>
    </tr>
</table>   

<%   

    Do While not rs.EOF
%>
<table width="100%">
    <tr>
<%
      if rs("kategori") = "SVAR" then
        kategori="Svar til indlæg"
      elseif rs("kategori") = "MESSAGE" then
        kategori="Indlæg"
      End If

      response.write "<td width=""10%"">" & Kategori &"</TD>"
      response.write "<td width=""10%"">" & rs("guestbookname") &"</TD>"
      response.write "<td width=""45%"">" & rs("tekst") &"</a></TD>"
      'response.write "<td width=""45%""><a href=""#"" >" & Replace(Left(rs("tekst"),80), "<br>", " ") &"</a></TD>"
      response.write "<td width=""15%"">" & FormatDateTime(rs("PostedTime"), vbShortDate) &"</TD>"
      response.write "<td width=""20%"">" & rs("navn") &"</TD>"
      response.write "<HR>"

      rs.MoveNext
    Loop
%>
</TR>
</table>
<%
    End If

    RS.Close
    Set RS = Nothing

  End if
End If
%>

Der kan helt sikkert stadig justeres på nogle ting for at gøre det mere overskueligt, men betragt dette som et beta foreslag ;-)
Avatar billede totalpc Seniormester
13. juli 2011 - 17:40 #8
Altså jeg ved ikke om du gider hjælpe mig færdig, men jeg er langt ude over mine evner føler jeg :)

Ovenstående giver denne fejl:
ADODB.Command error '800a0bb9'

Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

/sql/test/test.asp, line 181

Men der mangler jo også noget af where claus'en
SELECT 'MESSAGE' AS [Kategori], m.ID, m.ID AS [MessageID], m.Message AS [tekst], m.GuestBookID AS [MainID], m.Name AS [Navn], m.PostedTime, g.GuestBookName FROM [dbo].[TblMessages] m, [dbo].[TblGuestBooks] g WHERE UNION SELECT 'SVAR' AS [Kategori], s.svarID AS [ID], m.ID AS [MessageID], svar as [tekst], s.MessagesID AS [MainID], s.navn AS [Navn], s.PostedTime, g.GuestBookName FROM [dbo].[T_Svar] s, [dbo].[TblMessages] m, [dbo].[TblGuestBooks] g WHERE s.MessagesID = m.ID AND m.GuestBookID = g.ID AND ORDER BY 3, PostedTime ASC

Jeg går udfra at det slet ikke kan sammenlignes sikkerhedsmæssig replace funktionen og så det at bruge command objektet? For det andet forstår jeg...det her er lidt langhåret :)
Avatar billede softspot Forsker
13. juli 2011 - 17:54 #9
Det skal jeg nok hjælpe med. Jeg skal lige have koden opdelt i nogle flere funktioner som jeg kan teste særskilt og så vender jeg tilbage...

Umiddelbart ser det ud til at der ikke er blevet indtastet nogle søgekriterier (eller aflæsning af søgetekst-feltet ikke er gået godt).

Udfordringen ved at bruge replace på input er, at det er svært at gardere sig mod alle de idéer ondsindede brugere af dit site kan finde på at kaste efter din kode. Command-objektet håndterer alle disse problemer for dig, så det ville jo være fjollet ikke at tage imod dét tilbud! :-)
Avatar billede softspot Forsker
13. juli 2011 - 18:34 #10
Jeg har fedtet lidt med koden og jeg er kommet frem til flg. kode. Prøv om det fungerer for dig og giv mig en melding:

<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->
<%
'Funktion til at finde ud f om en checkbox findes
function contains(str, substr)
  contains = instr("," & replace(str," ","") & ",", "," & substr & ",") > 0
end function

function GetCommand(sql)
  dim cmd
  set cmd = Server.CreateObject("ADODB.Command")
  set cmd.ActiveConnection = cString
  cmd.CommandText = sql
  cmd.CommandType = adCmdText
  set GetCommand = cmd
end function

function checkboxParamString(arr)
  dim u,i,tmp
  tmp = ""
  u = ubound(arr)
  for i = 0 to u
    if len(tmp) > 0 then tmp = tmp & ","
    tmp = tmp & "?"
  next
  checkboxParamString = tmp
end function

' Tilføj data i slutningen af arrayet arr.
' Hvis appendData er et array, tilføjes alle værdier i
' appendData til arr.
sub appendParams(byref arr, appendData)
  dim lenNewArr
  dim idx, uba
 
  if isArray(appendData) then
    lenNewArr = ubound(appendData) + 1
    if lenNewArr > 0 then
      uba = ubound(arr)
      redim preserve arr(uba + lenNewArr)
      for idx = 1 to lenNewArr
        arr(uba + idx) = appendData(idx - 1)
      next
    end if
  else
    redim preserve arr(ubound(arr) + 1)
    arr(ubound(arr)) = appendData
  end if
end sub

sub buildSQLAndParams(searchText, checkboxChoices, radioType, byref sql, byref params)
  dim params1, params2
  dim word, searchWords, checkChoices, searchTypeKeyword
  dim sql1, sql2
 
  params1 = array()
  params2 = array()
 
  checkChoices = split(checkboxChoices,",")
  searchWords = split(searchText, " ")
 
  if radiotype = "typeOR" then
    searchTypeKeyword = " OR "
  else
    searchTypeKeyword = " AND "
  end if

  for each word in searchWords

    if trim(word) <> "" then
      if len(sql1) > 0 then sql1 = sql1 & searchTypeKeyword
      sql1 = sql1 & _
              "m.GuestBookID = g.ID " & _
              "AND ((GuestBookID IN ("& checkboxParamString(checkChoices) &") " & _
                    "AND PATINDEX('%' + ? + '%',Message)>0 ))"

      call appendParams(params1, checkChoices)
      call appendParams(params1, word)
             
      if len(sql1) > 0 then sql2 = sql2 & searchTypeKeyword
      sql2 = sql2 & _
              "s.MessagesID = m.ID " & _
              "AND m.GuestBookID = g.ID " & _
              "AND ((m.GuestBookID IN("& checkboxParamString(checkChoices) &") " & _
                    "AND PATINDEX('%' + ? + '%',s.svar)>0))"
                   
      call appendParams(params2, checkChoices)
      call appendParams(params2, word)
    end if

  next

  sql = "SELECT " & _
          "'MESSAGE' AS [Kategori], " & _
          "m.ID, m.ID AS [MessageID], " & _
          "m.Message AS [tekst], " & _
          "m.GuestBookID AS [MainID], " & _
          "m.Name AS [Navn], " & _
          "m.PostedTime, " & _
          "g.GuestBookName " & _
        "FROM " & _
          "[dbo].[TblMessages] m, " & _
          "[dbo].[TblGuestBooks] g " & _
        "WHERE " & _
          sql1 & " " & _
        "UNION " & _
        "SELECT " & _
          "'SVAR' AS [Kategori], " & _
          "s.svarID AS [ID], " & _
          "m.ID AS [MessageID], " & _
          "svar as [tekst], " & _
          "s.MessagesID AS [MainID], " & _
          "s.navn AS [Navn], " & _
          "s.PostedTime, " & _
          "g.GuestBookName " & _
        "FROM " & _
          "[dbo].[T_Svar] s, " & _
          "[dbo].[TblMessages] m, " & _
          "[dbo].[TblGuestBooks] g " & _
        "WHERE " & _
          "s.MessagesID = m.ID " & _
          "AND m.GuestBookID = g.ID " & _
          "AND " & _
          sql2 & " " & _
        "ORDER BY " & _
          "3, " & _
          "PostedTime ASC"

  params = array()
 
  call appendParams(params, params1)
  call appendParams(params, params2)
end sub
   
sub visResultat(sql, params)
  dim conn

  set conn = Server.CreateObject("ADODB.Connection")
  conn.open "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

  set cmd = GetCommand(sql, conn)
  set rs = cmd.Execute(, params)


  if rs.eof then
    response.write "<p align=center><FONT size=1 face=verdana><b>Ingen resultat af søgningen</b></font></p>"
  else
 
%>
<br>
<table width="100%">
    <tr>
        <TD>Søgeresultat herunder. Pt kun til test. Når testen er færdig skal man kunne klikke på teksten og komme til det indlægget/svaret!</td>
    </tr>
</table>
  <br>
<table width="100%">
    <tr>
        <TD width="10%">Type</td><TD width="10%">Kategori</td><TD width="45%">Tekst</td><TD width="15%">Dato</td><TD width="20%">Navn</td>
    </tr>
</table>   

<%   

  do while not rs.EOF
%>
<table width="100%">
    <tr>
<%
    if rs("kategori") = "SVAR" then
      kategori="Svar til indlæg"
    elseif rs("kategori") = "MESSAGE" then
      kategori="Indlæg"
    end if

    response.write "<td width=""10%"">" & Kategori &"</TD>"
    response.write "<td width=""10%"">" & rs("guestbookname") &"</TD>"
    response.write "<td width=""45%"">" & rs("tekst") &"</a></TD>"
    'response.write "<td width=""45%""><a href=""#"" >" & Replace(Left(rs("tekst"),80), "<br>", " ") &"</a></TD>"
    response.write "<td width=""15%"">" & FormatDateTime(rs("PostedTime"), vbShortDate) &"</TD>"
    response.write "<td width=""20%"">" & rs("navn") &"</TD>"
    response.write "<HR>"

    rs.MoveNext
  loop
%>
</TR>
</table>
<%
  end if

  RS.Close
  Set RS = Nothing
  conn.close
  set conn = nothing
end sub

dim params
dim sql
dim search
dim checkbox
dim radiotype

checkbox = Request("checkbox") & ""
radiotype = Request("radiotype") & ""
search = request("search") & ""

%>

<table>
    <tr>
        <td>
            Indtast et eller flere søgeord adskilt af mellemrum. Husk at vælge om du vil søge efter et eller alle ord.
        </td>
    <tr>
</table>
<table border="0" width="400" cellpadding="0" style="border-collapse: collapse">
  <tr>
    <td class="broed">
      <form method="POST" action="?page=search" style="padding: 0; float:left; height: 0; text-align:left">
        <input value="<%=request.form("search")%>" type="text" name="search" size="18"><br>
        <input type="radio" name="radiotype" value="typeOR"  <% if (radiotype="typeOR" AND request.form("search") = "") OR (radiotype="" AND request.form("search") = "") OR radiotype="typeOR" then %> checked  <% else %><% end if %>> søg efter et af ordene <br>
        <input type="radio" name="radiotype" value="typeAND" <% if (radiotype="typeAND" AND request.form("search") = "") OR (radiotype="typeAND") then %> checked  <% else %><% end if %>>  resultatet skal indeholde samtlige ord <br>
        <br>Vælg kategorier der skal søges i:<br>
        <input type="checkbox" name="checkbox" value="3"  <% if contains(checkbox,"3")  or request.form("search") ="" then %> checked<% end if %>>  Jeg  <br>
        <input type="checkbox" name="checkbox" value="4"  <% if contains(checkbox,"4")  or request.form("search") ="" then %> checked<% end if %>>  Jeg <br>
        <input type="checkbox" name="checkbox" value="5"  <% if contains(checkbox,"5")  or request.form("search") ="" then %> checked<% end if %>>  Jeg  <br>
        <input type="checkbox" name="checkbox" value="8"  <% if contains(checkbox,"8")  or request.form("search") ="" then %> checked<% end if %>>  len <br>
        <input type="checkbox" name="checkbox" value="21" <% if contains(checkbox,"21") or request.form("search") ="" then %> checked<% end if %>>  åde <br>
        <input type="checkbox" name="checkbox" value="22" <% if contains(checkbox,"22") or request.form("search") ="" then %> checked<% end if %>>  ronik <br>
        <input type="checkbox" name="checkbox" value="23" <% if contains(checkbox,"23") or request.form("search") ="" then %> checked<% end if %>>  rer <br>
        <input type="checkbox" name="checkbox" value="24" <% if contains(checkbox,"24") or request.form("search") ="" then %> checked<% end if %>>  ng <br>
        <input type="checkbox" name="checkbox" value="26" <% if contains(checkbox,"26") or request.form("search") ="" then %> checked<% end if %>>  g  <br>
        <input type="checkbox" name="checkbox" value="27" <% if contains(checkbox,"27") or request.form("search") ="" then %> checked<% end if %>>  ere <br>
        <input type="checkbox" name="checkbox" value="28" <% if contains(checkbox,"28") or request.form("search") ="" then %> checked<% end if %>>  et <br>
        <input type="checkbox" name="checkbox" value="29" <% if contains(checkbox,"29") or request.form("search") ="" then %> checked<% end if %>>  søges <br>
        <input type="checkbox" name="checkbox" value="30" <% if contains(checkbox,"30") or request.form("search") ="" then %> checked<% end if %>>  olm  <br>
        <input type="checkbox" name="checkbox" value="31" <% if contains(checkbox,"31") or request.form("search") ="" then %> checked<% end if %>>  lyst <br><br>
        <input name="send" align="top" type="submit" vale="Søg">
      </form>
    </td>
  </tr>
</table>
<%
if checkbox = "" and search <> "" then
  response.write "<p align=center><FONT size=1 face=verdana color=red><b>Der skal søges i mindst en kategori</b></font></p>"
else

  if request.form("search") <> "" then
    call buildSQLAndParams(search, checkbox, radiotype, sql, params)
   
    call visResultat(sql, params)
    'response.Write "SQL: <br>" & replace(sql, vbCrLf, "<br>")
    'response.Write "Parametre: <br>" & join(params, ", ")
  end if
end if
%>
Avatar billede totalpc Seniormester
13. juli 2011 - 19:56 #11
Microsoft VBScript runtime error '800a01c2'

Wrong number of arguments or invalid property assignment: 'GetCommand'

/sql/test/test.asp, line 140


Og så bliver jeg også lige nød til at have en ekstra parameter med. En radiobutton så jeg kan vælge om der skal sorteres ASC eller DESC i SQL sætningen :)
Avatar billede softspot Forsker
13. juli 2011 - 20:14 #12
Ups! Jeg fik ikke lige rettet GetCommand til (jeg har tilføjet en parameter til connectionobjektet). Udskift den eksisterende med denne:

function GetCommand(sql, conn)
  dim cmd
  set cmd = Server.CreateObject("ADODB.Command")
  set cmd.ActiveConnection = conn
  cmd.CommandText = sql
  cmd.CommandType = adCmdText
  set GetCommand = cmd
end function

Det med sorteringsordenen tager vi lige når det her fungerer... :-)
Avatar billede totalpc Seniormester
13. juli 2011 - 22:00 #13
Der er søgt på 2 ord

SELECT 'MESSAGE' AS [Kategori], m.ID, m.ID AS [MessageID], m.Message AS [tekst], m.GuestBookID AS [MainID], m.Name AS [Navn], m.PostedTime, g.GuestBookName FROM [dbo].[TblMessages] m, [dbo].[TblGuestBooks] g WHERE m.GuestBookID = g.ID AND ((GuestBookID IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?) AND PATINDEX('%' + ? + '%',Message)>0 )) OR m.GuestBookID = g.ID AND ((GuestBookID IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?) AND PATINDEX('%' + ? + '%',Message)>0 )) UNION SELECT 'SVAR' AS [Kategori], s.svarID AS [ID], m.ID AS [MessageID], svar as [tekst], s.MessagesID AS [MainID], s.navn AS [Navn], s.PostedTime, g.GuestBookName FROM [dbo].[T_Svar] s, [dbo].[TblMessages] m, [dbo].[TblGuestBooks] g WHERE s.MessagesID = m.ID AND m.GuestBookID = g.ID AND OR s.MessagesID = m.ID AND m.GuestBookID = g.ID AND ((m.GuestBookID IN(?,?,?,?,?,?,?,?,?,?,?,?,?,?) AND PATINDEX('%' + ? + '%',s.svar)>0)) OR s.MessagesID = m.ID AND m.GuestBookID = g.ID AND ((m.GuestBookID IN(?,?,?,?,?,?,?,?,?,?,?,?,?,?) AND PATINDEX('%' + ? + '%',s.svar)>0)) ORDER BY 3, PostedTime ASC


Microsoft OLE DB Provider for SQL Server error '80040e14'

Incorrect syntax near the keyword 'OR'.

/sql/test/test.asp, line 143
Avatar billede softspot Forsker
13. juli 2011 - 22:25 #14
Prøv at udskifte SQL-sætningen med denne version:

  sql = "SELECT " & _
          "'MESSAGE' AS [Kategori], " & _
          "m.ID, m.ID AS [MessageID], " & _
          "m.Message AS [tekst], " & _
          "m.GuestBookID AS [MainID], " & _
          "m.Name AS [Navn], " & _
          "m.PostedTime, " & _
          "g.GuestBookName " & _
        "FROM " & _
          "[dbo].[TblMessages] m, " & _
          "[dbo].[TblGuestBooks] g " & _
        "WHERE " & _
          sql1 & " " & _
        "UNION " & _
        "SELECT " & _
          "'SVAR' AS [Kategori], " & _
          "s.svarID AS [ID], " & _
          "m.ID AS [MessageID], " & _
          "svar as [tekst], " & _
          "s.MessagesID AS [MainID], " & _
          "s.navn AS [Navn], " & _
          "s.PostedTime, " & _
          "g.GuestBookName " & _
        "FROM " & _
          "[dbo].[T_Svar] s, " & _
          "[dbo].[TblMessages] m, " & _
          "[dbo].[TblGuestBooks] g " & _
        "WHERE " & _
          "s.MessagesID = m.ID " & _
          "AND m.GuestBookID = g.ID " & _
          sql2 & " " & _
        "ORDER BY " & _
          "3, " & _
          "PostedTime ASC"

Bort set fra det, så synes jeg da du må få nogle problemer med grupperingen af dine AND og OR-sammenligningsoperatorer (eller så har du bare HELT styr på præcedensregler i SQL!!! :D)...
Avatar billede totalpc Seniormester
14. juli 2011 - 08:07 #15
Tja, altså SQL sætningen har været testet i et godt stykke tid og giver de rigtige resultater. Søgningen virkede jo fint før jeg begyndte på command tingen. Der kommer rigtig nok ingen fejl når jeg bruger SQL sætningen fra dit forslag, men til gengæld bliver søgeresultatet ikke rigtigt. Den finder alt for meget i OR søgningen.
Avatar billede softspot Forsker
14. juli 2011 - 08:48 #16
Jeg ville jo også forvente at sql1 og sql2 skulle se ud som nedenstående for at grupperingen af logikken i betingelserne kom til at fungere.

Dvs.
      sql1 = sql1 & _
              "(m.GuestBookID = g.ID " & _
              "AND ((GuestBookID IN ("& checkboxParamString(checkChoices) &") " & _
                    "AND PATINDEX('%' + ? + '%',Message)>0 )))"

hhv.
             
      sql2 = sql2 & _
              "(s.MessagesID = m.ID " & _
              "AND m.GuestBookID = g.ID " & _
              "AND ((m.GuestBookID IN("& checkboxParamString(checkChoices) &") " & _
                    "AND PATINDEX('%' + ? + '%',s.svar)>0)))"

Altså paranteser omkring hver delbetingelse i SQL-sætningen.

Jeg ved ikke hvad der er ændret fra den oprindelige udgave til den der benyttes sammen med command. Jeg har, efter min bedste overbevisning, taget udgangspunkt i den SQL du selv har præsenteret her i tråden.
Avatar billede totalpc Seniormester
14. juli 2011 - 09:55 #17
Her er den oprindelige udgave som virker.

SQL = "SELECT 'MESSAGE' AS [Kategori], m.ID, m.ID AS [MessageID], m.Message AS [tekst], m.GuestBookID AS [MainID], m.Name AS [Navn], m.PostedTime, g.GuestBookName FROM [dbo].[TblMessages] m, [dbo].[TblGuestBooks] g WHERE " & SQL1 & " UNION SELECT 'SVAR' AS [Kategori], s.svarID AS [ID], m.ID AS [MessageID], svar as [tekst], s.MessagesID AS [MainID], s.navn AS [Navn], s.PostedTime, g.GuestBookName FROM [dbo].[T_Svar] s, [dbo].[TblMessages] m, [dbo].[TblGuestBooks] g WHERE s.MessagesID = m.ID AND m.GuestBookID = g.ID AND " & sql2 & " ORDER BY 3, PostedTime ASC"

Afhængig af om det er OR eller AND søgning, skal sql1 og 2 se således ud.

if trim(item) <> "" then
        if request("radiotype") = "typeOR" then
            sql1 = sql1 & "m.GuestBookID = g.ID AND (  (GuestBookID IN ( "& checkbox &" ) AND PATINDEX('%" & item& "%',Message)>0 )) OR "
      sql2 = sql2 & "s.MessagesID = m.ID AND m.GuestBookID = g.ID AND ( ( m.GuestBookID IN(  "& checkbox &"  ) AND PATINDEX('%" & item & "%',s.svar)>0)) OR "
    elseif request("radiotype") = "typeAND" then
          sql1 = sql1 & "m.GuestBookID = g.ID AND (  (GuestBookID IN ( "& checkbox &" ) AND PATINDEX('%" & item& "%',Message)>0 )) AND "
      sql2 = sql2 &  "s.MessagesID = m.ID AND m.GuestBookID = g.ID AND ( ( m.GuestBookID IN(  "& checkbox &"  ) AND PATINDEX('%" & item & "%',s.svar)>0)) AND "
    End if
  end if

Hjælper det dig?
Avatar billede softspot Forsker
14. juli 2011 - 10:11 #18
Næh, ikke rigtig. ret mig hvis jeg tager fejl, men er det ikke korrekt at den eneste forskel på sql1 hvis det er typeOR og typeAND er om der står OR eller AND til sidst i linjen? Det samme gør sig vel gældende for sql2...?

Det jeg har gjort er bare at sammenlægge disse to betingelsesforgreninger og opbevare AND eller OR i en variabel som jeg efterstiller sql1 og sql2 med, så det burde give samme resultat.

Har du prøvet at implementere de ændringer jeg foreslog i indlæg #16?

Har du prøvet at gennemgå den endelige SQL-sætning for at se om den ser ud som den skal (den der kommer tilbage fra funktionen buildSQLAndParams)? Du kan evt. prøve at aktivere de to response.writes jeg har lavet efter kaldet til visResultat for at se den faktiske SQL-sætning og de parametre der sendes med.
Avatar billede softspot Forsker
14. juli 2011 - 10:24 #19
Jeg fandt lige en fejl i koden til generering af SQL-sætningen.

Denne linje:

      if len(sql1) > 0 then sql2 = sql2 & searchTypeKeyword

skal rettes til:

      if len(sql2) > 0 then sql2 = sql2 & searchTypeKeyword
Avatar billede totalpc Seniormester
14. juli 2011 - 12:17 #20
Jamen så ser det ud til at det virker ...sørme.
Jeg får det rigtige antal søgeresultateter og det var med den oprindelige SQL og så med din rettelse i #19

Så mangler vi bare at kunne vælge DESC eller ASC

:)

Jeg vil gerne smide flere point i puljen hvis du er interesseret?
Avatar billede softspot Forsker
14. juli 2011 - 13:02 #21
Jeg er ikke helt med på hvad du mener med "...og det var med den oprindelige SQL...", men jeg antager du gør brug af den kode jeg har illustreret for dig. Med dette udgangspunkt har jeg rettet den kode til jeg har udarbejdet tidligere, således jeg kommer frem til flg.:

<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->
<%
'Funktion til at finde ud f om en checkbox findes
function contains(str, substr)
  contains = instr("," & replace(str," ","") & ",", "," & substr & ",") > 0
end function

function GetCommand(sql, conn)
  dim cmd
  set cmd = Server.CreateObject("ADODB.Command")
  set cmd.ActiveConnection = conn
  cmd.CommandText = sql
  cmd.CommandType = adCmdText
  set GetCommand = cmd
end function

function checkboxParamString(arr)
  dim u,i,tmp
  tmp = ""
  u = ubound(arr)
  for i = 0 to u
    if len(tmp) > 0 then tmp = tmp & ","
    tmp = tmp & "?"
  next
  checkboxParamString = tmp
end function

' Tilføj data i slutningen af arrayet arr.
' Hvis appendData er et array, tilføjes alle værdier i
' appendData til arr.
sub appendParams(byref arr, appendData)
  dim lenNewArr
  dim idx, uba
 
  if isArray(appendData) then
    lenNewArr = ubound(appendData) + 1
    if lenNewArr > 0 then
      uba = ubound(arr)
      redim preserve arr(uba + lenNewArr)
      for idx = 1 to lenNewArr
        arr(uba + idx) = appendData(idx - 1)
      next
    end if
  else
    redim preserve arr(ubound(arr) + 1)
    arr(ubound(arr)) = appendData
  end if
end sub

sub buildSQLAndParams( _
      searchText, _
      checkboxChoices, _
      radioType, _
      sortOrder, _
      byref sql, _
      byref params)

  dim params1, params2
  dim word, searchWords, checkChoices
  dim searchTypeKeyword, sortOrderKeyword
  dim sql1, sql2
 
  params1 = array()
  params2 = array()
 
  checkChoices = split(checkboxChoices,",")
  searchWords = split(searchText, " ")
 
  if radiotype = "typeOR" then
    searchTypeKeyword = " OR "
  else
    searchTypeKeyword = " AND "
  end if

  for each word in searchWords

    if trim(word) <> "" then
      if len(sql1) > 0 then sql1 = sql1 & searchTypeKeyword
      sql1 = sql1 & _
              "(m.GuestBookID = g.ID " & _
              "AND ((GuestBookID IN ("& checkboxParamString(checkChoices) &") " & _
                    "AND PATINDEX('%' + ? + '%',Message)>0 )))"

      call appendParams(params1, checkChoices)
      call appendParams(params1, word)
             
      if len(sql2) > 0 then sql2 = sql2 & searchTypeKeyword
      sql2 = sql2 & _
              "(s.MessagesID = m.ID " & _
              "AND m.GuestBookID = g.ID " & _
              "AND ((m.GuestBookID IN("& checkboxParamString(checkChoices) &") " & _
                    "AND PATINDEX('%' + ? + '%',s.svar)>0)))"
                   
      call appendParams(params2, checkChoices)
      call appendParams(params2, word)
    end if

  next

  if sortOrder = "DESC" then
    sortOrderKeyword = "DESC"
  else
    sortOrderKeyword = "ASC"
  end if

 
  sql = "SELECT " & _
          "'MESSAGE' AS [Kategori], " & _
          "m.ID, " & _
          "m.ID AS [MessageID], " & _
          "m.Message AS [tekst], " & _
          "m.GuestBookID AS [MainID], " & _
          "m.Name AS [Navn], " & _
          "m.PostedTime, " & _
          "g.GuestBookName " & _
        "FROM " & _
          "[dbo].[TblMessages] m, " & _
          "[dbo].[TblGuestBooks] g " & _
        "WHERE " & _
          sql1 & " " & _
        "UNION " & _
        "SELECT " & _
          "'SVAR' AS [Kategori], " & _
          "s.svarID AS [ID], " & _
          "m.ID AS [MessageID], " & _
          "svar as [tekst], " & _
          "s.MessagesID AS [MainID], " & _
          "s.navn AS [Navn], " & _
          "s.PostedTime, " & _
          "g.GuestBookName " & _
        "FROM " & _
          "[dbo].[T_Svar] s, " & _
          "[dbo].[TblMessages] m, " & _
          "[dbo].[TblGuestBooks] g " & _
        "WHERE " & _
          "s.MessagesID = m.ID " & _
          "AND m.GuestBookID = g.ID " & _
          sql2 & " " & _
        "ORDER BY " & _
          "3, " & _
          "PostedTime " & _
          sortOrderKeyword


  params = array()
 
  call appendParams(params, params1)
  call appendParams(params, params2)
end sub
   
sub visResultat(sql, params)
  dim conn

  set conn = Server.CreateObject("ADODB.Connection")
  conn.open "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

  set cmd = GetCommand(sql, conn)
  set rs = cmd.Execute(, params)


  if rs.eof then
    response.write "<p align=center><FONT size=1 face=verdana><b>Ingen resultat af søgningen</b></font></p>"
  else
 
%>
<br>
<table width="100%">
    <tr>
        <TD>Søgeresultat herunder. Pt kun til test. Når testen er færdig skal man kunne klikke på teksten og komme til det indlægget/svaret!</td>
    </tr>
</table>
  <br>
<table width="100%">
    <tr>
        <TD width="10%">Type</td><TD width="10%">Kategori</td><TD width="45%">Tekst</td><TD width="15%">Dato</td><TD width="20%">Navn</td>
    </tr>
</table>   

<%   

  do while not rs.EOF
%>
<table width="100%">
    <tr>
<%
    if rs("kategori") = "SVAR" then
      kategori="Svar til indlæg"
    elseif rs("kategori") = "MESSAGE" then
      kategori="Indlæg"
    end if

    response.write "<td width=""10%"">" & Kategori &"</TD>"
    response.write "<td width=""10%"">" & rs("guestbookname") &"</TD>"
    response.write "<td width=""45%"">" & rs("tekst") &"</a></TD>"
    'response.write "<td width=""45%""><a href=""#"" >" & Replace(Left(rs("tekst"),80), "<br>", " ") &"</a></TD>"
    response.write "<td width=""15%"">" & FormatDateTime(rs("PostedTime"), vbShortDate) &"</TD>"
    response.write "<td width=""20%"">" & rs("navn") &"</TD>"
    response.write "<HR>"

    rs.MoveNext
  loop
%>
</TR>
</table>
<%
  end if

  RS.Close
  Set RS = Nothing
  conn.close
  set conn = nothing
end sub

dim params
dim sql
dim search
dim checkbox
dim radiotype
dim sortorder

checkbox = Request("checkbox") & ""
radiotype = Request("radiotype") & ""
search = request("search") & ""
sortorder = request("sortorder") & ""
%>

<table>
    <tr>
        <td>
            Indtast et eller flere søgeord adskilt af mellemrum. Husk at vælge om du vil søge efter et eller alle ord.
        </td>
    <tr>
</table>
<table border="0" width="400" cellpadding="0" style="border-collapse: collapse">
  <tr>
    <td class="broed">
      <form method="POST" action="?page=search" style="padding: 0; float:left; height: 0; text-align:left">
        <input value="<%=request.form("search")%>" type="text" name="search" size="18"><br>
        <input type="radio" name="radiotype" value="typeOR"  <% if (radiotype="typeOR" AND request.form("search") = "") OR (radiotype="" AND request.form("search") = "") OR radiotype="typeOR" then %> checked  <% else %><% end if %>> søg efter et af ordene <br>
        <input type="radio" name="radiotype" value="typeAND" <% if (radiotype="typeAND" AND request.form("search") = "") OR (radiotype="typeAND") then %> checked  <% else %><% end if %>>  resultatet skal indeholde samtlige ord <br>

        <input type="radio" name="sortorder" value="ASC"  <% if sortorder="ASC" OR sortorder="" then %> checked<% end if %>> sorter resultat i stigende orden<br>
        <input type="radio" name="sortorder" value="DESC" <% if sortorder="DESC" then %> checked<% end if %>> sorter resultat i faldende orden<br>


        <br>Vælg kategorier der skal søges i:<br>
        <input type="checkbox" name="checkbox" value="3"  <% if contains(checkbox,"3")  or request.form("search") ="" then %> checked<% end if %>>  Jeg  <br>
        <input type="checkbox" name="checkbox" value="4"  <% if contains(checkbox,"4")  or request.form("search") ="" then %> checked<% end if %>>  Jeg <br>
        <input type="checkbox" name="checkbox" value="5"  <% if contains(checkbox,"5")  or request.form("search") ="" then %> checked<% end if %>>  Jeg  <br>
        <input type="checkbox" name="checkbox" value="8"  <% if contains(checkbox,"8")  or request.form("search") ="" then %> checked<% end if %>>  len <br>
        <input type="checkbox" name="checkbox" value="21" <% if contains(checkbox,"21") or request.form("search") ="" then %> checked<% end if %>>  åde <br>
        <input type="checkbox" name="checkbox" value="22" <% if contains(checkbox,"22") or request.form("search") ="" then %> checked<% end if %>>  ronik <br>
        <input type="checkbox" name="checkbox" value="23" <% if contains(checkbox,"23") or request.form("search") ="" then %> checked<% end if %>>  rer <br>
        <input type="checkbox" name="checkbox" value="24" <% if contains(checkbox,"24") or request.form("search") ="" then %> checked<% end if %>>  ng <br>
        <input type="checkbox" name="checkbox" value="26" <% if contains(checkbox,"26") or request.form("search") ="" then %> checked<% end if %>>  g  <br>
        <input type="checkbox" name="checkbox" value="27" <% if contains(checkbox,"27") or request.form("search") ="" then %> checked<% end if %>>  ere <br>
        <input type="checkbox" name="checkbox" value="28" <% if contains(checkbox,"28") or request.form("search") ="" then %> checked<% end if %>>  et <br>
        <input type="checkbox" name="checkbox" value="29" <% if contains(checkbox,"29") or request.form("search") ="" then %> checked<% end if %>>  søges <br>
        <input type="checkbox" name="checkbox" value="30" <% if contains(checkbox,"30") or request.form("search") ="" then %> checked<% end if %>>  olm  <br>
        <input type="checkbox" name="checkbox" value="31" <% if contains(checkbox,"31") or request.form("search") ="" then %> checked<% end if %>>  lyst <br><br>
        <input name="send" align="top" type="submit" vale="Søg">
      </form>
    </td>
  </tr>
</table>
<%
if checkbox = "" and search <> "" then
  response.write "<p align=center><FONT size=1 face=verdana color=red><b>Der skal søges i mindst en kategori</b></font></p>"
else

  if request.form("search") <> "" then
    call buildSQLAndParams(search, checkbox, radiotype, sortorder, sql, params)
   
    call visResultat(sql, params)
    'response.Write "SQL: <br>" & replace(sql, vbCrLf, "<br>")
    'response.Write "Parametre: <br>" & join(params, ", ")
  end if
end if
%>

Jeg har, efter bedste evne, fremhævet de linjer jeg har ændret eller tilføjet i koden...
Avatar billede totalpc Seniormester
14. juli 2011 - 13:46 #22
#10 + #19 virker
Det var det jeg mente.
Jeg har ikke brugt #10 og #14
:)
Jeg prøver lige den sidste du har postet
Avatar billede totalpc Seniormester
14. juli 2011 - 13:50 #23
Den sidste du har posted giver mig:


SELECT 'MESSAGE' AS [Kategori], m.ID, m.ID AS [MessageID], m.Message AS [tekst], m.GuestBookID AS [MainID], m.Name AS [Navn], m.PostedTime, g.GuestBookName FROM [dbo].[TblMessages] m, [dbo].[TblGuestBooks] g WHERE (m.GuestBookID = g.ID AND ((GuestBookID IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?) AND PATINDEX('%' + ? + '%',Message)>0 ))) OR (m.GuestBookID = g.ID AND ((GuestBookID IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?) AND PATINDEX('%' + ? + '%',Message)>0 ))) UNION SELECT 'SVAR' AS [Kategori], s.svarID AS [ID], m.ID AS [MessageID], svar as [tekst], s.MessagesID AS [MainID], s.navn AS [Navn], s.PostedTime, g.GuestBookName FROM [dbo].[T_Svar] s, [dbo].[TblMessages] m, [dbo].[TblGuestBooks] g WHERE s.MessagesID = m.ID AND m.GuestBookID = g.ID (s.MessagesID = m.ID AND m.GuestBookID = g.ID AND ((m.GuestBookID IN(?,?,?,?,?,?,?,?,?,?,?,?,?,?) AND PATINDEX('%' + ? + '%',s.svar)>0))) OR (s.MessagesID = m.ID AND m.GuestBookID = g.ID AND ((m.GuestBookID IN(?,?,?,?,?,?,?,?,?,?,?,?,?,?) AND PATINDEX('%' + ? + '%',s.svar)>0))) ORDER BY 3, PostedTime DESC
Microsoft SQL Server Native Client 10.0 error '80040e14'

Incorrect syntax near '='.

/sql/test/test-softspot.asp, line 156
Avatar billede totalpc Seniormester
14. juli 2011 - 15:44 #24
Se nu har jeg smækket lidt af det der virkede sammen med det sidste du lavede og nu virker det næsten. Der kommer de rigtige søgeresultater, men uanset hvad jeg vælger kommer der til at stå ASC og aldrig DESC. Måske du kan gennemskue det?

<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->
<%Response.Buffer = False%>
<%
'Funktion til at finde ud f om en checkbox findes
function contains(str, substr)
  contains = instr("," & replace(str," ","") & ",", "," & substr & ",") > 0
end function

function GetCommand(sql, conn)
  dim cmd
  set cmd = Server.CreateObject("ADODB.Command")
  set cmd.ActiveConnection = conn
  cmd.CommandText = sql
  cmd.CommandType = adCmdText
  set GetCommand = cmd
end function


function checkboxParamString(arr)
  dim u,i,tmp
  tmp = ""
  u = ubound(arr)
  for i = 0 to u
    if len(tmp) > 0 then tmp = tmp & ","
    tmp = tmp & "?"
  next
  checkboxParamString = tmp
end function

' Tilføj data i slutningen af arrayet arr.
' Hvis appendData er et array, tilføjes alle værdier i
' appendData til arr.
sub appendParams(byref arr, appendData)
  dim lenNewArr
  dim idx, uba
 
  if isArray(appendData) then
    lenNewArr = ubound(appendData) + 1
    if lenNewArr > 0 then
      uba = ubound(arr)
      redim preserve arr(uba + lenNewArr)
      for idx = 1 to lenNewArr
        arr(uba + idx) = appendData(idx - 1)
      next
    end if
  else
    redim preserve arr(ubound(arr) + 1)
    arr(ubound(arr)) = appendData
  end if
end sub

sub buildSQLAndParams(searchText, checkboxChoices, radioType, sortOrder,  byref sql, byref params)
  dim params1, params2
  dim word, searchWords, checkChoices, searchTypeKeyword, sortorderKeyword
  dim sql1, sql2
 
  params1 = array()
  params2 = array()
 
  checkChoices = split(checkboxChoices,",")
  searchWords = split(searchText, " ")
 
  if radiotype = "typeOR" then
    searchTypeKeyword = " OR "
  else
    searchTypeKeyword = " AND "
  end if

  for each word in searchWords

    if trim(word) <> "" then
      if len(sql1) > 0 then sql1 = sql1 & searchTypeKeyword
      sql1 = sql1 & _
              "m.GuestBookID = g.ID " & _
              "AND ((GuestBookID IN ("& checkboxParamString(checkChoices) &") " & _
                    "AND PATINDEX('%' + ? + '%',Message)>0 ))"

      call appendParams(params1, checkChoices)
      call appendParams(params1, word)
             
      if len(sql2) > 0 then sql2 = sql2 & searchTypeKeyword
      sql2 = sql2 & _
              "s.MessagesID = m.ID " & _
              "AND m.GuestBookID = g.ID " & _
              "AND ((m.GuestBookID IN("& checkboxParamString(checkChoices) &") " & _
                    "AND PATINDEX('%' + ? + '%',s.svar)>0))"
                   
      call appendParams(params2, checkChoices)
      call appendParams(params2, word)
    end if

  next
    if sortOrder = "DESC" then
    sortOrderKeyword = "DESC"
  else
    sortOrderKeyword = "ASC"
  end if


    sql = "SELECT " & _
          "'MESSAGE' AS [Kategori], " & _
          "m.ID, m.ID AS [MessageID], " & _
          "m.Message AS [tekst], " & _
          "m.GuestBookID AS [MainID], " & _
          "m.Name AS [Navn], " & _
          "m.PostedTime, " & _
          "g.GuestBookName " & _
        "FROM " & _
          "[dbo].[TblMessages] m, " & _
          "[dbo].[TblGuestBooks] g " & _
        "WHERE " & _
          sql1 & " " & _
        "UNION " & _
        "SELECT " & _
          "'SVAR' AS [Kategori], " & _
          "s.svarID AS [ID], " & _
          "m.ID AS [MessageID], " & _
          "svar as [tekst], " & _
          "s.MessagesID AS [MainID], " & _
          "s.navn AS [Navn], " & _
          "s.PostedTime, " & _
          "g.GuestBookName " & _
        "FROM " & _
          "[dbo].[T_Svar] s, " & _
          "[dbo].[TblMessages] m, " & _
          "[dbo].[TblGuestBooks] g " & _
        "WHERE " & _
          "s.MessagesID = m.ID " & _
          "AND m.GuestBookID = g.ID " & _
          "AND " & _
          sql2 & " " & _
        "ORDER BY " & _
          "3, " & _
          "PostedTime " & _
          sortOrderKeyword



  params = array()
 
  call appendParams(params, params1)
  call appendParams(params, params2)
end sub
   
sub visResultat(sql, params)
  dim conn

  set conn = Server.CreateObject("ADODB.Connection")
  conn.open "xxxxxxxxx"
 
  set cmd = GetCommand(sql, conn)
  response.write sql
  set rs = cmd.Execute(, params)


  if rs.eof then
    response.write "<p align=center><FONT size=1 face=verdana><b>Ingen resultat af søgningen</b></font></p>"
  else
 
%>
<br>
<table width="100%">
    <tr>
        <TD>Søgeresultat herunder. Pt kun til test. Når testen er færdig skal man kunne klikke på teksten og komme til det indlægget/svaret!</td>
    </tr>
</table>
  <br>
<table width="100%">
    <tr>
        <TD width="10%">Type</td><TD width="10%">Kategori</td><TD width="45%">Tekst</td><TD width="15%">Dato</td><TD width="20%">Navn</td>
    </tr>
</table>   

<%   

  do while not rs.EOF
%>
<table width="100%">
    <tr>
<%
    if rs("kategori") = "SVAR" then
      kategori="Svar til indlæg"
    elseif rs("kategori") = "MESSAGE" then
      kategori="Indlæg"
    end if

    response.write "<td width=""10%"">" & Kategori &"</TD>"
    response.write "<td width=""10%"">" & rs("guestbookname") &"</TD>"
    response.write "<td width=""45%"">" & rs("tekst") &"</a></TD>"
    'response.write "<td width=""45%""><a href=""#"" >" & Replace(Left(rs("tekst"),80), "<br>", " ") &"</a></TD>"
    response.write "<td width=""15%"">" & FormatDateTime(rs("PostedTime"), vbShortDate) &"</TD>"
    response.write "<td width=""20%"">" & rs("navn") &"</TD>"
    response.write "<HR>"

    rs.MoveNext
  loop
%>
</TR>
</table>
<%
  end if

  RS.Close
  Set RS = Nothing
  conn.close
  set conn = nothing
end sub

dim params
dim sql
dim search
dim checkbox
dim radiotype

checkbox = Request("checkbox") & ""
radiotype = Request("radiotype") & ""
search = request("search") & ""

%>

<table>
    <tr>
        <td>
            Indtast et eller flere søgeord adskilt af mellemrum. Husk at vælge om du vil søge efter et eller alle ord.
        </td>
    <tr>
</table>
<table border="0" width="400" cellpadding="0" style="border-collapse: collapse">
  <tr>
    <td class="broed">
      <form method="POST" action="?page=search" style="padding: 0; float:left; height: 0; text-align:left">
        <input value="<%=request.form("search")%>" type="text" name="search" size="18"><br>
        <input type="radio" name="radiotype" value="typeOR"  <% if (radiotype="typeOR" AND request.form("search") = "") OR (radiotype="" AND request.form("search") = "") OR radiotype="typeOR" then %> checked  <% else %><% end if %>> søg efter et af ordene <br>
        <input type="radio" name="radiotype" value="typeAND" <% if (radiotype="typeAND" AND request.form("search") = "") OR (radiotype="typeAND") then %> checked  <% else %><% end if %>>  resultatet skal indeholde samtlige ord <br>
        <input type="radio" name="sortorder" value="ASC"  <% if sortorder="ASC" OR sortorder="" then %> checked<% end if %>> sorter resultat i stigende orden<br>
        <input type="radio" name="sortorder" value="DESC" <% if sortorder="DESC" then %> checked<% end if %>> sorter resultat i faldende orden<br>
        <br>Vælg kategorier der skal søges i:<br>
        <input type="checkbox" name="checkbox" value="3"  <% if contains(checkbox,"3")  or request.form("search") ="" then %> checked<% end if %>>  Jeg  <br>
        <input type="checkbox" name="checkbox" value="4"  <% if contains(checkbox,"4")  or request.form("search") ="" then %> checked<% end if %>>  Jeg <br>
        <input type="checkbox" name="checkbox" value="5"  <% if contains(checkbox,"5")  or request.form("search") ="" then %> checked<% end if %>>  Jeg  <br>
        <input type="checkbox" name="checkbox" value="8"  <% if contains(checkbox,"8")  or request.form("search") ="" then %> checked<% end if %>>  len <br>
        <input type="checkbox" name="checkbox" value="21" <% if contains(checkbox,"21") or request.form("search") ="" then %> checked<% end if %>>  åde <br>
        <input type="checkbox" name="checkbox" value="22" <% if contains(checkbox,"22") or request.form("search") ="" then %> checked<% end if %>>  ronik <br>
        <input type="checkbox" name="checkbox" value="23" <% if contains(checkbox,"23") or request.form("search") ="" then %> checked<% end if %>>  rer <br>
        <input type="checkbox" name="checkbox" value="24" <% if contains(checkbox,"24") or request.form("search") ="" then %> checked<% end if %>>  ng <br>
        <input type="checkbox" name="checkbox" value="26" <% if contains(checkbox,"26") or request.form("search") ="" then %> checked<% end if %>>  g  <br>
        <input type="checkbox" name="checkbox" value="27" <% if contains(checkbox,"27") or request.form("search") ="" then %> checked<% end if %>>  ere <br>
        <input type="checkbox" name="checkbox" value="28" <% if contains(checkbox,"28") or request.form("search") ="" then %> checked<% end if %>>  et <br>
        <input type="checkbox" name="checkbox" value="29" <% if contains(checkbox,"29") or request.form("search") ="" then %> checked<% end if %>>  søges <br>
        <input type="checkbox" name="checkbox" value="30" <% if contains(checkbox,"30") or request.form("search") ="" then %> checked<% end if %>>  olm  <br>
        <input type="checkbox" name="checkbox" value="31" <% if contains(checkbox,"31") or request.form("search") ="" then %> checked<% end if %>>  lyst <br><br>
        <input name="send" align="top" type="submit" vale="Søg">
      </form>
    </td>
  </tr>
</table>
<%
if checkbox = "" and search <> "" then
  response.write "<p align=center><FONT size=1 face=verdana color=red><b>Der skal søges i mindst en kategori</b></font></p>"
else

  if request.form("search") <> "" then
    call buildSQLAndParams(search, checkbox, radiotype, sortOrder, sql, params)
   
    call visResultat(sql, params)
    'response.Write "SQL: <br>" & replace(sql, vbCrLf, "<br>")
    'response.Write "Parametre: <br>" & join(params, ", ")
  end if
end if
%>
Avatar billede totalpc Seniormester
15. juli 2011 - 10:43 #25
<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->
<%Response.Buffer = False%>
<%
'Funktion til at finde ud f om en checkbox findes
function contains(str, substr)
  contains = instr("," & replace(str," ","") & ",", "," & substr & ",") > 0
end function

function GetCommand(sql, conn)
  dim cmd
  set cmd = Server.CreateObject("ADODB.Command")
  set cmd.ActiveConnection = conn
  cmd.CommandText = sql
  cmd.CommandType = adCmdText
  set GetCommand = cmd
end function


function checkboxParamString(arr)
  dim u,i,tmp
  tmp = ""
  u = ubound(arr)
  for i = 0 to u
    if len(tmp) > 0 then tmp = tmp & ","
    tmp = tmp & "?"
  next
  checkboxParamString = tmp
end function

' Tilføj data i slutningen af arrayet arr.
' Hvis appendData er et array, tilføjes alle værdier i
' appendData til arr.
sub appendParams(byref arr, appendData)
  dim lenNewArr
  dim idx, uba
 
  if isArray(appendData) then
    lenNewArr = ubound(appendData) + 1
    if lenNewArr > 0 then
      uba = ubound(arr)
      redim preserve arr(uba + lenNewArr)
      for idx = 1 to lenNewArr
        arr(uba + idx) = appendData(idx - 1)
      next
    end if
  else
    redim preserve arr(ubound(arr) + 1)
    arr(ubound(arr)) = appendData
  end if
end sub

sub buildSQLAndParams(searchText, checkboxChoices, radioType, sortOrder,  byref sql, byref params)
  dim params1, params2
  dim word, searchWords, checkChoices, searchTypeKeyword, sortorderKeyword
  dim sql1, sql2
 
  params1 = array()
  params2 = array()
 
  checkChoices = split(checkboxChoices,",")
  searchWords = split(searchText, " ")
 
  if radiotype = "typeOR" then
    searchTypeKeyword = " OR "
  else
    searchTypeKeyword = " AND "
  end if

  for each word in searchWords

    if trim(word) <> "" then
      if len(sql1) > 0 then sql1 = sql1 & searchTypeKeyword
      sql1 = sql1 & _
              "m.GuestBookID = g.ID " & _
              "AND ((GuestBookID IN ("& checkboxParamString(checkChoices) &") " & _
                    "AND PATINDEX('%' + ? + '%',Message)>0 ))"

      call appendParams(params1, checkChoices)
      call appendParams(params1, word)
             
      if len(sql2) > 0 then sql2 = sql2 & searchTypeKeyword
      sql2 = sql2 & _
              "s.MessagesID = m.ID " & _
              "AND m.GuestBookID = g.ID " & _
              "AND ((m.GuestBookID IN("& checkboxParamString(checkChoices) &") " & _
                    "AND PATINDEX('%' + ? + '%',s.svar)>0))"
                   
      call appendParams(params2, checkChoices)
      call appendParams(params2, word)
    end if

  next
    if request("sortOrder") = "DESC" then
    sortOrderKeyword = "DESC"
  else
    sortOrderKeyword = "ASC"
  end if


    sql = "SELECT " & _
          "'MESSAGE' AS [Kategori], " & _
          "m.ID, m.ID AS [MessageID], " & _
          "m.Message AS [tekst], " & _
          "m.GuestBookID AS [MainID], " & _
          "m.Name AS [Navn], " & _
          "m.PostedTime, " & _
          "g.GuestBookName " & _
        "FROM " & _
          "[dbo].[TblMessages] m, " & _
          "[dbo].[TblGuestBooks] g " & _
        "WHERE " & _
          sql1 & " " & _
        "UNION " & _
        "SELECT " & _
          "'SVAR' AS [Kategori], " & _
          "s.svarID AS [ID], " & _
          "m.ID AS [MessageID], " & _
          "svar as [tekst], " & _
          "s.MessagesID AS [MainID], " & _
          "s.navn AS [Navn], " & _
          "s.PostedTime, " & _
          "g.GuestBookName " & _
        "FROM " & _
          "[dbo].[T_Svar] s, " & _
          "[dbo].[TblMessages] m, " & _
          "[dbo].[TblGuestBooks] g " & _
        "WHERE " & _
          "s.MessagesID = m.ID " & _
          "AND m.GuestBookID = g.ID " & _
          "AND " & _
          sql2 & " " & _
        "ORDER BY " & _
          "3, " & _
          "PostedTime " & _
          sortOrderKeyword



  params = array()
 
  call appendParams(params, params1)
  call appendParams(params, params2)
end sub
   
sub visResultat(sql, params)
  dim conn

  set conn = Server.CreateObject("ADODB.Connection")
  conn.open ""
 
  set cmd = GetCommand(sql, conn)
  response.write sql
  set rs = cmd.Execute(, params)


  if rs.eof then
    response.write "<p align=center><FONT size=1 face=verdana><b>Ingen resultat af søgningen</b></font></p>"
  else
 
%>
<br>
<table width="100%">
    <tr>
        <TD>Søgeresultat herunder. Pt kun til test. Når testen er færdig skal man kunne klikke på teksten og komme til det indlægget/svaret!</td>
    </tr>
</table>
  <br>
<table width="100%">
    <tr>
        <TD width="10%">Type</td><TD width="10%">Kategori</td><TD width="45%">Tekst</td><TD width="15%">Dato</td><TD width="20%">Navn</td>
    </tr>
</table>   

<%   

  do while not rs.EOF
%>
<table width="100%">
    <tr>
<%
    if rs("kategori") = "SVAR" then
      kategori="Svar til indlæg"
    elseif rs("kategori") = "MESSAGE" then
      kategori="Indlæg"
    end if

    response.write "<td width=""10%"">" & Kategori &"</TD>"
    response.write "<td width=""10%"">" & rs("guestbookname") &"</TD>"
    response.write "<td width=""45%"">" & rs("tekst") &"</a></TD>"
    'response.write "<td width=""45%""><a href=""#"" >" & Replace(Left(rs("tekst"),80), "<br>", " ") &"</a></TD>"
    response.write "<td width=""15%"">" & FormatDateTime(rs("PostedTime"), vbShortDate) &"</TD>"
    response.write "<td width=""20%"">" & rs("navn") &"</TD>"
    response.write "<HR>"

    rs.MoveNext
  loop
%>
</TR>
</table>
<%
  end if

  RS.Close
  Set RS = Nothing
  conn.close
  set conn = nothing
end sub

dim params
dim sql
dim search
dim checkbox
dim radiotype

checkbox = Request("checkbox") & ""
radiotype = Request("radiotype") & ""
search = request("search") & ""

%>

<table>
    <tr>
        <td>
            Indtast et eller flere søgeord adskilt af mellemrum. Husk at vælge om du vil søge efter et eller alle ord.
        </td>
    <tr>
</table>
<table border="0" width="400" cellpadding="0" style="border-collapse: collapse">
  <tr>
    <td class="broed">
      <form method="POST" action="?page=search" style="padding: 0; float:left; height: 0; text-align:left">
        <input value="<%=request.form("search")%>" type="text" name="search" size="18"><br>
        <input type="radio" name="radiotype" value="typeOR"  <% if (radiotype="typeOR" AND request.form("search") = "") OR (radiotype="" AND request.form("search") = "") OR radiotype="typeOR" then %> checked  <% else %><% end if %>> søg efter et af ordene <br>
        <input type="radio" name="radiotype" value="typeAND" <% if (radiotype="typeAND" AND request.form("search") = "") OR (radiotype="typeAND") then %> checked  <% else %><% end if %>>  resultatet skal indeholde samtlige ord <br>
        <input type="radio" name="sortorder" value="ASC"  <% if sortorder="ASC" OR sortorder="" then %> checked<% end if %>> sorter resultat i stigende orden<br>
        <input type="radio" name="sortorder" value="DESC" <% if sortorder="DESC" then %> checked<% end if %>> sorter resultat i faldende orden<br>
        <br>Vælg kategorier der skal søges i:<br>
        <input type="checkbox" name="checkbox" value="3"  <% if contains(checkbox,"3")  or request.form("search") ="" then %> checked<% end if %>>  Jeg  <br>
        <input type="checkbox" name="checkbox" value="4"  <% if contains(checkbox,"4")  or request.form("search") ="" then %> checked<% end if %>>  Jeg <br>
        <input type="checkbox" name="checkbox" value="5"  <% if contains(checkbox,"5")  or request.form("search") ="" then %> checked<% end if %>>  Jeg  <br>
        <input type="checkbox" name="checkbox" value="8"  <% if contains(checkbox,"8")  or request.form("search") ="" then %> checked<% end if %>>  len <br>
        <input type="checkbox" name="checkbox" value="21" <% if contains(checkbox,"21") or request.form("search") ="" then %> checked<% end if %>>  åde <br>
        <input type="checkbox" name="checkbox" value="22" <% if contains(checkbox,"22") or request.form("search") ="" then %> checked<% end if %>>  ronik <br>
        <input type="checkbox" name="checkbox" value="23" <% if contains(checkbox,"23") or request.form("search") ="" then %> checked<% end if %>>  rer <br>
        <input type="checkbox" name="checkbox" value="24" <% if contains(checkbox,"24") or request.form("search") ="" then %> checked<% end if %>>  ng <br>
        <input type="checkbox" name="checkbox" value="26" <% if contains(checkbox,"26") or request.form("search") ="" then %> checked<% end if %>>  g  <br>
        <input type="checkbox" name="checkbox" value="27" <% if contains(checkbox,"27") or request.form("search") ="" then %> checked<% end if %>>  ere <br>
        <input type="checkbox" name="checkbox" value="28" <% if contains(checkbox,"28") or request.form("search") ="" then %> checked<% end if %>>  et <br>
        <input type="checkbox" name="checkbox" value="29" <% if contains(checkbox,"29") or request.form("search") ="" then %> checked<% end if %>>  søges <br>
        <input type="checkbox" name="checkbox" value="30" <% if contains(checkbox,"30") or request.form("search") ="" then %> checked<% end if %>>  olm  <br>
        <input type="checkbox" name="checkbox" value="31" <% if contains(checkbox,"31") or request.form("search") ="" then %> checked<% end if %>>  lyst <br><br>
        <input name="send" align="top" type="submit" vale="Søg">
      </form>
    </td>
  </tr>
</table>
<%
if checkbox = "" and search <> "" then
  response.write "<p align=center><FONT size=1 face=verdana color=red><b>Der skal søges i mindst en kategori</b></font></p>"
else

  if request.form("search") <> "" then
    call buildSQLAndParams(search, checkbox, radiotype, sortOrder, sql, params)
   
    call visResultat(sql, params)
    'response.Write "SQL: <br>" & replace(sql, vbCrLf, "<br>")
    'response.Write "Parametre: <br>" & join(params, ", ")
  end if
end if
%>


Jeg rettede
if sortOrder = "DESC" then

til

if request("sortOrder") = "DESC" then

Så virker det.
Ser det hele fornuftigt ud, synes du?
Avatar billede softspot Forsker
25. juli 2011 - 17:26 #26
Nej, jeg ville da beholde den version af if-sætningen som tjekker på sortOrder-variablen, da den sendes med ind som parametere til funktionen - det betyder én mindre afhængighed af "omverdenen", hvilket er en god ting :-)

Jeg forstår heller ikke helt din komplicerede betingelse for at bestemme om OR-inputfeltet skal være checked eller ej. Jeg ville blot gøre således:

        <input type="radio" name="radiotype" value="typeOR"  <% if radiotype="typeOR" OR radiotype="" then %> checked<% end if %>> søg efter et af ordene <br>

Dvs. tjekke om radiotype er typeOR eller tom, hvilket sørger for at vælge OR-søgningen som standard og hvis den er valgt i forvejen.
Avatar billede totalpc Seniormester
09. september 2011 - 11:38 #27
Puha...gik helt kold i det her, men du mangler at smide et svar SoftSpot..

En anden ting, er at nu har jeg den udfordring at der gerne skulle kunne skrives et indlægs eller svar ID ind i søgefeltet og så hopper den direkte til det i stedet for at søge i teksten. Det kan jeg simpelthen ikke wrappe mit hoved om... :)
Avatar billede softspot Forsker
09. september 2011 - 12:07 #28
Du kan da lige starte med at få et svar... :-)

Jeg har pt. ikke lige tid til at kigge på en konkret løsning, men kan du ikke starte med at tjekke på, om indholdet af søgefeltet er numerisk (med isnumeric) og så springe direkte til resultatet, hvis det er?

Umiddelbart burde du kunne udskifte hele where-delen af din SQL med et tjek på om det indtastede id er lig med messageid eller id. Faktisk bør du vel foretage dette kald først og i det tilfælde det ikke giver noget resultat, så skal du foretage den store søgning efterfølgende...
Avatar billede totalpc Seniormester
09. september 2011 - 12:14 #29
Jo tak for input..det vil jeg arbejde videre med.
Jeg vil gerne takke dig rigtig mange gange for hjælpen. Du har brugt meget tid på min udfordring. Tak for tålmodigheden :)
God weekend
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