back to top

Creare un motore di ricerca con PHP e MySQL

In questo tutorial, vedremo come creare un semplice motore di ricerca interno al tuo sito utilizzando PHP per effettuare ricerche all’interno di un database MySQL.

Nell’esempio che seguirร , simuleremo una ricerca tra gli articoli del nostro ipotetico sito web. La funzione del nostro motore di ricerca sarร  di consentire agli utenti di trovare velocemente i contenuti di loro interesse, cercando all’interno degli articoli pubblicati.

Struttura del database

Per iniziare, supponiamo di avere una tabella chiamata articoli, composta dai seguenti campi:

  • id (Integer 20, primary key, autoincrement)
  • titolo (Varchar 100)
  • descrizione (Longtext)

Il database MySQL sarร  chiamato mio_database e avrร  come credenziali username mia_username e password mia_password, e sarร  ospitato su localhost (ovviamente sono dati di prova che, in produzione, dovranno essere sostituiti con quelli effettivi).

Il modulo di ricerca in HTML

Per iniziare, creiamo un modulo di ricerca HTML che potremo includere in tutte le pagine del sito, utilizzando, ad esempio, le inclusioni lato server di PHP.

Ecco il codice HTML del nostro form di ricerca:

<form method="post" action="cerca.php">
<input type="text" name="testo" placeholder="Cerca...">
<input type="submit" value="Cerca">
</form>

Il file cerca.php

Il form invierร  i dati, utilizzando il metodo POST, al file cerca.php, il cui codice รจ mostrato di seguito:

<?php
// Connessione al database con MySQLi
$cn = new mysqli("localhost", "mia_username", "mia_password", "mio_database");

// Controllo della connessione
if ($cn->connect_error) {
    die("Connessione fallita: " . $cn->connect_error);
}

// Recupero del testo e sanitizzazione
$testo = isset($_POST["testo"]) ? $cn->real_escape_string(htmlspecialchars($_POST["testo"])) : '';
?>

<html>
<head>
    <title>Risultati della ricerca</title>
</head>
<body>
<p>
    <b>Risultati della ricerca per:</b>
    <?php
    if ($testo) {
        echo htmlspecialchars($testo);
    }
    ?>
</p>

<?php
if (!$testo) {
    echo "<p>&egrave; necessario specificare un criterio di ricerca.</p>";
} else {
    // Divisione del testo in parole chiave
    $arr_txt = explode(" ", $testo);
    $sql = "SELECT * FROM articoli WHERE ";

    // Creazione dinamica della query SQL
    for ($i = 0; $i < count($arr_txt); $i++) {
        if ($i > 0) {
            $sql .= " AND ";
        }
        $sql .= "(titolo LIKE '%" . $arr_txt[$i] . "%' OR descrizione LIKE '%" . $arr_txt[$i] . "%')";
    }
    $sql .= " ORDER BY titolo ASC";

    // Esecuzione della query
    $query = $cn->query($sql);
    $quanti = $query->num_rows;

    if ($quanti == 0) {
        echo "<p>Nessun risultato!</p>";
    } else {
        while($rs = $query->fetch_assoc()) {
            $id = $rs['id'];
            $titolo = $rs['titolo'];
            echo "<p><a href='leggi.php?id=$id'>$titolo</a></p>";
        }
    }
}
$cn->close();
?>
</body>
</html>

Lo script funziona in maniera molto semplice come segue:

  • Recuperiamo il testo da ricercare e ci connettiamo al database MySQL, assicurandoci di filtrare il testo con tutti i controlli del caso.
  • Verifichiamo che il testo non sia vuoto: se รจ vuoto, visualizziamo un messaggio di avviso; altrimenti, procediamo con la ricerca.
  • Dividiamo il testo in un array di parole chiave e creiamo dinamicamente la stringa SQL per interrogare il database.
  • Se ci sono risultati, li mostriamo a video, altrimenti visualizziamo un messaggio che avvisa che non ci sono record corrispondenti alla chiave di ricerca.

Considerazioni e miglioramenti

Il codice presentato รจ un buon punto di partenza, ma ci sono diversi miglioramenti che potrebbero essere implementati per ottimizzare il motore di ricerca interno.

Uno dei miglioramenti piรน semplici รจ l’eliminazione delleย cosiddette stop wordsย (parole comuni come “e”, “il”, “di”, ecc.) dai termini di ricerca al fine di rendere i risultati piรน pertinenti.

Inoltre, invece di una ricerca basata su semplici corrispondenze di stringhe, potresti considerare l’implementazione della ricercaย FULL TEXT di MySQL, che offre funzionalitร  di ricerca piรน avanzate come il ranking dei risultati in base alla rilevanza e la gestione delle parole chiave.

Altre tecniche avanzate includono l’uso di indici di ricerca, la normalizzazione dei dati per migliorare l’efficienza delle query, e persino l’integrazione con soluzioni esterne come Apache Solr o Elasticsearch per implementare soluzioni di ricerca professionali ed altamente efficienti.

Conclusioni

L’esempio proposto รจ volutamente semplice e introduttivo. In un contesto reale, รจ consigliabile implementare un sistema di ordinamento basato sul numero di match oppure utilizzare la ricerca FULL TEXT di MySQL per migliorare la precisione e l’efficacia del motore di ricerca.

Pubblicitร 
Claudio Garau
Claudio Garau
Web developer, programmatore, Database Administrator, Linux Admin, docente e copywriter specializzato in contenuti sulle tecnologie orientate a Web, mobile, Cybersecurity e Digital Marketing per sviluppatori, PA e imprese.

Leggi anche...

Correggere l’errore the uploaded file exceeds the upload_max_filesize directive in php.ini

L'errore the uploaded file exceeds the upload_max_filesize directive in...

Cannot modify header information – headers already sent: come risolvere l’errore PHP

L'errore di PHP cannot modify header information - headers...

Ricavare l’estensione di un file con PHP

Quando si lavora con i file in un'applicazione web,...

GD Library: creazione, manipolazione e ridimensionamento immagini con PHP

Le librerie GD (o GD Library), sono componenti fondamentali...

PHP: impostare il fuso orario italiano

Le tue pagine PHP non mostrano l’orario corretto? Probabilmente...
Pubblicitร