mercoledì 9 novembre 2011

PHP: Motore di ricerca interno


Dopo vari peregrinaggi per il web e studio di vari script sono riuscito a buttar giù qualcosa di funzionante, chiaramente molto migliorabile, l'esempio sottostante fa riferimento al DB del CMS Drupal, ma basta cambiare il nome del DB e delle tabelle da cui si prendono gli articoli, ed è applicabile a qualsiasi progetto Web.
Prima di tutto creiamo un file html (nel nostro caso motric.html) che include una form con un campo text ed un pulsante cerca:

Nella proprietà action della form inseriamo il nome del file php che vogliamo esegui la ricerca, nel nostro caso "risultato.php".
Quello che si presenterà all'utente sarà un box di ricerca dove poter inserire del testo da ricercare, il contenuto di questo box sarà inviato tramite il metodo POST alla pagina risultato.php riportata di seguito


Analizziamo ora il file risultato.php:
La prima riga importante è: include 'db1.php'; questo comando ci permettere di includere le istruzioni scritte in un altro file, nel nostro caso db1.php conterrà le operazioni di connessione al nostro database:

dicchiariamo le variabili :
$dbhost = 'TUO_IP';
$dbusername = 'USERNAME_DB';
$dbpasswd = 'PASSWORD_DB';
$database_name = 'NOME_DB';
ed effettuiamo la connessione mysql al db con mysql_pconnect:
$connection = mysql_pconnect("$dbhost","$dbusername","$dbpasswd")
or die ("Couldn't connect to server.");
infine selezioniamo il db su cui effettuare le operazioni:
$db = mysql_select_db("$database_name", $connection)
or die("Couldn't select database.");
Bene ora torniamo al file risultato.php, si vede subito che la seconda istruzione include nuovamente il file motric.html, questo per fare in modo che oltre a proporre il risultato della ricerca si dia la possibilità all'utente di effettuarne subito una nuova.
Quindi si procede nel controllare se l'utente ha inserito almeno una lettere nel box :

se non ha inserito nulla si richiede di specificare almeno un criterio altrimenti si inizia la ricerca del testo nel nostro DB:


Per prima cosa tramite la funzoine explode (che puo essere usata piu volte ricorsivamente per miglirarne l'efficacia) dividiamo il testo inserito tramite un demarcatore da noi scelto, in questo caso assumiamo che ogni parola sia semplicemente divisa da uno spazio. ed inseriamo in un array ($arr_txt) tutte le parole inserite nel box di ricerca. Non ci resta che effettuare una FOR per il numero di parole trovate ($i< count($arr_txt) ) e ricercare le parole una lla volta all'interno della tabella che ci interessa, nel nostro caso ricerchiamo all'interno della tabella del database di drupal in cui sono contenuti gli articoli e piu' specificatamente nei campi della tabella title e body. Infine memoriziamo in una variabile in quanti articoli è stata trovata quella parola $quanti = mysql_num_rows($sql);
Ora dobbiamo capire quanti risultati abbiamo ottenuto e vedere se parole diverse sono state trovate nello stesso articolo in modo da non printare a video più volte la stessa ricorrenza:

Prima di tutto controlliamo che gli articoli non siano 0, poi con una FOR scorriamo le ricorrenze trovate $controllodati = mysql_fetch_array($sql); e ne salviamo due variabili :
$nodo=$controllodati['nid'] ;
$titolo= $controllodati['title'] ;
il nodo di DRUPAL (nel nostro caso) ed il titolo dell'articolo. Al termine effettuiamo un controllo tra l'ultimo dato estratto ed un array che popoleremo con tutti i dati man mano che la FOR avanza:
if (!in_array($titolo, $escludidoppi)) {
$escludidoppi[]=$controllodati['title'] ;
Questo significa che il primo dato sarà printato sicuramente in quanto $escludidoppi[] è vuoto e poi inserito proprio in $escludidoppi[] cosi che i dati successivi eviteranno di essere riprintati se già presenti nell'array.
Con questo è tutto non ci resta che creare un link per ogni articolo trovato (in questo caso con la sintassi di DRUPAL), se invece non ci sono articoli printiamo un messaggio di "Nessun risultato trovato".
Il risultato puo essere visto cliccando qui.