Questo è un motore di ricerca preso da un aricolo di cfmentor.com
come posso fare a metterlo con coldfusion tramite una pag. in dreamweaver mx?
Potete farmi un esempio?
Potreste spiegarmi come si indicizza un motore di ricerca, è possibile applicarlo a questo?
Partiamo dal form di ricerca, che potrebbe essere:
<form method="post">
Parole chiave: <input name="keyWords" type="text">
Opzione di ricerca:
<select name="typeOfSearch">
<option value="atLeastOne">Almeno una parola chiave</option>
<option value="all">Tutte le parole chiave</option>
<option value="exact">Frase esatta</option>
</select>
<input type="Submit">
</form>
All'invio del form, sarà eseguita una query che interroga il database con le parole chiave inserite. Ad esempio, dobbiamo interrogare la tabella MY_TABLE e cercare all'interno del campo MY_FIELD.
Se la ricerca è stata selezionata di tipo "Frase esatta", basterà una query del tipo:
<cfquery name="searchResults" datasource="mioDSN">
SELECT * FROM MY_TABLE
WHERE MY_FIELD LIKE '%#form.keyWords#%'
</cfquery>
Come facciamo a fare una ricerca di almeno una parola chiave? Concettualmente, dovremo dire a CFQUERY: trovami tutti i record che contengono questa O quella O quella O quell'altra parola. Dobbiamo perciò dividere la frase in parole.
Questo è semplicissimo, poiché possiamo vedere la frase di ricerca come una lista di valori (le singole parole) separati da un carattere (lo spazio).
Ad esempio, una query di questo tipo dovrà essere:
<cfquery name="searchResults" datasource="mioDSN">
SELECT * FROM MY_TABLE
WHERE MY_FIELD LIKE '%mia%' OR MY_FIELD LIKE '%sorella%' OR MY_FIELD LIKE '%ama%' OR MY_FIELD LIKE '%ColdFusion%'
</cfquery>
dovremo ripetere quindi la formula "MY_FIELD LIKE '%<parolachiave>%' OR" per ogni parola inserita, utilizzando un <CFLOOP> su una lista di valori, e ficcando dentro a CFQUERY qualche tag CFML:
<cfquery name="searchResults" datasource="mioDSN">
SELECT * FROM MY_TABLE
WHERE
<cfloop list="#form.keyWords#" delimeters=" " index="keyWord">
MY_FIELD LIKE '%#keyWord#%' OR
</cfloop>
1 = 0
</cfquery>
Nota che dobbiamo mettere "1 = 0" in fondo al select per evitare che l'SQL sia errato. Un loop del genere infatti produrrà codice come:
WHERE MY_FIELD LIKE '%mia%' OR LIKE '%sorella%' OR LIKE '%ama%' OR LIKE '%ColdFusion%' OR 1 = 0
1 = 0 è una condizione sempre falsa che, quindi, non pregiudica la catena di OR.
Se per cercare ALMENO una parola chiave abbiamo messo un OR, per cercare tutte le parole chiave dobbiamo utilizzare un AND. Il trucco come puoi notare è lo stesso.
<cfquery name="searchResults" datasource="mioDSN">
SELECT * FROM MY_TABLE
WHERE
<cfloop list="#form.keyWords#" delimeters=" " index="keyWord">
MY_FIELD LIKE '%#keyWord#%' AND
</cfloop>
0 = 0
</cfquery>
In questo caso, tuttavia, essendo una catena di AND, la condizione finale deve essere sempre vera, come appunto 0 = 0.
Uniamo ora tutto in un solo CFQUERY, inserendo le giuste condizioni con CFIF a seconda dell'opzione che l'utente seleziona dal menu SELECT del form:
<cfquery name="searchResults" datasource="mioDSN">
SELECT * FROM MY_TABLE
WHERE
<cfif form.typeOfSearch EQ "atLeastOne">
<cfloop list="#form.keyWords#" delimeters=" " index="keyWord">
MY_FIELD LIKE '%#keyWord#%' OR
</cfloop>
1 = 0
<cfelseif form.typeOfSearch EQ "all">
<cfloop list="#form.keyWords#" delimeters=" " index="keyWord">
MY_FIELD LIKE '%#keyWord#%' AND
</cfloop>
0 = 0
<cfelse>
MY_FIELD LIKE '%#form.keyWords#%'
</cfif>
</cfquery>
Se vogliamo fare le cose fatte bene, non dimentichiamoci di sostituire ad ogni #keyWord# un
<cfqueryparam cfsqltype="cf_sql_char" maxlength="50" value="#keyWord#">
e a #form.keyWords#:
<cfqueryparam cfsqltype="cf_sql_char" maxlength="500" value="#form.keyWords#">.
Ringrazio chiunque mi fornisca spiegazioni in merito!
Non ignoratemi!![]()
![]()
![]()