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
11 svar · 468 visningar · startad av AG
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
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
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
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]
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
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>
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
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
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
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]
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]
Finemang!
Alltid trevligt att kunna hjälpa till.
mvh
------------------
----------------------------
Gunnar Liljas - webbutvecklare
Leon Reklambyrå AB
Norrköping
ASP/VB/Perl/PHP/Tango