Salve, seguendo la guida di html.it sto cercando di costruire un motore di ricerca per il mio sito. Seguendo passo passo la guida però non riesco a farlo funzionare! Quello che ho creato sono 2 pagine: 1 col form e 1 con i risultati. Credo che il problema sia che la variabile "chiave" non passi ma non so come fare.
Pagina search.php
<?php
//Finalmente in questa lezione sfruttiamo fino in fondo le potenzialità del database. Inseriremo un motore di ricerca che, in base alle parole
// chiave inserite dall'utente, cercherà gli articoli che le contengono. Iniziamo come sempre craendo la pagina search.php con l'intestazione:
include("top_foot.inc.php");
include("config.inc.php");
top();
// Quindi dovremo creare un form che contenga un campo di testo per immettere le parole da cercare:
?>
<form method=post action=result.php><input type=text name=chiave><input type=submit value=cerca>
</form>
<?
//e infine chiudiamo la pagina:
foot();
?>
Pagina result.php
<?php
// A questo punto possiamo venire alla pagina result.php che avrà il compito di elaborare la stringa inserita dall'utente:
include("top_foot.inc.php");
include("config.inc.php");
top();
$db = mysql_connect($db_host, $db_user, $db_password);
if ($db == FALSE)
die ("Errore nella connessione. Verificare i parametri nel file config.inc.php");
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database. Verificare i parametri nel file config.inc.php");
// Per prima cosa dovremo suddividere la stringa nelle chiavi da ricercare. Noi supporremo che le diverse chiavi siano suddivise da virgole.
// Quindi le inseriremo in un array di nome $keys:
$keys = explode (",", $chiave);
// Tramite questa operazione abbiamo spezzato la stringa $chiave in corrispondenza di ogni virgola e inserito i frammenti
// all'interno dell'array $keys.
// A questo punto possiamo creare la query. In questo caso non possiamo utilizzare una semplice uguaglianza, ma dobbiamo specificare che
// le celle devono solo contenere le parole. Vedremo quindi un nuovo metodo:
$query = "";
reset ($keys);
while (list(,$parola) = each ($keys)) {
$parola = trim($parola);
if ($parola != "")
$query .= "titolo LIKE '%$parola%' OR testo LIKE '%$parola%' OR autore LIKE '%$parola%' OR ";
}
$query .= "0";
// Prima di tutto abbiamo definito $query una stringa vuota. In seguito attraverso la seconda e la terza riga abbiamo indicato che vogliamo
// manovrare un solo elemento dell'array alla volta. Avremmo potuto usare foreach e semplificare il codice, ma questa funzione esiste solo
// a partire dalla versione 4 di Php.
// Ogni elemento dell'array sarà quindi disponibile uno alla volta con il nome $parola. Da questa eliminiamo gli spazi a sinistra e a destra
// tramite trim e, se la parola non è vuota, creiamo la query.
// Tutto quello che vedete tra le virgolette, verrà aggiunto in fondo alla query già esistente.
// Prendiamo per il momento in considerazione il caso in cui l'utente abbia immesso due sole parole chiave e vediamo quali sono le operazioni
// che vengono compiute passo passo. Consideriamo per esempio che le parole inserite siano "articolo" e "freephp":
// - Prima di tutto viene definita la query vuota: $query = "";
// - Con le prime due righe si ottiene la prima parola ("articolo") all'interno di $parola
// - Eliminiamo gli spazi alle estremità di "articolo" che in questo caso resta tale e quale
// - Verifichiamo che $parola non sia vuota.
// - Modifichiamo la stringa $query che diventerà "titolo LIKE '%articolo%' OR testo LIKE '%articolo%' OR autore LIKE '%articolo%' OR "
// - Passiamo alla parola successiva, quindi $parola assume il valore "freephp".
// - Eliminiamo gli spazi e verichiamo che non sia vuota
// - Aggiungiamo la stringa in fondo alla query che diventa: "titolo LIKE '%articolo%' OR testo LIKE '%articolo%' OR autore LIKE '%articolo%'
// OR titolo LIKE '%freephp%' OR testo LIKE '%freephp%' OR autore LIKE '%freephp%' OR "
// - Le parole chiave sono finite, ma la stringa finisce ancora con un OR. Per annullare il suo effetto aggiungiamo in fondo uno 0. Avremmo
// potuto eliminare l'OR, ma avremmo dovuto fare una serie di verifiche. Risulta invece molto più semplice e immediato usare questa scorciatoia
// per "neutralizzare" il suo effetto senza eliminarlo.
// Fatto tutto questo possiamo inserire la prima parte della stringa:
$query = "SELECT id, titolo, data FROM news WHERE " . $query;
// Quindi la stringa diventerà:
// "SELECT id, titolo, data FROM news WHERE titolo LIKE '%articolo%' OR ... OR autore LIKE '%freephp%' OR 0"
// Come vedete LIKE ha sostituito l'operatore di uguaglianza che abbiamo usato in tutte le altre query. Prendiamo in considerazione un singolo
// blocco LIKE: titolo LIKE '%articolo%'
// LIKE indica che titolo deve contenere articolo e non che deve essere uguale a titolo.
// % all'inizio indica che prima di "articolo" possono comparire altri caratteri. Quindi "articolo" non deve necesariamente trovarsi
// all'inizio della cella. Stessa cosa indica il simbolo % alla fine. Quindi inserendo questi due simboli abbiamo indicato di verificare
// se la cella titolo contiene la parola "articolo" in una qualunque posizione: all'inizio, al centro o alla fine.
// Una volta definita la query possiamo inviarla a MySQL ed elencare i risultati:
$result = mysql_query($query, $db);
while ($row = mysql_fetch_array($result)){
echo "<a href=\"view.php?id=$row[id]\">" . date("j/n/y", $row[data]) . " - $row[titolo]</a>
";
}
// Infine, come sempre, chiudiamo la pagina:
foot()
?>
Mi sapete aiutare?![]()