Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 55 di 56
  • livello intermedio
Indice lezioni

Un semplice motore di ricerca per il blog

Creazione di un motore di ricerca di base per cercare i post dei blog
Creazione di un motore di ricerca di base per cercare i post dei blog
Link copiato negli appunti

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.

Ti consigliamo anche