In una buona applicazione per la gestione di un blog non può mancare un motore di ricerca interno per trovare velocemente i post sulla base di parole chiavi da confrontare con il contenuto della tabella dedicata ai post; il meccanismo che permetterà il funzionamento del semplicissimo motore di ricerca proposto in questa trattazione si basa su un una query SELECT che presenta qualche differenza rispetto a quelle analizzate in precedenza.
Si immagini per esempio di voler ricercare il termine "data" all'interno del contenuto dei post:
- la chiave verrà passata all'applicazione per la ricerca sotto forma di parametro di input inviato tramite form;
- l'applicazione effettuerà un controllo sulla validità del parametro di input e lo utilizzerà come valore da associare ad una variabile ($key nell'esempio);
- a questo punto verrà effettuata una query
SELECT
sulla tabella dei post (SELECT * FROM post
); - la query verrà effettuata confrontando la parola ricercata con il contenuto dei record relativi ai titoli e al testo dei post (
WHERE (titolo_post LIKE '%" . $key . "%') OR (testo_post LIKE '%" . $key . "%'
) ; - sarà possibile ottenere un risultato valido non soltanto se la chiave sarà rilevata all'interno dei titoli e dei testi ma anche se verrà trovata in uno solo di questi termini di confronto, ciò è possibile grazie all'utilizzo dell'operatore OR al posto di AND, il primo infatti, a differenza del secondo, restituisce TRUE anche se soltanto uno degli argomenti di un confronto risulta vero;
- i risultati della query verranno ordinati in senso decrescente sulla base dei valori contenuti nel campo data_post (
ORDER BY data_post
).
Di seguito viene proposto il codice necessario per il motore di ricerca:
<html> <head> <title>MioBlog</title> </head> <body> <h1>Motore di ricerca</h1> <?php // inclusione del file di classe include "funzioni_mysql.php"; // istanza della classe $data = new MysqlClass(); // chiamata alla funzione di connessione $data->connetti(); ?> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"> <input type="text" name="key" value="" /> <input type="submit" value="cerca" class="submit" /> </form> <?php if(isset($_POST['key'])&&($_POST['key']!="")&&(preg_match("/^[a-z0-9]+$/i", $_POST['key']))) { $key = $_POST['key']; $sql_cerca = $data->query("SELECT * FROM post WHERE (titolo_post LIKE '%" . $key . "%') OR (testo_post LIKE '%" . $key . "%') ORDER BY data_post"); $trovati = mysql_num_rows($sql_cerca); if($trovati > 0) { echo "<p>Trovate $trovati voci per il termine <b>".stripslashes($key)."</b></p>n"; while($cerca_obj = $data->estrai($sql_cerca)) { $id_post = $cerca_obj->id_post; $titolo_post = stripslashes($cerca_obj->titolo_post); $testo_post = stripslashes($cerca_obj->testo_post); $autore_post = stripslashes($cerca_obj->autore_post); $data_post = $cerca_obj->data_post; // visualizzazione dei dati echo "<h2>".$titolo_post."</h2>n"; echo "Autore <b>". $autore_post . "</b>n"; echo "<br />n"; echo "Pubblicato il <b>" . $data->format_data($data_post) . "</b>n"; echo "<br />n"; // link al testo completo del post $leggi_tutto = "<br /><a href="post.php?id_post=$id_post">Articolo completo</a>n"; // anteprima del testo echo "<p>".$data->preview($testo_post, 50, $leggi_tutto)."</p>n"; } }else{ // notifica in caso di mancanza di risultati echo "Al momento non sono stati pubblicati post che contengano questo termine."; } } // disconnessione $data->disconnetti(); ?>
LIKE è un operatore di confronto che permette di effettuare una comparazione tra campi simili anche se non uguali;
I due simboli percentuali (%
), vengono utilizzati dal DBMS per rilevare se prima e dopo il termine ricercato vi siano altre parole; se invece di LIKE si fosse utilizzato l'operatore di identità (ad esempio: WHERE "titolo_post =' . $key . ' OR testo_post =' . $key . '
) l'istruzione avrebbe cercato soltanto i titoli o i testi contenenti esclusivamente la chiave inviata in input.
Si noti come la chiave di ricerca, prima di partecipare alla query, sia stata validata tramite un'espressione regolare (preg_match("/^[a-z0-9]+$/i", $_POST['key']")
), questo perché per ragioni di sicurezza nella parola ricercata non devono essere presenti caratteri speciali.