Jag hittade ett litet fint script, för en söktjänst på mitt forum. Koden är inte komplett - kan du klippa ut en ny version och redigera ditt inlägg ovan? Jag har upptäckt mera buggar, så jag tar chansen att lägga in det mesta av scriptet här: >har du exempelvis VB6 - kasta in koden där så kan du debugga online och se vad som händer, vad parametrarna står osv, det besparar oftast en massa tid. Jag har kommit på felet, men hur lösa det, det vet jag inte. Om du bara vill hitta fristående ord får du väl istället Tack AC ett steg närmare.Lustig bug i sökmotor
Problemet är, skriver jag tex boll då markeras boll i fotboll. Skriver jag Fotboll så markeras en bart F i Fotbollsmålvakt.
Jag har letat så att ögonen går i tvärs, men jag hittar inte var felet är.
Detta är det avsnitt som markera (gör söktexten fet)sökordet.
[REDIGERAT]
Pelle tyckte att det fattades i koden, så jag tar och lägger till lite mera
<code>
'jag visar inte hur den bygger upp SQL:en, tar onödig plats.
rs.open sql,Connect,3,3
if not rs.eof then
response.write "<br>Din sökning på <FONT COLOR=red><B>'" &word& "'</FONT></B> gav " & rs.recordcount & " träffar.<P>"
do while not rs.eof
pageBody = rs("inlagg")
' pass the field value to a local variable
if andW then
'this is from above when we checked for a Boolean value of AND
for i = 0 to ubound(andWord)
'go through the search word array
pos = instr(pageBody,andWord(i))
'find the position of the word in the field.
strW = trim(left(andWord(i),pos))
' now pass the word found to local variable.
newStr = "<strong>" & strW & "</strong>"
' and highlight the found word with bold html tags.
pageBody = replace(pageBody, strW, newStr)
' now put back the word into pageBody variable.
'If we didn’t pass the rs(“pageBody”) first it would overwrite
'the variable every time it goes through the loop.
Next
'Now just set up two more for loops for “OR” and for BLANKS
'The last one will be no Boolean values or blanks.
else
pos = instr(pageBody, word)
strW = trim(left(word, pos))
newStr = "<strong>" & strW & "</strong>"
pageBody = replace(pageBody, strW, newStr)
end if
'Now write out the results from the query with the highlighted
'words in there.
response.write pageBody & "<hr><br>"
</code>
Jag visar här en förkottad vertion av presentationen, jag lägger den annars via en tabell osv.Sv: Lustig bug i sökmotor
Sen skall du få ett bra tips - har du exempelvis VB6 - kasta in koden där så kan du debugga online och se vad som händer, vad parametrarna står osv, det besparar oftast en massa tid.Sv: Lustig bug i sökmotor
Formuläret:
<code>
<TD vAlign=top>
<Form method="post" action="template.asp">
Sök på IdrottsPortalens Forum!
Använd <B>and, or</B> eller <B>mellanslag</B> för att söka på flera ord.<P>
<Input type="text" value="" name="keyword" size="30">
<input type="Submit" value="Sök i Forumet"><br>
<Input type="hidden" value="yes" name="srch">
</form>
</code>
Tar imott formulärdata och bygger upp SQL:en
<code>
if LEN(request("keyword"))>=3 then
if request("srch") = "yes" then
dim count, nWord, spWord, andWord, orWord
' set up variables
word=replace(trim(request("keyword")),"'", "''")
' trim spaces and replace the single quote
if instr(word, "and") then
' check Boolean of and
andW = true
Word = split(word,"and")
'now get all the words separated by and into an array
for i = 0 to ubound(andWord)
if i <> ubound(andWord) then
kW = "'%" & andWord(i) & "%'"
'set up sql statement
elseif i = ubound(andWord) then
' when it hits the end
kW = kW &"'%" & andWord(i) & "%' and "
' add the last sql statement
end if
next
elseif instr(word,"or") then
orW = true
orWord = split(word,"or")
for i = 0 to ubound(orWord)
if i <> ubound(orWord) then
kW = "'%" & orWord(i) & "%' and "
elseif i = ubound(orWord) then
kW = kW & "'%" & orWord(i) & "%'"
end if
next
elseif instr(word," ") then
spW = true
spWord = split(word," ")
for i = 0 to ubound(spWord)
if i <> ubound(spWord) then
kW = "'%" & spWord(i) & "%' or "
elseif i = ubound(spWord) then
kW = kW & "'%" & spWord(i) & "%'"
end if
next
else
'There is no Boolean value or Blank in the search word<br>
kW = "'%" & word & "%'"
end if
set conn = server.createobject("adodb.connection")
set rs = server.createobject("adodb.recordset")
sql = "select * from t_forum where rubrik like " & kW & " or inlagg like " & kW
'with rs
rs.open sql,Connect,3,3
if not rs.eof then
response.write "<br>Din sökning på <FONT COLOR=red><B>'" &word& "'</FONT></B> gav " & rs.recordcount & " träffar.<P>"
</code>
Loppar resultatet:
<code>
do while not rs.eof
pageBody = rs("inlagg")
' pass the field value to a local variable
if andW then
'this is from above when we checked for a Boolean value of AND
for i = 0 to ubound(andWord)
'go through the search word array
pos = instr(pageBody,andWord(i))
'find the position of the word in the field.
strW = trim(left(andWord(i),pos))
' now pass the word found to local variable.
newStr = "<strong>" & strW & "</strong>"
' and highlight the found word with bold html tags.
pageBody = replace(pageBody, strW, newStr)'*************************
' now put back the word into pageBody variable.
'If we didn’t pass the rs(“pageBody”) first it would overwrite
'the variable every time it goes through the loop.
Next
'Now just set up two more for loops for “OR” and for BLANKS
'The last one will be no Boolean values or blanks.
else
pos = instr(pageBody, word)
strW = trim(left(word, pos))
newStr = "<strong>" & strW & "</strong>"
pageBody = replace(pageBody, strW, newStr)
end if
'Now write out the results from the query with the highlighted
'words in there.
response.write pageBody & "<hr><br>"
rs.movenext
loop
else
response.write "<br>Inga inlägg matchade <FONT COLOR=red><B>" &word& "</FONT> </B><br>"
end if
'end with
end if
</code>
En extra funktion:
<code>
Function boldText(myString,strReplace)
Set objRegExp = New regexp
objRegExp.Global = true
objRegExp.IgnoreCase = true
objRegExp.Pattern = TRIM(strReplace)
replacestring = objRegExp.Replace(myString, "<B>" & strReplace & "</B>")
boldText = replacestring
End Function
</code>
Vad som är galet är.
1 Om jag använder mig av operatorn AND så får jag ett error:
<code>
Körningsfel i Microsoft VBScript (0x800A000D)
Inkompatibla typer: 'ubound'
</code>
Detta får jag inte vid operatorn OR (jag kan inte se skillnaden)
Söker jag på fotboll så hittar den inte fotbollsmålvakt, men söker jag på boll så hittar den fotbollsmålvakt.
Skriver jag boll så markeras boll med fel still i fotbollsmålvakt, söker jag på Fotboll så markeras bara F:et, inte resten.
Enligt beskrivning, så skall man kunna skriva in en mening med mellanslag imellan orden, gör jag det så visas allt i databasen...
Jag kan nog hålla på mera, tyckte först att det var ett fint script, men...
Det kanske vore lika bra att fråga efter ett bra ASp-script???Sv: Lustig bug i sökmotor
Man ska kunna debugga asp i interdev eller i vs.net också. :)Sv: Lustig bug i sökmotor
<code>
if instr(word, "and") then
</code>
Söker jag nu på hand AND boll så blir resultatet:
'%h%' and '% AND boll%' dvs den hittar and i handboll, och det är ju inte meningen.
Hur löser jag detta?Sv: Lustig bug i sökmotor
för att söka på "boll" söka på " boll ".
AndrecSv: Lustig bug i sökmotor
Nu lyckades det dvs jag kan söka på 'boll and spel' och den skriver ut ordentligt.
Men om jag lägger till ett ord till, t ex 'boll and spel and kul' då får jag bara med
'%spel%' and '%kul%'
Så här ser den funktionen ut:
<code>
word=replace(trim(request("keyword")),"'", "''")
kW = "'%" & word & "%'"
if instr(word, " and ") then
andW = true
andWord = split(word," and ")
for i = 0 to ubound(andWord)
if i <> ubound(andWord) then
kW = "'%" & andWord(i) & "%' and "
elseif i = ubound(andWord) then
kW = kW &"'%" & andWord(i) & "%'"
end if
next
end if
</code>
JAg har försökt med att replaca " and " och istället splitta på " " men med samma resultat.
Några ideer?