• Non ci sono risultati.

6. Una proposta metodologica: i tipi di ricerca

6.5 La ricerca di stringhe di testo

L'esperienza acquisita attraverso lo studio e l'analisi di progetti già esistenti in materia di carteggi d'artista180 ha suggerito di implementare un sistema di ricerca di stringhe nei testi

delle lettere, con la possibilità di vedere il risultato della propria ricerca evidenziato all'interno del testo stesso: quest'ultima è una caratteristica molto importante per un motore di ricerca ma, come si è visto, spesso non viene implementata.

La ricerca di stringhe all'interno dei testi delle lettere è stata realizzata in una sola pagina, e il codice che permette la ricerca è il seguente:

session_start();

$stringacercata = $_POST['ricerca']; $_SESSION['stringa'] = $stringacercata;

echo "Ecco i risultati della tua ricerca:<br /><br />"; $query = "SELECT * FROM lettere

WHERE LOWER(testo) LIKE LOWER('%$stringacercata%')"; $result = mysql_query($query);

$numero = mysql_num_rows($result); if ($numero == 0) {

echo "Nessun risultato. "; }

else { $i = 1;

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { echo $i;

echo ".&nbsp;";

echo "Data della lettera: "; echo"

6. Una proposta metodologica: i tipi di ricerca <a href='lettera.php?id=$row[id]'>$row[luogo]"; formatodata(); echo "</a>"; echo "<br /><br />"; $i++; } }

TAB. 6.7: la ricerca di stringhe nel testo.

Il primo passo da compiere è aprire una sessione attraverso il metodo “session_start”: una sessione è semplicemente un mezzo per memorizzare dati, e servirà per poter evidenziare i risultati della ricerca all'interno del testo. Successivamente viene dichiarata una variabile “$stringacercata” alla quale viene assegnata la stringa cercata dall'utente attraverso l'apposito form, quindi tale stringa viene memorizzata all'interno della sessione attraverso l'utilizzo della variabile superglobale $_SESSION: una variabile superglobale è una particolare variabile che è disponibile per qualsiasi funzione senza che ci sia la necessità di dichiararla.

Eseguite queste operazioni preliminari, si dà inizio alla query che cerca all'interno della tabella “lettere” tutte le missive che, all'interno del testo, rechino la stringa cercata dall'utente. Nella query, la variabile “$stringacercata” è preceduta e seguita da due operatori percentuali per permettere anche ricerche non precise: quindi se l'utente cerca la sequenza “art”, il risultato sarà costituito da tutti i testi che contengono la sequenza “art”. Se non fossero presenti gli operatori percentuali, il risultato sarebbe costituito da testi nei quali è presente la forma precisa “art”.

La query viene inviata alla base di dati tramite la solita funzione “mysql_query”. Viene creata quindi una variabile, denominata “$numero”, che conta semplicemente il numero dei record trovati con la ricerca. Questa variabile andrà poi a costituire la condizione del successivo blocco if: se infatti “$numero” è uguale a zero, sullo schermo all'utente apparirà la scritta “Nessun risultato”.

Altrimenti, viene creato l'array per la visualizzazione dei record tramite il consueto metodo “mysql_fetch_array”, e successivamente viene dichiarata una variabile “$i”, impostata a 1: si tratta semplicemente di un contatore per numerare i risultati della ricerca. Ogni volta che il

6. Una proposta metodologica: i tipi di ricerca

ciclo while per la visualizzazione dei record viene ripetuto, il contatore viene incrementato ($i++), in modo tale che i collegamenti ai testi che contengono la stringa cercata possano essere numerati in modo progressivo.

I collegamenti vengono presentati con il numero di cui si è appena parlato e con la data di invio della lettera, formattata in modo elegante tramite la funzione “formatodata”: cliccando sul collegamento si sarà rimandati alla pagina della lettera181, all'interno della quale la stringa

cercata sarà evidenziata.

Come è possibile evidenziare la stringa cercata in un'altra pagina? Il codice che permette tale operazione è il seguente:

if (isset($_SESSION['stringa'])) { $stringacercata = $_SESSION['stringa']; $testo= $row['testo']; $pattern = preg_quote($stringacercata); $testo = preg_replace("|($pattern)|i", "<font color='#ffffff'><b>\\1</b></font>", $testo); echo $testo; echo "<br /><br />"; session_destroy(); } else { echo "$row[testo]"; echo "<br /><br />"; }

TAB. 6.8: evidenziazione dei risultati della ricerca nella pagina della lettera.

Questo codice illustra anche il modo attraverso il quale nella pagina della lettera viene rappresentato il testo della missiva selezionata.

6. Una proposta metodologica: i tipi di ricerca

Innanzitutto, un blocco if controlla che sia stata impostata la sessione “stringa” (e, qualora sia stata svolta la ricerca per stringa, la condizione è soddisfatta in quanto la sessione dura per tutta la navigazione nel sito finché non viene interrotta da un'apposita funzione). Quindi, viene dichiarata una variabile “$stringacercata”, il cui valore sarà quello della stringa memorizzata nella sessione (la stringa cercata dall'utente).

Viene poi dichiarata una variabile per il testo e una variabile “$pattern”, il cui valore non sarà altro che la stringa cercata dall'utente a cui saranno aggiunte le sequenze di escape (tramite la funzione “preg_quote”) per evitare problemi di riconoscimento di caratteri.

A questo punto avviene la messa in rilievo della stringa cercata, che si effettua con una sostituzione del testo: la funzione “preg_replace”, tramite l'uso delle espressioni regolari di PHP, cerca all'interno della variabile “$testo” la variabile “$pattern” (la “i” che segue la dichiarazione all'interno di “preg_replace” è un operatore delle espressioni regolari e serve per indicare la case-insensitiveness, ovvero si ordina alla funzione di trascurare le differenze tra lettere maiuscole e lettere minuscole) e la sostituisce sempre con la stessa variabile, ma opportunamente evidenziata (nel codice in tabella 6.8, la variabile è stata messa in grassetto e colorata di bianco).

A questo punto la sessione viene annullata tramite il metodo “session_destroy”, in modo tale che il sistema possa essere pronto per una nuova ricerca.

Qualora la condizione del blocco if non sia soddisfatta, la pagina “lettera.php” non farà altro che presentare all'utente il testo della lettera selezionata senza alcuna evidenziatura.