12. juli 2011 - 20:45Der 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>"
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.)...?
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 ))"
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
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 :)
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! :-)
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
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
<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 %>
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 :)
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... :-)
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'
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)...
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.
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.
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
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.
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?
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
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
<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...
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'
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
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
<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 %>
<!-- 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
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
<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?
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.
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... :)
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...
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
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.