Un semplice motore di ricerca per il blog



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.

Ultimi articoli PHP

Sessioni PHP: cosa sono, come si usano

Dalla configurazione di PHP, alla gestione delle sessioni in un...

Continuous Integration: automatizziamo i client con Phing

Continuous Integration: automatizziamo i client con Phing. Esempi...

Archiviazione delle applicazioni PHP con Phar

Come incorporare intere applicazioni PHP all'interno di un singolo...

I traits in PHP 5.4

Cosa sono, a cosa servono e come si unsano i traits, la novità per...

PHP 5.4: il web server integrato

Impara ad usare il web server integrato nella versione 5.4 di PHP:...

Altri articoli

Guide PHP

Guida Yii Framework

Come creare applicazioni Web in modo semplice e veloce con il...

Guida Applicazioni Facebook con PHP

Come realizzare un'applicazione per Facebook. Dalle basi della...

Guida PHP con Windows e IIS

Installare ambienti per lo sviluppo e la produzione di applicazioni...

Altre guide

Newsletter @PHP

Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso PHP per Webmaster

11 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

25 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

05 Giugno 2012 a Roma
Disponibilità: 7 Posti