>> Torna all'Homepage <<
Contattaci Entra nei forum Cerca nel sito
News della settimana ASP: esempi di pagine dinamiche Trucchi e suggerimenti per il PC Manuali e guide I dossier e gli approfondimenti di AmicoPc Il sito della settimana I racconti di Armando Staffa Chi siamo
     
 

 

Scarica i file
Scarica i file
citati in questa pagina

 


MOTORE DI RICERCA INTERNO

Se avete un sito con parecchio materiale ad un certo punto è una scelta quasi obbligata quella di implementare un sistema di ricerca interno al sito stesso.
Esistono alcuni siti specializzati nell’offrire, gratuitamente, strumenti di ricerca o di mappatura delle pagine: basti ricordare, per esempio, FreeFind (http://www.freefind.com)
I limiti di questo sistema sono fondamentalmente due: l’interfaccia grafica dei risultati della ricerca non è personalizzabile se non in minima parte.
Inoltre la ricerca viene eseguita solo su pagine html: se nel vostro sito avete utilizzato pagine in ASP, tale pagine non verranno indicizzate.

Per risolvere queste limitazioni possiamo, grazie all’ASP, realizzare un motore di ricerca interno.
Facciamo qui riferimento alla sezione ‘Search’ del sito AmicoPc, visibile all’indirizzo http://www.amicopc.com/search/index.htm  

CERCA.MDB
Abbiamo innanzitutto bisogno di un database di access che chiameremo ‘cerca.mdb’ e che dovrà essere memorizzato nella sottocartella ‘database’. In tale database creiamo una tabella (che chiameremo ‘cerca’) nella quale dovranno esistere tre campi: il primo campo ‘id’ è un campo contatore; il secondo campo ‘percorso’ è un campo di testo (massimo 255 caratteri e non solo 50) mentre l’ultimo campo ‘descrizione’ dovrà essere un campo memo.
In tale database dovremo memorizzare il percorso delle singole pagine (esempio ‘http://www.amicopc.com/pagina1.htm') nel relativo campo 'percorso'; nel campo ‘descrizione’, invece, inseriremo le parole chiave da associare a quella pagina (esempio: computer, internet, asp... e così via).
Personalmente consiglio di fare un copia - incolla dell’intera pagina in tale campo: così facendo non c’è bisogno di scegliere le parole chiave pagina per pagina ma è sufficiente copiare tutte le pagine nei vari record e inserirne solo il relativo indirizzo.
Inoltre, così facendo, la ricerca darà risultati decisamente migliori e più precisi.

CERCA.HTM
Una volta preparato il database prepariamo il modulo che ci consente di inserire le parole chiave da cercare. Pertanto creiamo una nuova pagina html e inseriamo un modulo che faccia riferimento alla pagina ‘risultati.asp’ con il metodo get.
Inseriamo poi un campo di testo a riga singola (che chiameremo ‘form_chiave’) e inseriamo due pulsanti di opzione (che chiamiamo ‘tipo’), di cui il primo, che dovrà essere selezionato, avrà come valore ‘tutte’, mentre il secondo avrà come valore ‘frase’.
Il primo pulsante corrisponde all’opzione ‘cerca tutte le parole’, mentre il secondo corrisponde all’opzione ‘cerca frase esatta’.

Per intenderci: se io inserisco le parole ‘computer’ e ‘darty’ (per non complicarci la vita non facciamo distinzione tra maiuscole e minuscole) selezionando l’opzione ‘tutte’, mi verranno proposte le pagine che contengono entrambe le parole, anche se poste a distanza tra loro (per esempio: ‘il computer nuovo del mio amico Darty’).
Selezionando invece l’opzione ‘frase’ vengono presentate solo le pagine che contengono le due parole vicine (quindi le pagine che contengono la frase ‘computer darty’)

Il codice di questa pagina dovrebbe essere qualcosa del tipo

<html>

<body>

<form method="get" action="risultati.asp">

<p>Cerca<br>

<input type="text" name="form_chiave" size="20"></p>

<p><input type="radio" value="tutte" name="tipo" checked>tutte le parole</p>

<p><input type="radio" value="frase" name="tipo">frase esatta</p>

<p><input type="submit" value="Invia" name="B1"><input type="reset" value="Reimposta" name="B2"></p>

</form>

</body>

</html>

Il modulo appena riportato utilizza il metodo get anziché il metodo post: il metodo post serve per inviare i dati ad una pagina o un programma (per esempio cgi bin), mentre il metodo get serve per richiamare una pagina, inserendo nel link di collegamento i valori inseriti nei campi del modulo stesso.
Quindi se io ho un campo key in cui inserisco la parola prova, cliccando sul bottone di invio mi verrà caricata la pagina search.asp?key=prova
Il motivo per cui utilizziamo questo metodo è semplicemente quello di poter avere, direttamente nel link di collegamento, le variabili che ci interessano (parole da cercare, se tutte le parole o la frase esatta e così via), senza bisogno di ricorrere a session o quant'altro.
Pertanto questa pagina non preleva i dati utilizzando request.form bensì utilizza il request.string, in quanto le variabili sono contenute nella stringa dicollegamento.

RISULTATI.ASP
Per comodità visualizzeremo i risultati in una pagina simile a quella già vista quando abbiamo parlato di ‘paginazione’, ovvero un certo numero di record per ogni pagina (nel nostro caso erano cinque ma ora ne impostiamo venti), con la possibilità di visualizzare ulteriori risultati.
Questa pagina dovrà mostrarmi i primi venti risultati visualizzando anche alcune righe di ogni pagina trovate. Inoltre dovrà mostrare il numero di risultati trovati, nonchè il numero della pagina su cui ci troviamo (per esempio ‘pagina 1 di 5’)

Come prima cosa includiamo il file ‘adovbs.inc’

<!-- #INCLUDE FILE="adovbs.inc" -->

A questo punto preleviamo dalla stringa di collegamento i parametri relativi alle parole chiave da cercare e al tipo di ricerca da effettuare, sempre utilizzando la funzione ‘request.querystring(“parametro”)’

<%

Dim prechiave

Dim tipo

prechiave=request.querystring("form_chiave")

tipo=request.querystring("tipo")

Nel caso in cui l’utente abbia selezionato l’opzione ‘tutte le parole’ la stringa di ricerca dovrebbe essere del tipo: «seleziona nella tabella ‘cerca’ tutti i valori in cui il campo ‘descrizione’ corrisponde alla PRIMA_PAROLA e il campo ‘descrizione’ corrisponde alla SECONDA_PAROLA». Se invece usassimo una stringa del tipo «seleziona nella tabella ‘cerca’ tutti i valori in cui il campo ‘descrizione’ corrisponde alla PRIMA_PAROLA e alla SECONDA_PAROLA» cercheremmo la ‘frase esatta’.

Quindi dobbiamo sostituire, nella variabile ‘prechiave’, gli spazio vuoti con “ %'and descrizione like'% ” in modo che sia possibile cercare più parole ma non necessariamente tra loro vicine (questo 'trucco' è tratto dalla newsletter ‘Uno script al giorno’ del sito http://www.aspitalia.com)

Utilizziamo quindi la funzione Replace che è così strutturata: variabile da modificare, che cosa sostituire, con che cosa sostituire. In questo caso vediamo che la variabile da modificare è ‘prechiave’ e dovremo sostituire gli spazi vuoti fra una parola e l’altra (“ “) con la frase contenuta nella variabile ‘change’

if tipo="tutte" then

change="%'and descrizione like'%"

chiave=Replace(prechiave," ", change)

Nel caso in cui l’utente abbia selezionato invece selezionato l’opzione ‘frase esatta’, avremo che la chiave di ricerca corrisponde alle parole inserite nel modulo senza bisogno di nessuna sostituzione.

else

chiave=prechiave

end if

La parte che segue è uguale a quella che già abbiamo visto in precedenza parlando di 'paginazione', quindi non necessità di approfonditi commenti.
Apro comunque la connessione con il database ‘cerca.mdb’ ed effettuo la ricerca nel database.

Dim iPageSize      
' Numero di record da visualizzare

Dim iPageCount     
'Numero di pagine totali che otteniamo dalla query

Dim iPageCurrent   
'Pagina corrente

Dim strOrderBy     
'Parametro in base a cui definire l'ordinamento

Dim strSQL         
' Comando da eseguire

Dim RS    
' Il solito Recordset

Dim iRecordsShown  
' Variabile usata per definire i record mostrati

Dim miastringa
' Variabile utilizzata per la visualizzazione dei risultati

Dim nuovastringa
' Variabile utilizzata per la visualizzazione dei risultati

iPageSize = 20
'Imposto il numero di record visualizzat

If Request.QueryString("page") = "" Then

                iPageCurrent = 1

Else

                iPageCurrent = CInt(Request.QueryString("page"))

End If

If Request.QueryString("order") = "" Then

                strOrderBy = "id"

Else

                strOrderBy = Request.QueryString("order")

End If

Dim Conn

Set Conn = Server.CreateObject("ADODB.Connection")

conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.mappath("database/cerca.mdb")

Set rs = Server.CreateObject("ADODB.Recordset")

sql = "SELECT * FROM cerca where descrizione like '%"&chiave&"%' ORDER BY " & strOrderBy & " DESC;"

RS.Open sql, conn, adOpenKeyset

RS.PageSize = iPageSize

RS.CacheSize = iPageSize

iPageCount = RS.PageCount

If iPageCurrent > iPageCount Then iPageCurrent = iPageCount

If iPageCurrent < 1 Then iPageCurrent = 1

I simboli % presenti prima e dopo la variabile chiave (nella query di ricerca) corrispondono all'asterisco del DOS, ovvero sostituiscono qualsiasi carattere.
In questo modo è possibile efettuare una ricerca anche per frammenti di parola. Infatti
Per esempio inserendo la parola comp, grazie alla presenza di questi simboli, verranno visualizzate le parole computer,
accompagnatore e così via.
Se non si vuole effettuare questo tipo di ricerca è sufficiente eliminarli dal codice.

Conto ora i risultati trovati e ne memorizzo il numro nella variabile totale

Dim totale
totale=rs.recordcount

Nel caso in cui non si siano trovata nessuna pagina corrispondente ai criteri specificati, carichiamo la pagina ‘search_again.htm’ che vedremo dopo.

If iPageCount = 0 Then

                response.redirect("search_again.htm")

Else

                RS.AbsolutePage = iPageCurrent

%>

Cominciamo a mostrare il numero di record trovati

<p align=“center”><font color="cc0000"><b> La ricerca ha prodotto  <% = totale %> risultati</b></font></p>

Comincia la visualizzazione dei risultati

<%
iRecordsShown = 0
Do While iRecordsShown < iPageSize And Not RS.EOF
%>

Innanzitutto visualizziamo il link verso la pagina trovata, in modo che possa essere cliccato. Tale link è memorizzato nel campo ‘percorso’ del nostro database, quindi avremo

<p><a href="<%= rs("percorso")%>"><%= rs("percorso")%></a><br>

A questo punto visualizziamo i primi duecento caratteri di quella stessa pagina: per fare questo utilizziamo la funzione ‘Mid( variabile_da_modificare, primo_carattere_da_visualizzare, ultimo_carattere_da_visualizzare)’, aggiungendo alla fine i tre punti di sospensione (...)

Nel nostro caso tale funzione sarà ‘Mid( miastringa, 1, 200)’

<font face="Verdana, Arial, Helvetica, sans-serif" size="1"><%
miastringa = RS("descrizione")
nuovastringa = Mid( miastringa, 1, 200)
response.write(nuovastringa)&"..."
%></font></p>

Continuo poi a mostrare i risultati successivi

<%
iRecordsShown = iRecordsShown + 1
RS.MoveNext
Loop
End If

Quando ho finito posso chiudere la connessione e il recordset

RS.Close
Set RS = Nothing
Conn.Close
Set Conn= Nothing
%>

A questo punto visualizziamo il numero di pagina in cui ci troviamo

<font face="Verdana, Arial, Helvetica, sans-serif" size="2">Pagina <%= iPageCurrent%> di <%= iPageCount%></font>

Infine creiamo, se servono, i link ‘avanti’ e ‘indietro’

<%
If iPageCurrent <> 1 Then
%>

<a href="risultati.asp?page=<%= iPageCurrent - 1 %> &amp;order=<%= Server.URLEncode(strOrderBy) %> &form_chiave=<% = prechiave %>&tipo=<% = tipo %>"> indietro</a>
<% end if %>
<%If iPageCurrent < iPageCount Then %>
<a href="risultati.asp?page=<%= iPageCurrent + 1 %> &amp;order=<%= Server.URLEncode(strOrderBy) %> &form_chiave=<% = prechiave %>&tipo=<% = tipo %>"> avanti &gt;</a>
<% end if %>

Fatto questo abbiamo finito

SEARCH_AGAIN.HTM

Il file ‘search_again.htm’ è identico al file ‘cerca.htm’ che abbiamo visto prima. L’unica differenza è data da un messaggio che avverte l’utente del fatto che non si siano trovate pagine corrispondenti ai criteri di ricerca impostati: quindi lo si invita ad effettuare una nuova ricerca.

 

Trucchi&Segreti per conoscere meglio il tuo PC.

Utenti connessi: 19

Invia questa pagina ad un amico

 

 

 

Chi siamo | Pubblicità | Note sulla privacy | Dicono di noi
Grafica cura di Paolo Omero
- Stefania Migliorucci

La riviera delle azalee