Bygg en egen sökmotor #3
Förord
När nu programmet fungerar så långt är det dags att börja bygga sql-satserna som kommer att vara olika beroende på vad du valt för alternativ i listboxen. Även här använder vi oss av dessa två variabler för att kontrollera vartifrån och vad som skall sökas ut. Men innan vi kan börja måste vi bestämma oss hur resultatet skall presenteras och det gör du enklast genom att rita upp en tabell och fylla den med information såsom du skulle vilja att presentationen skall komma att se ut.Innehåll
Relaterade artiklar
» Bygg en egen sökmotor #1» Bygg en egen sökmotor #2
» Bygg en egen sökmotor #4
Genom att skriva ett generellt program för att presentera den information som du har sökt ut så kan du skriva en subrutin som kallas och i den så presenteras informationen dynamiskt. Ett exempel på detta är de sökmotorer som idag är vanliga - exempelvis altavista. Där presenteras en text med en länk- lite information och slutligen data om dokumentet. Jag tänkte att vi skulle försöka göra samma sak med customers tabellen. Här har jag ritat upp en tabell såsom det skulle kunna se ut med vårt resultat baserat på den informationen som finns tillgänglig i tabellen som vi skall använda oss av.
Sökresultat (32 träffar)
Sida 1/3
1. 0-9343750-9-7
Time and Task Management With dBASE III (Documentation Manual/With Disc)
[Publicerad: 1986 Bild]
2. 0-9343751-5-1
Sales Management With dBASE III With Diskette
[Publicerad: 1986 Bild]
Sida [ 1 2 3 ]
Som du ser ovan så tänkte jag mig att vi skulle försöka publicera informationen på detta överskådliga sätt. Först presenterar vi hur många träffar vi fick i från sökningen i databasen. Därefter säger vi vilken sida som du står på och längst ner till höger anges de länkar på de sidor som du skall kunna navigera till. Av de resultat som presenteras så använder vi oss också av en räknare för att skriva radnummer. Vi lägger en länk för både bokens ISBN nummer samt en länk till bokens aktuella bild (dessa är fejkade länkar och för ISBN nummret kommer länken att peka på http://dummy.htm och samma gäller för bilden).
Nu är det dags att börja hantera vår anslutning, databas och selekteringsfrågor. Det första vi får tänka på är att om du skapar ett recordset för en fråga så måste samma fråga köras igen varje gång du byter sida. På detta sätt kan det ta lite extra tid, men du tjänar två saker: Först och främst behöver inte webbservern hålla reda på någonting i internminnet utan släpper detta efter att varje sida presenterats. För det andra så kommer du också läsa den absolut senaste informationen från databasen. Alternativet är att placera hela resultatet av recordsetet i en session-variabel som hålls reda på. Du kommer tjäna fart men kan också skapa stora filer som läggs i serverns internminne och det är främst detta jag vill undvika. Den teknik som jag tänkte presentera för er bygger på 'ställ om frågan till databasen varje gång'.
Sökresultat (32 träffar)
Sida 1/3
1. 0-9343750-9-7
Time and Task Management With dBASE III (Documentation Manual/With Disc)
[Publicerad: 1986 Bild]
2. 0-9343751-5-1
Sales Management With dBASE III With Diskette
[Publicerad: 1986 Bild]
Sida [ 1 2 3 ]
Som du ser ovan så tänkte jag mig att vi skulle försöka publicera informationen på detta överskådliga sätt. Först presenterar vi hur många träffar vi fick i från sökningen i databasen. Därefter säger vi vilken sida som du står på och längst ner till höger anges de länkar på de sidor som du skall kunna navigera till. Av de resultat som presenteras så använder vi oss också av en räknare för att skriva radnummer. Vi lägger en länk för både bokens ISBN nummer samt en länk till bokens aktuella bild (dessa är fejkade länkar och för ISBN nummret kommer länken att peka på http://dummy.htm och samma gäller för bilden).
Nu är det dags att börja hantera vår anslutning, databas och selekteringsfrågor. Det första vi får tänka på är att om du skapar ett recordset för en fråga så måste samma fråga köras igen varje gång du byter sida. På detta sätt kan det ta lite extra tid, men du tjänar två saker: Först och främst behöver inte webbservern hålla reda på någonting i internminnet utan släpper detta efter att varje sida presenterats. För det andra så kommer du också läsa den absolut senaste informationen från databasen. Alternativet är att placera hela resultatet av recordsetet i en session-variabel som hålls reda på. Du kommer tjäna fart men kan också skapa stora filer som läggs i serverns internminne och det är främst detta jag vill undvika. Den teknik som jag tänkte presentera för er bygger på 'ställ om frågan till databasen varje gång'.
<%
selitem = request("soktyp")
if selitem = "" then SelItem = 1
sokText = request("soktext")
%>
osv...
<%
if sokText <> "" then
set con = server.createobject("ADODB.Connection")
set rst = server.createobject("ADODB.Recordset")
con.cursorlocation = 1 ' adUseClient
rst.cursorlocation = 1 ' adUseClient
con.connectionstring = "{Microsoft Access Driver (*.mdb)};DBQ=c:\nwind.mdb"
con.open "biblio"
Select Case selItem
Case 2
sql = "select * from titles where isnb like '" & soktext & "' "
Case 3
sql = "select * from titles where [Year Published] like '*" & soktext & "*' "
Case else
sql = "select * from titles where title like '*" & soktext & "*' "
End select
set rst = con.execute(sql)
if not (rst.eof or rst.bof) then
CreateReport rst
else
Response.Write "Inga poster funna. Gör ny sökning."
end if
rst.close
set rst = nothing
set con = nothing
end if
%>
Detta kommer att resultera i att beroende på vilken av alternativen i listboxen du valt så kommer också olika sql-satser att användas. I Else kommandot förutsätter vi att det blir 1 men om något annat skulle vara angivet så säkerställer vi oss med detta kommando. Därefter körs frågan och om det finns några träffar- startar vi en subrutin som kommer att skapa hela sökbilden, och för att göra den lite dynamisk- skickar vi även med vårt recordset som innehåller alla poster. Obs, tänk på att * används som wildcard i Access, Jet och SQL-server men i Oracle är det % som anges.
De två värden som sätts på connection och recordset innebär att den anslutning som görs samt de poster som vi får träff på- kommer att placeras lokalt (dock inte på din pc i detta fall, men i webbserver's internminne). Detta gör att du kan använda dig av kommandot .recordcount som i annat fall inte fungerar. Eftersom vi behöver veta antalet poster som finns så har vi två alternativ, antingen använder vi clientsided cursors eller så får vi skriva ytterligare en selectsats för att räkna ut hur många träffar vi kommer få på det vi sedan skall söka ut.
CreateReport rutinen kommer nu att rita ut tabellen, kolumnerna och informationen.
<%
page_id = request.querystring("page_id")
if page_id = "" then page_id = 1
RecPerPage = 15
%>
<%
Sub CreateReport (rst)
totrec = rst.recordcount
rst.pagesize = RecPerPage
pages = rst.pagecount ' hur många sidor får vi
if pages > 1 then
rst.absolutepage = page_id ' börjar på block page_id
' bygger navigeringsbar för flera sidor
DrawNavBar = ""
for a= 1 to pages
DrawNavBar = DrawNavbar & " a & chr(34) & ">" & a & " "
next
DrawNavBar= DrawNavBar & ""
PageInfo = " (" & page_id & "/" & pages & ")"
else
PageInfo = " (1/1)"
end if
Jag börjar med att fråga om det i asp-scriptet skickas med page_id som är den sida vi vill titta på när vi bläddrar oss igenom sökresultaten. Därefter sätter jag en variabel till 15 för vi skall visa just 15 poster per sida. I och med att vi lägger detta i en variabel kan vi lätt ställa in det antal som passar för just denna typen av sökning.
I CreateReport rutinen så tar vi nu reda på hur många poster som finns i sökresultatet. Därefter ställer vi in recordsetet på att varje block som vi vill ha skall innehålla 15 poster. Med denna inställning så får vi reda på hur många sidor som kommer att presenteras för oss.
Vi kontrollerar om det blir mer än en sida för då skall vi bygga upp en navigeringssträng som innehåller alla sidor som du vill visa. Vi lägger alltså in en länk för varje sidnummer och bygger hela html-strängen. Det gör att det blir lättare sedan att placera ut den när vi skall rita ut vårt sökresultat. Pageinfo kommer exempelvis att innehålla texten 1/3 (du är på sida x av y) vilket vi också skall skriva ut så småningom.
0 Kommentarer