webForumDet fria alternativet

Problem med sökmotor

ASPur ASP

14 svar · 597 visningar · startad av saw

sawMedlem sedan mars 20011 880 inlägg
#1

Jag har hittat ett litet fint script för en sökmotor, men det finns en del buggar som jag gärna skulle vilja ha hjälp med.

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

Problem:
Om jag försöker att använda mig av and då kommer detta medellande:

Körningsfel i Microsoft VBScript (0x800A000D)
Inkompatibla typer: 'ubound'
/Hemsidor/Idrottsportalen/Idrottsportalen_filer/Forum/template.asp, line 52

rad 53 är for i = 0 to ubound(andWord)

Man skall också kunna skriva text rakt in t ex "fotboll är kul", men då blir det ett annat fel, den visar allt som finns i databasen.
Några tips?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#2

Första frågan löses så här:

    andWord = split(word,"and")

istället för

    Word = split(word,"and")
@ndersMedlem sedan juni 200032 969 inlägg
#3

Angående den andra frågan:

Det man gör när SQL-frågor returnerar fel saker är att skriva ut den färdiga SQL-frågan. Det är helt omöjligt att gissa vad som är fel.

sawMedlem sedan mars 20011 880 inlägg
#4

Jag hitta ett fel ...

andWord = split(word,"and")
for i = 0 to ubound(andWord)

...men då uppstod nästa fel.

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][Drivrutin för ODBC Microsoft Access] Syntaxfel 
(operator saknas) i frågeuttrycket 'rubrik like '%boll %''% rund%' 
and or inlagg like '%boll %''% rund%' and'.

/Hemsidor/Idrottsportalen/Idrottsportalen_filer/Forum/template.asp, line 97

'SQLEN
 sql = "select * from t_forum where rubrik like " & kW & " or inlagg like " & kW

Några bra tips?

@ndersMedlem sedan juni 200032 969 inlägg
#5

Visa den kompletta SQL-frågan istället. Lättare både för dig och andra att felsöka.

sawMedlem sedan mars 20011 880 inlägg
#6

Det är ju den som jag visade

sql = "select * from t_forum where rubrik like " & kW & " or inlagg like " & kW

kod byggs ju upp dynamiskt och läggs in i variablem kW

@ndersMedlem sedan juni 200032 969 inlägg
#7

Den kompletta SQL-frågan visas om du skriver ut den med Response.write...

sawMedlem sedan mars 20011 880 inlägg
#8

Ursäkta, jag missförstod.
Jag hittade lite fel i 'and'functionen så den sql:en blir

select * from t_forum where rubrik like '%boll %' and '% rund%' or inlagg like '%boll %' and '% rund%'

..och den ser ju rätt ut nu och ger rätt antal träffar.
när det gäller 'or' functionen:

select * from t_forum where rubrik like '%boll %' or '% rund%' or inlagg like '%boll %' or '% rund%'

..så ser den också rätt ut, men den tar fram allt i databasen.
När det gäller den sista, om jag söker på 'boll hand rund'

select * from t_forum where rubrik like '%boll h%' and '% rund%' or inlagg like '%boll h%' and '% rund%'

..då ser man att den hugger av andra ordet.
Frågan är väll också om det skall vara operatorn 'and', det kanske skulle byttas mot 'or'?

Om jag bara söker på ett ord 'handboll'

else
	    'There is no Boolean value or Blank in the search word<br>
	    kW = "'%" & word & "%'"
	  end if
'SQL
select * from t_forum where rubrik like '%h%' and '%boll%' or inlagg like '%h%' and '%boll%'ORDER BY rubrik

och här ser det lustigt ut.

[REDIGERAT]
Om jag använder sokördet 'fotboll and mål' visas allt i databasen
Om jag använder sokördet 'fotboll or mål' visas allt i databasen
Om jag använder sokördet 'fotboll mål' visas två poster, vilket torde vara korrekt.

Någonting lustigt gör att ifallen and/or så tas allting fram.

J.N.Medlem sedan apr. 20031 660 inlägg
#9

HEJ!

Jag ger mig inte på koden, men har du uppmärksammat vad det står i ... like '%boll h%' and '% rund%' or...?

När du söker på "boll hand rund" delas det "boll h and rund", och det vill du säkert inte. Då innebär säkert det extra and att du får med alla poster på något sätt.

I fallet "handboll", lättare se där, ger alla poster med "h och boll eller med h", dvs du får säkert inte alla, men många.

sawMedlem sedan mars 20011 880 inlägg
#10

Du har säkert rätt, men jag har kommit på felet, men vet inte hur jag skall fixa det.
Titta här:

if instr(word, "and") then

Om jag nu skriver handboll, så hittar den ju 'and' och därför
så måste ju resultatet bli '%h%' AND '% AND boll%'
osv.
Det är vad jag förstår det stora problemet.
Hur bör jag lösa det?

@ndersMedlem sedan juni 200032 969 inlägg
#11

Se till att du letar efter ordet and istället, dvs:

if instr(word, " and ") then

Edit: var hittade du förresten scriptet? Jag blir väldigt förvånad över att sånt här skräp läggs ut för andra att använda... :x

sawMedlem sedan mars 20011 880 inlägg
#12

Det gjorde ingen skillnad, tyvärr :-(

Jag minns inte var jag hittade scriptet, det var för något år sedan.
Det jag har bekymmer med är ju att bygga upp strängen, då har kanske någon url där jag kan kolla om det passar?

@ndersMedlem sedan juni 200032 969 inlägg
#13

Du måste se till att du gör spliten på " and " också, och inte bara ha det i if-satsen. Det är spliten som är det väsentliga.

sawMedlem sedan mars 20011 880 inlägg
#14

Tack för att du inte ger upp @nders.
Kodsnutten ser ut:

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

Om jag nu söker på handboll och fotboll så blir sql:en

select * from t_forum where rubrik like '%boll %' and '% fotboll%' or inlagg like '%boll %' and '% fotboll%'ORDER BY rubrik

Som du ser så klipper den av hand (ibland så finns h:et med)
Den klipper tydligen ord som innehåller 'and' bol och kul går bra.

sawMedlem sedan mars 20011 880 inlägg
#15

Hurra , jag har lyckats nu, jag utgick ifrån vad @nders påpekade, och petade lite, sen har jag fått det mesta att fungera.

Vad som inte fungerar är om man har dessa sökord:
fotboll and handboll or kulspel
Då blir SQL:en

select * from t_forum where rubrik like '%fotboll%' and '%
handboll or kulspel%' or inlagg like '%fotboll%' and '%handboll or 
kulspel%' ORDER BY rubrik DESC

...men det är kanske att begära för mycket?

137 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)