webForumDet fria alternativet

Hjälp med detta

11 svar · 468 visningar · startad av AG

AGMedlem sedan mars 20001 266 inlägg
#1

Fick denna del utav en vänlig själ.
Detta skulle hjälpa mig med min sökmaskin men jag behöver hjälp med vidarutvecling, helst komplett.
Om du vill splita följande sträng:
'+asp -php +dåligt'

vi säger att den ligger i en variabel som heter strSok, så gör du följande:

<%
Set Connection = Server.CreateObject("ADODB.Connection")
Connection.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("cgi-bin/databas.mdb")
'-- skapar början på din SQLFRÅGA
strSql = "SELECT * FROM Tabell WHERE "
'-- splitar din strSok till 3 st mindre strängar som läggs i arrayn sokArray
sokArray = split(strSok," ")
If InStr(sokArray(i),"+") > 0 then
strSql = strSql & "(ORD_SOK like '" & sokArray(i) &"') "
elseif InStr(sokArray(i),"-") > 0 then
strSql = strSql & "(ORD_SOK NOT like '" & sokArray(i) &"') "
end if

for iIndex = 1 to Ubound(sokArray)
If InStr(sokArray(i),"+") > 0 then
strSql = strSql & "AND (ORD_SOK like '" & sokArray(i) &"') "
elseif InStr(sokArray(i),"-") > 0 then
strSql = strSql & "AND (ORD_SOK NOT like '" & sokArray(i) &"') "
end if
next
'-- Kör din sqlSats mot databasen --
objRs.open strSql,objConn
%>

Hoppas någon är villig att hjälpa, finns ju många experter här.
Andreas

emissionMedlem sedan dec. 19996 721 inlägg
#2

Vad är det du behöver hjälp med? Parsningen av sökformuläret eller visningen av sökresultatet?

------------------
----------------------------
Gunnar Liljas - webbutvecklare
Leon Reklambyrå AB
Norrköping
ASP/VB/Perl/PHP/Tango

AGMedlem sedan mars 20001 266 inlägg
#3

Parsningen av sökformuläret är det. Vore kanon ifall du kunde hjälpa.
Vore bra ifall man kunde söka på hur många ord som helst.

Tack på förhand
Andreas

emissionMedlem sedan dec. 19996 721 inlägg
#4

Okej, det var en intressant fråga när man funderade lite på det, men detta har jag kommit fram till.

dim i,j,mQuery,mQueryArr,mAndArr,mNotArr,mOrArr,mSQL,mWhere

'grunddelarna i frågan
mSQL="SELECT * from Tabell WHERE " 
mWhere="soekfaelt LIKE '%%'"

'sökfältets värde
mQuery=request.querystring("query")

'loopa igenom allt och ersätt mellanslag inom citattecken med chr(1). 
'Denna bit går att göra med reguljära uttryck också
for i=1 to len(mQuery)
   mAsc=asc(mid(mQuery,i,1))
   if mAsc=34 then
      mCount=mCount+1
      blnInQ=not blnInQ
   else
      if blnInQ and mAsc=32 then
         mQuery=left(mQuery,i-1) & chr(1) & mid(mQuery,i+1)
      end if
   end if

next

'om antalet citattecken är ojämnt ignoreras de helt
if mCount mod 2 <> 0 then
   mQuery=replace(mQuery,chr(1)," ")
end if

'ta bort citattecknen
mQuery=replace(mQuery,chr(34),"")

'ersätt mellanslag med chr(0) och mellanslag
mQuery=chr(0) & replace(mQuery," "," " & chr(0))

'splitta upp i en array
mQueryArr=split(mQuery," ")

'skapa arrayer för AND, AND NOT och OR. 
'chr(0) gör det nu möjligt att matcha endast början på strängarna
mAndArr=filter(mQueryArr,chr(0) & "+",true)
mQueryArr=filter(mQueryArr,chr(0) & "+",false)
mNotArr=filter(mQueryArr,chr(0) & "-",true)
mQueryArr=filter(mQueryArr,chr(0) & "-",false)

'återskapa strängarna (ersätt chr(1) med mellanslag) och
'skapa WHERE-satser i arrayerna
for i=0 to ubound(mAndArr)
   mAndArr(i)=replace(mAndArr(i),chr(1)," ")
   mAndArr(i)=replace(mWhere,"%%","%" & mid(mAndArr(i),3) & "%")
next
for i=0 to ubound(mNotArr)
   mNotArr(i)=replace(mNotArr(i),chr(1)," ")
   mNotArr(i)=replace(mWhere,"%%","%" & mid(mNotArr(i),3) & "%")
next
for i=0 to ubound(mQueryArr)
   mQueryArr(i)=replace(mQueryArr(i),chr(1)," ")
   mQueryArr(i)=replace(mWhere,"%%","%" & mid(mQueryArr(i),2) & "%")
next

'tejpa ihop en färdig fråga
mQuery=join(mQueryArr," OR ")
if mQuery<>"" then 
   mQuery="(" & mQuery  & ")"
   if ubound(mAndArr) > -1 then mQuery=mQuery & " AND "
end if
mQuery=mQuery & join(mAndArr," AND ")
if mQuery<>"" and ubound(mNotArr) > -1 then mQuery=mQuery & " AND NOT "
mQuery=mSQL & mQuery & join(mNotArr," AND NOT ")

'frågan är klar! Ligger i mQuery

Med detta kan du söka precis som på Altavista, med +, - och meningar inom citattecken.

Prova på, och fråga gärna om det är något du inte hänger med på.

mvh

------------------
----------------------------
Gunnar Liljas - webbutvecklare
Leon Reklambyrå AB
Norrköping
ASP/VB/Perl/PHP/Tango

[Redigerat av emission den 08 maj 2000]

AGMedlem sedan mars 20001 266 inlägg
#5

TAckar för all hjälp men det vill ändå inte fungera. Får error på följande rader: mSQL="SELECT * FROM Nyheter WHERE "
mWhere="artikel LIKE '%%'"
,så jag bifogade hela koden

<%
Response.Cachecontrol="Public"
Set Connection = Server.CreateObject("ADODB.Connection")
Connection.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("\cgi-bin/news.mdb")
dim i,j,mQuery,mQueryArr,mAndArr,mNotArr,mOrArr,mSQL,mWhere
'grunddelarna i frågan
mSQL="SELECT * FROM Nyheter WHERE "
mWhere="artikel LIKE '%%'"
'sökfältets värde
mQuery=request.querystring("search")

'loopa igenom allt och ersätt mellanslag inom citattecken med chr(1).
'Denna bit går att göra med reguljära uttryck också
for i=1 to len(mQuery)
mAsc=asc(mid(mQuery,i,1))
if mAsc=34 then
mCount=mCount+1
blnInQ=not blnInQ
else
if blnInQ and mAsc=32 then
mQuery=left(mQuery,i-1) & chr(1) & mid(mQuery,i+1)
end if
end if

next

'om antalet citattecken är ojämnt ignoreras de helt
if mCount mod 2 <> 0 then
mQuery=replace(mQuery,chr(1)," ")
end if

'ta bort citattecknen
mQuery=replace(mQuery,chr(34),"")

'ersätt mellanslag med chr(0) och mellanslag
mQuery=chr(0) & replace(mQuery," "," " & chr(0))

'splitta upp i en array
mQueryArr=split(mQuery," ")

'skapa arrayer för AND, AND NOT och OR.
'chr(0) gör det nu möjligt att matcha endast början på strängarna
mAndArr=filter(mQueryArr,chr(0) & "+",true)
mQueryArr=filter(mQueryArr,chr(0) & "+",false)
mNotArr=filter(mQueryArr,chr(0) & "-",true)
mQueryArr=filter(mQueryArr,chr(0) & "-",false)

'återskapa strängarna (ersätt chr(1) med mellanslag) och
'skapa WHERE-satser i arrayerna
for i=0 to ubound(mAndArr)
mAndArr(i)=replace(mAndArr(i),chr(1)," ")
mAndArr(i)=replace(mWhere,"%%","%" & mid(mAndArr(i),3) & "%")
next
for i=0 to ubound(mNotArr)
mNotArr(i)=replace(mNotArr(i),chr(1)," ")
mNotArr(i)=replace(mWhere,"%%","%" & mid(mNotArr(i),3) & "%")
next
for i=0 to ubound(mQueryArr)
mQueryArr(i)=replace(mQueryArr(i),chr(1)," ")
mQueryArr(i)=replace(mWhere,"%%","%" & mid(mQueryArr(i),2) & "%")
next

'tejpa ihop en färdig fråga
mQuery=join(mQueryArr," OR ")
if mQuery<>"" then
mQuery="(" & mQuery & ")"
if ubound(mAndArr) > -1 then mQuery=mQuery & " AND "
end if
mQuery=mQuery & join(mAndArr," AND ")
if mQuery<>"" and ubound(mNotArr) > -1 then mQuery=mQuery & " AND NOT "
mQuery=mSQL & mQuery & join(mNotArr," AND NOT ")

'frågan är klar! Ligger i mQuery
%>
<html>
<head>
</head>
<body background="bilder/pagebg.gif" text="black">
<center>
<!--#include file="annons/impressions.txt"--><p>
<table width="590" cellpadding="0" cellspacing="0" border="0" align="center">
<th colspan="5" valign="top"><!--#include file="scripts/logo.txt"--></th>
<tr><th colspan="5" valign="top"><!--#include file="scripts/meny.txt"--></th></tr>
<tr><td width="115" background="bilder/leftcolumgroblo.gif" valign="top"><!--#include file="scripts/vanstermeny.txt"--></td>
<td width="10" bgcolor="white"><hr width="10" color="white" noshade></td>
<td width="340" height="1000" bgcolor="white" valign="top"><!--#include file="scripts/datum.txt"--><br>
<font face="arial" size="2">
<%
If mQuery.EOF Then
Response.write("Vi sökte, men hittade inte vad du ville ha.")
Else
%>

<%
Do until mQuery.EOF
%>

<a href="nyheter.asp?id=<%=mQuery("Id")%>"><%= mQuery("Rubrik") %></a>
<br>

<%
mQuery.MoveNext
Loop
End If
%>

<td width="10" bgcolor="white"><hr width="10" color="white" noshade></td>
<td width="115" background="bilder/rightcolumn.gif" valign="top">
<!--#include file="scripts/hogermeny.txt"-->
</td></tr>
<th colspan="5" valign="top"><!--#include file="scripts/nedermeny.txt"--></th>
</table>
<p><!--#include file="annons/annat.txt"-->
</body>
</html>

Erroret är:
Microsoft VBScript runtime error '800a01a8'
Object required: 'SELECT * FROM Nyhete'

Hoppas nån kan
Andreas

emissionMedlem sedan dec. 19996 721 inlägg
#6

mQuery är inte ett recordset, utan bara en sträng som innehåller den färdiga SQL-frågan. Du måste först exekvera den frågan, så att du får tillbaka ett recordset.

<%
Response.Cachecontrol="Public"
Set Connection = Server.CreateObject("ADODB.Connection")
Connection.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("\cgi-bin/news.mdb")
dim i,j,mQuery,mQueryArr,mAndArr,mNotArr,mOrArr,mSQL,mWhere
'grunddelarna i frågan
mSQL="SELECT * FROM Nyheter WHERE " 
mWhere="artikel LIKE '%%'"
'sökfältets värde
mQuery=request.querystring("search")

'loopa igenom allt och ersätt mellanslag inom citattecken med chr(1). 
'Denna bit går att göra med reguljära uttryck också
for i=1 to len(mQuery)
mAsc=asc(mid(mQuery,i,1))
if mAsc=34 then
mCount=mCount+1
blnInQ=not blnInQ
else
if blnInQ and mAsc=32 then
mQuery=left(mQuery,i-1) & chr(1) & mid(mQuery,i+1)
end if
end if

next

'om antalet citattecken är ojämnt ignoreras de helt
if mCount mod 2 <> 0 then
mQuery=replace(mQuery,chr(1)," ")
end if

'ta bort citattecknen
mQuery=replace(mQuery,chr(34),"")

'ersätt mellanslag med chr(0) och mellanslag
mQuery=chr(0) & replace(mQuery," "," " & chr(0))

'splitta upp i en array
mQueryArr=split(mQuery," ")

'skapa arrayer för AND, AND NOT och OR. 
'chr(0) gör det nu möjligt att matcha endast början på strängarna
mAndArr=filter(mQueryArr,chr(0) & "+",true)
mQueryArr=filter(mQueryArr,chr(0) & "+",false)
mNotArr=filter(mQueryArr,chr(0) & "-",true)
mQueryArr=filter(mQueryArr,chr(0) & "-",false)

'återskapa strängarna (ersätt chr(1) med mellanslag) och
'skapa WHERE-satser i arrayerna
for i=0 to ubound(mAndArr)
mAndArr(i)=replace(mAndArr(i),chr(1)," ")
mAndArr(i)=replace(mWhere,"%%","%" & mid(mAndArr(i),3) & "%")
next
for i=0 to ubound(mNotArr)
mNotArr(i)=replace(mNotArr(i),chr(1)," ")
mNotArr(i)=replace(mWhere,"%%","%" & mid(mNotArr(i),3) & "%")
next
for i=0 to ubound(mQueryArr)
mQueryArr(i)=replace(mQueryArr(i),chr(1)," ")
mQueryArr(i)=replace(mWhere,"%%","%" & mid(mQueryArr(i),2) & "%")
next

'tejpa ihop en färdig fråga
mQuery=join(mQueryArr," OR ")
if mQuery<>"" then 
mQuery="(" & mQuery & ")"
if ubound(mAndArr) > -1 then mQuery=mQuery & " AND "
end if
mQuery=mQuery & join(mAndArr," AND ")
if mQuery<>"" and ubound(mNotArr) > -1 then mQuery=mQuery & " AND NOT "
mQuery=mSQL & mQuery & join(mNotArr," AND NOT ")

'frågan är klar! Ligger i mQuery

set rs=Connection.execute mQuery

%>
<html>
<head>
</head>
<body background="bilder/pagebg.gif" text="black">
<center>
<!--#include file="annons/impressions.txt"--><p>
<table width="590" cellpadding="0" cellspacing="0" border="0" align="center">
<th colspan="5" valign="top"><!--#include file="scripts/logo.txt"--></th>
<tr><th colspan="5" valign="top"><!--#include file="scripts/meny.txt"--></th></tr>
<tr><td width="115" background="bilder/leftcolumgroblo.gif" valign="top"><!--#include file="scripts/vanstermeny.txt"--></td>
<td width="10" bgcolor="white"><hr width="10" color="white" noshade></td>
<td width="340" height="1000" bgcolor="white" valign="top"><!--#include file="scripts/datum.txt"--><br>
<font face="arial" size="2">
<%
If rs.EOF Then
Response.write("Vi sökte, men hittade inte vad du ville ha.")
Else
%>

<%
Do until rs.EOF
%>

<a href="nyheter.asp?id=<%=rs("Id")%>"><%= rs("Rubrik") %></a>
<br>

<%
rs.MoveNext
Loop
End If
rs.close
set rs=nothing
Connection.close
set Connection=nothing
%>

<td width="10" bgcolor="white"><hr width="10" color="white" noshade></td>
<td width="115" background="bilder/rightcolumn.gif" valign="top">
<!--#include file="scripts/hogermeny.txt"-->
</td></tr>
<th colspan="5" valign="top"><!--#include file="scripts/nedermeny.txt"--></th>
</table>
<p><!--#include file="annons/annat.txt"-->
</body>
</html>
AGMedlem sedan mars 20001 266 inlägg
#7

Jo jag testade den lokalt med pws, det resulterade i att alla poster listades, alltså inte de som var releterande.

Nån lösning?
Andreas

emissionMedlem sedan dec. 19996 721 inlägg
#8

Kolla vad du har för värde i mQuery...

Response.Write mQuery

...så tar vi problemte därifrån.

PS. Åker utomlands i en vecka, så du kanske får ha lite tålamod med lösningen. DS

mvh

AGMedlem sedan mars 20001 266 inlägg
#9

Jag lade in följande snutt:
<%
Response.Write mQuery
%>
och den skrev då ut:
SELECT * FROM Nyheter WHERE (rubrik LIKE '%%')

Jag blev iaf inte klokare av det :)

Andreas

emissionMedlem sedan dec. 19996 721 inlägg
#10

Har du verkligen skickat nagot till skriptet? Du maste ju ha ett sökformulär ocksa.

Kör du bara skriptet ensamt lär det bli som du beskrev.

[Redigerat av emission den 19 maj 2000]

AGMedlem sedan mars 20001 266 inlägg
#11

Mohahaha....
Jag fick det att fungera, nästan lite stolt :)
Var så att det var ju att man mQuery=request.querystring("search") istället körde jag:
mQuery=request.form("search")
Då fungerade det kanon.
Ett stort tack till emission som hjälpte mig igenom detta. Och ett stort tack till alla andra på webforum.

Andreas

[Redigerat av AG den 20 maj 2000]

emissionMedlem sedan dec. 19996 721 inlägg
#12

Finemang!

Alltid trevligt att kunna hjälpa till.

mvh

------------------
----------------------------
Gunnar Liljas - webbutvecklare
Leon Reklambyrå AB
Norrköping
ASP/VB/Perl/PHP/Tango

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