---
title: "Sökfunktion som söker i flera olika fält... Kört fast."
type: "forum-thread"
url: "https://www.webforum.nu/amne/asp/144728-sökfunktion-som-söker-i-flera-olika-fält-kört-fast"
topic: "ASP"
topic_url: "https://www.webforum.nu/amne/asp"
author: "Donatello"
published: "2006-03-29T09:06:26.000Z"
updated: "2006-03-29T12:46:29.000Z"
replies: 15
views: 770
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/asp/144728-sökfunktion-som-söker-i-flera-olika-fält-kört-fast"
---

# Sökfunktion som söker i flera olika fält... Kört fast.

## #1 — Donatello, 2006-03-29T09:06Z

Hej på er. :)

Har knåpat ihop en sökfunktion som, i mina ögon, borde fungera hur bra som helst. Guess what... Det gör den inte. x( 

Skulle någon smart människa kunna ta en titt på koden nedan och försöka klura ut varför jag får följande felmeddelande:

```
ADODB.Command error '800a0e7c' 

Parameter object is improperly defined. Inconsistent or incomplete information was provided. 

/search/process.asp, line 53
```

 

Problemet kommer på cmd.execute raden...

```
<%option explicit%>
<!-- #include virtual = "/builder.asp" -->
<%
dim Search, wri, Conn, RecSet, cmd, sqlstmt, ArrSearch, item, count, ArrParameters(), ParamCount, i, checkcount
Search = Request("search")
IF Search = empty THEN Response.Redirect "/?url=/search/default.asp"

wri = "<p><b>Sökning efter ""<i>"& Server.htmlencode(search) &"</i>"".</b></p>"

ArrSearch = Split(Search, " ", -1, 1)

count = 0
For Each item In ArrSearch
  ArrSearch(count) = Trim(ArrSearch(count))
  count = count+1
Next

sqlstmt = "SELECT * FROM annonser WHERE titel_ LIKE '%?%' OR namn_ LIKE '%?%' OR telefon_ LIKE '%?%' OR epost_ LIKE '%?%' OR innehall_ LIKE '%?%' OR hemsida_ LIKE '%?%'"
ParamCount = 6
Redim ArrParameters(ParamCount)
For i = 0 to 5
  ArrParameters(i) = ArrSearch(0)
Next
checkcount = 1

Do Until checkcount = count
  sqlstmt = "SELECT * FROM annonser WHERE titel_ LIKE '%?%' OR namn_ LIKE '%?%' OR telefon_ LIKE '%?%' OR epost_ LIKE '%?%' OR innehall_ LIKE '%?%' OR hemsida_ LIKE '%?%' AND ID IN ("& sqlstmt &")"
  ParamCount = ParamCount +6
  Redim Preserve ArrParameters(ParamCount)
  For i = (ParamCount -6) to (ParamCount -1)
    ArrParameters(i) = ArrSearch(checkcount)
  Next
  checkcount = checkcount +1
Loop

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.open "PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE=asdf.mdb;"
Set cmd = server.createobject("adodb.command")
cmd.activeConnection = Conn
cmd.CommandText = sqlstmt

Set RecSet = cmd.Execute(, ArrParameters)

IF RecSet.EOF THEN
  wri = wri & "<p>Inga träffar.</p>"
ELSE
  Do Until RecSet.EOF
    wri = wri & builder(RecSet("ID"))
    RecSet.MoveNext
  Loop
END IF

RecSet.Close
Set RecSet = Nothing
Set cmd = Nothing
Conn.Close
Set Conn = Nothing

Response.Write wri
%>
```

Är tacksam för all hjälp jag kan få. Har försökt i flera dagar nu utan att lyckas.

Permalänk: https://www.webforum.nu/p/144728

## #2 — The_Hulk, 2006-03-29T10:49Z

Vilken rad är rad 53?

Vad tjänar du på att stoppa SQL-satser i varandra flera gånger?
kommer ju att bli en gigantiskt SQL-fråga.

Permalänk: https://www.webforum.nu/p/1788314

## #3 — Travoni, 2006-03-29T10:59Z

Rad 53 är väl denna: Set RecSet = cmd.Execute(, ArrParameters)

Men är inte ArrParameters en array av något slag?

Permalänk: https://www.webforum.nu/p/1788319

## #4 — The_Hulk, 2006-03-29T11:10Z

Måste man inte skicka med den första parametern?

Permalänk: https://www.webforum.nu/p/1788331

## #5 — Donatello, 2006-03-29T11:29Z

> Vad tjänar du på att stoppa SQL-satser i varandra flera gånger?
> kommer ju att bli en gigantiskt SQL-fråga.

Det var enda sättet jag kom på... Jag splittar upp orden i söksträngen, så om man söker på ex.vis "äldreomsorg stockholm" så ska man få träff om äldreomsorg finns i exvis titel\_ och stockholm finns text\_. Första frågan träffar alla rader i databasen där första ordet finns, andra frågan träffar alla rader från första frågan där andra ordet finns osv.

> Vilken rad är rad 53?

Rad 53 är: Set RecSet = cmd.Execute(, ArrParameters)

> Men är inte ArrParameters en array av något slag?

ArrParameters är en array som innehåller sökorden enligt följande: ArrParameters(0-5) = sökord 1, ArrParameters(6-11) = sökord 2 osv (eftersom varje sökord testas i sex olika kolumner).

> Måste man inte skicka med den första parametern?

Inte i detta fallet. Har använt mig av denna metod tidigare.

Lösningar...? \*smådesperat\*  :OO

Permalänk: https://www.webforum.nu/p/1788343

## #6 — Travoni, 2006-03-29T11:54Z

skriv ut dina parametervärden:

```
Response.Write ArrParameters
Response.end()
Set RecSet = cmd.Execute(, ArrParameters)
```

Så ser du om det ser rätt ut.

Permalänk: https://www.webforum.nu/p/1788358

## #7 — Donatello, 2006-03-29T12:02Z

> skriv ut dina parametervärden

Testat det... 

```
count = 0
Do Until count = ParamCount
  Response.Write ArrParameters(count) & "<br>"
  count = count +1
Loop
Response.end()
```

Söker jag på exemplet "äldreomsorg stockholm" blir resultatet:

```
äldreomsorg
äldreomsorg
äldreomsorg
äldreomsorg
äldreomsorg
äldreomsorg
stockholm
stockholm
stockholm
stockholm
stockholm
stockholm
```

Frustrerande...  :OO 

Fler idéer?

Permalänk: https://www.webforum.nu/p/1788363

## #8 — Travoni, 2006-03-29T12:12Z

Måste bara fråga: Vad är det du vill göra?
Om man söker på ex.: äldreomsorg stockholm
Så vill du att äldreomsorg och stockholm skall hittas i alla fält?
Jag skulle nog skippa den parameteriserade frågan och bygga ihop sql:en med en for-sats istället. Se bara till att ta bort "farliga" tecken.

Permalänk: https://www.webforum.nu/p/1788365

## #9 — The_Hulk, 2006-03-29T12:17Z

Jag personligen hade skrivit om SQL-satsen så den blir i stil med:

```
sqlstmt = "SELECT * FROM annonser WHERE 1=1"

Do Until checkcount = count
  sqlstmt = sqlstmt & " OR titel_ LIKE '%"&ArrSearch(checkcount)&"%' OR namn_ LIKE '%"&ArrSearch(checkcount)&"%' OR telefon_ LIKE '%?%' OR epost_ LIKE '%?%' OR innehall_ LIKE '%"&ArrSearch(checkcount)&"%' OR hemsida_ LIKE '%"&ArrSearch(checkcount)&"%'"
Loop
```

då får du en enda SQL-sats, blir ju i och för sig längre ju fler ord man skickar in.
kommer kanske inte att lösa ditt problem men enligt mig ser det snyggare ut.
Skulle tro att det även blir mer lättlästliget. vet dock inte hur prestandan påverkas, tycker inte den borde bli sämre.

Permalänk: https://www.webforum.nu/p/1788369

## #10 — Travoni, 2006-03-29T12:20Z

```
ArrSearch = Split(replace(Search,"'","''"), " ") '/r
sql = "SELECT * FROM annonser WHERE ("
andor = "AND" 'eller "OR"

For i = 0 to ubound(ArrSearch)
	sql = sql & "(titel_ LIKE '%"& ArrSearch(i) &"%' OR namn_ LIKE '%"& ArrSearch(i) &"%' OR "
	sql = sql & "telefon_ LIKE '%"& ArrSearch(i) &"%' OR epost_ LIKE '%"& ArrSearch(i) &"%' OR "
	sql = sql & "innehall_ LIKE '%"& ArrSearch(i) &"%' OR hemsida_ LIKE '%"& ArrSearch(i) &"%') " & andor & " "
Next

sql = left(sql, len(sql) - 4) & ")"

Set RecSet = cmd.Execute(sql)
```

Permalänk: https://www.webforum.nu/p/1788372

## #11 — Donatello, 2006-03-29T12:20Z

> Måste bara fråga: Vad är det du vill göra?
> Om man söker på ex.: äldreomsorg stockholm
> Så vill du att äldreomsorg och stockholm skall hittas i alla fält?

Jag vill att äldreomsorg ska hittas i något av fälten och stockholm i något av fälten. Inte nödvändigtvis samma, men båda måste finnas nånstans.

> Jag skulle nog skippa den parameteriserade frågan och bygga ihop sql:en med en for-sats istället. Se bara till att ta bort "farliga" tecken.

Mixtra med söksträngen då, menar du? Köra några replacear... Problemet då blir ju att om det finns "farliga" tecken i databasen (vilket det gör på några ställen), så blir ju inte sökningen efter dessa korrekt... Eller..?   :l

Permalänk: https://www.webforum.nu/p/1788373

## #12 — Travoni, 2006-03-29T12:22Z

Se bara till att göra en replace på apostrofer.
ArrSearch = Split(replace(Search,"'","''"), " ")

Permalänk: https://www.webforum.nu/p/1788375

## #13 — Donatello, 2006-03-29T12:24Z

> sqlstmt = "SELECT \* FROM annonser WHERE 1=1"
> 
> Do Until checkcount = count
>   sqlstmt = sqlstmt & " OR titel\_ LIKE '%"&ArrSearch(checkcount)&"%' OR namn\_ LIKE '%"&ArrSearch(checkcount)&"%' OR telefon\_ LIKE '%?%' OR epost\_ LIKE '%?%' OR innehall\_ LIKE '%"&ArrSearch(checkcount)&"%' OR hemsida\_ LIKE '%"&ArrSearch(checkcount)&"%'"
> Loop

Med denna kod får jag ju även träffar där bara ett av orden finns med, eftersom man bara använder sig av OR.......

Permalänk: https://www.webforum.nu/p/1788376

## #14 — Donatello, 2006-03-29T12:30Z

> Se bara till att göra en replace på apostrofer.
> ArrSearch = Split(replace(Search,"'","''"), " ")

Har lärt mig att enbart detta inte skyddar mot injections... men jag kan ha fel... Har bara hållit mig till parameteriserade frågor.

Ska testa lite nu.. Återkommer senare.   :)

Permalänk: https://www.webforum.nu/p/1788380

## #15 — Travoni, 2006-03-29T12:43Z

Det beror på vilken databas du jobbar med.

Permalänk: https://www.webforum.nu/p/1788388

## #16 — Donatello, 2006-03-29T12:46Z

> **Travoni skrev:**
>
> Det beror på vilken databas du jobbar med.

Access 2000...

Permalänk: https://www.webforum.nu/p/1788391

---

Tråden på webben: https://www.webforum.nu/amne/asp/144728-sökfunktion-som-söker-i-flera-olika-fält-kört-fast
