webForumDet fria alternativet

Massor av problem

2 svar · 140 visningar · startad av AG

AGMedlem sedan mars 20001 266 inlägg
#1

Följande kod är det flera strul med.

<!--#include file="adovbs.inc"-->
<%
Response.Cachecontrol="Public"
Set Connection = Server.CreateObject("ADODB.connection")
Connection.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("\cgi-bin/news.mdb")

MyPageSize = 3
if Request.QueryString("page") = "" then
CurrPage = 1
else
CurrPage = Request.QueryString("page")
end if

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.form("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)

Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open mQuery, Connection, 3,1
hits=rs.recordcount

RS.PageSize = MyPageSize
RS.AbsolutePage = CurrPage
curr = 0

%>
<html>
<head>
<title>GamersLair -Inte störst men Bäst</title>
<!--#include file="scripts/jscripts.txt"-->
</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">
Sökningen <font color="red"><% Response.write (request.form("search")) %></font> resulterade i <b><% =hits %></b> träffar<br>
<%
If rs.EOF Then
Response.write("Vi sökte, men hittade inte vad du ville ha.")
Else
%>
[Page <%= CurrPage %> of <%= RS.PageCount %>]<br>
<%
do while not RS.EOF and curr < MyPageSize
%>

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

<%
rs.MoveNext
curr = curr + 1
Loop
End If
%>
<input type="hidden" name="search" value="<% =request.form("search") %>">
<%
if CurrPage > 1 then
%>

<a href="sok.asp?page=<%= CurrPage - 1 %>"> Prev 10 hits></a>
<%
end if
%>

<%
if CurrPage < RS.PageCount then
%>
<a href = "sok.asp?page=<%= CurrPage + 1 %>"> Next 10 hits></a>
<%
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>

Första problemet uppstår när man går till sida två alltså skall visa nästa tre poster, då läser den istället in alla poster i hela databasen, har försökt lösa detta genom att köra ett hidden form fast utan resultat.

Ett annat är att om rs är tomt så får jag felmeddelande texten visas inte.

Ja det var väl det viktigaste.
Har försökt länga och väl att försöka lösa detta fast utan resultat.

Hoppas på hjälp
Andreas

bohlinMedlem sedan mars 2000263 inlägg
#2

Ändra loop-saken lite granna...
antal=5 'så många som ska visas på varje "sida", i ditt fall MyPageSize, eller nått sånt...

For i=1 to antal
If rs.eof then exit for

RS.MoveNext
Next

------------------
/bohlin

emissionMedlem sedan dec. 19996 721 inlägg
#3

När du går till nästa sida följer ingen fråga med (egentligen borde lägga en koll som spottar ur ett felmeddelande om ingen fråga angivits). Som det är nu blir söksträngen LIKE '%%' och då hittar den ju alla poster i databasen.

Antingen skickar du med den färdiga mQuery, så att parsningen inte behöver göras om, eller så skickar du med "search" igen.

Jag ser att du har försökt att skciak med den, men inte riktigt lyckats. Varför?

Jo, det normala är ju att du lägger in söksträngen i länkarna till de olika resultatsidorna, och det har du säkert redan provat. Men, då hamnar "search" i request.querystring("search") och inte i request.form("search").

Den enkla lösningen är att byta ut

mQuery=request.form("search")

till

mQuery=request("search")

..eller

if request.querystring("search")<>"" then
mQuery=request.querystring("search")
else
mQuery=request.form("search")
end if

Lägg också till mOrigQuery=mQoery före parsningen, så att söksträngen finns kvar.

Länken får du göra till

<a href="sok.asp?page=<%= CurrPage - 1 %>&search=<%=server.urlencode(mOrigQuery)%>"> Prev 10 hits></a>

och samma sak med den andra länken.

Om du vill skicka med den färdiga mQuery går ju också det bra. Du kan säkert lista ut själv hur du ska göra då.

Var uppstår det andra felet? Vilken rad?

[Redigerat av emission den 28 maj 2000]

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