Messaggi: 24
Discussioni: 4
Registrato: Apr 2008
Reputazione:
0
Ciao a tutti,
dunque ho "creato" un motore di ricerca con i dati memorizzati nel database.
Questo è il codice della pagina dei risultati di ricerca:
Codice PHP: <?php $db = mysql_connect("host", "username", "password") or die(mysql_error()); $search = explode(" ", $_GET['search']); mysql_select_db("dbname", $db) or die(mysql_error());
foreach($search as $parole) { $clausola = " titolo LIKE '%".$parole."%' OR descrizione LIKE '%".$parole."%' OR url LIKE '%".$parole."%' OR";
} $clausola .= substr($clausola,0,strlen($clausola)-3); $seque = mysql_query("SELECT url, titolo, descrizione FROM ricerca WHERE ".$clausola, $db);
echo "<html>\n<head>\n<title>";
if($search == "") { echo ""; } else { echo $search." - "; }
echo "La ricerca tutto free</title>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"index.css\">\n</head>\n<body>\n";
while($ris = mysql_fetch_assoc($seque)) {
echo "Titolo: ".$ris['titolo']."<br>Descrizione: ".$ris['descrizione']."<br>Url: ".$ris['url']."<br>";
} echo "\n</body>\n</html>"; mysql_close($db) or die(mysql_error()); ?>
E vorrei che le parole cercate appaiono in grassetto nei risultati con la funzione eregi_replace(), come faccio?
Grazie,
Ciao...
Messaggi: 1.323
Discussioni: 171
Registrato: Nov 2006
Reputazione:
2
In questo caso non è necessario utilizzare la funzione eregi_replace, ma puoi utilizzare la più veloce str_replace.
Puoi modificare questo pezzo di codice:
Codice PHP: while($ris = mysql_fetch_assoc($seque)) {
echo "Titolo: ".$ris['titolo']."<br>Descrizione: ".$ris['descrizione']."<br>Url: ".$ris['url']."<br>";
}
In questo modo:
Codice PHP: while($ris = mysql_fetch_assoc($seque)){ foreach($search as $parole){ $ris['titolo'] = str_replace($parole,"<b>{$parole}</b>",$ris['titolo']); $ris['descrizione'] = str_replace($parole,"<b>{$parole}</b>",$ris['descrizione']); $ris['url'] = str_replace($parole,"<b>{$parole}</b>",$ris['url']); } echo "Titolo: ".$ris['titolo']."<br>Descrizione: ".$ris['descrizione']."<br>Url: ".$ris['url']."<br>"; }
Mattia!
Messaggi: 24
Discussioni: 4
Registrato: Apr 2008
Reputazione:
0
05/05/2008 18:23
(Questo messaggio è stato modificato l'ultima volta il: 05/05/2008 21:43 da Damiano.)
Questo che mi hai dato tu funziona solo sull'ultima parola cercata, ma io voglio su tutte, come faccio?
Grazie
EDIT: Ho risolto chiedendo su altervista, ho assemblato il codice così:
Codice PHP: <?php $db = mysql_connect("host", "username", "password") or die(mysql_error()); mysql_select_db("dbname", $db) or die(mysql_error());
$chiave = $_GET['query']; $pag = $_GET['pag']; // Numero pagina $rpp = $_GET['order']; // Risultati per pagina $search = explode(" ", $chiave);
$imin = $pag*$rpp-$rpp; // Risultati 1 - 30 a pagina 1
foreach($search as $parole) { $csql = "titolo LIKE '%".$parole."%' OR descrizione LIKE '%".$parole."%' OR url LIKE '%".$parole."%' OR "; } $csql .= substr($csql,0,strlen($csql)-4); $limit = " LIMIT ".$imin.", ".$rpp;
$seque = mysql_query("SELECT url, titolo, descrizione FROM ricerca WHERE ".$csql.$limit, $db); $totqu = mysql_query("SELECT url, titolo, descrizione FROM ricerca WHERE ".$csql, $db); $tot = mysql_num_rows($totqu); $in = $pag*$rpp-$rpp+1; // Risultati x - 30... da 3 x 20 fare 41
if($tot < $rpp) { $fi = $tot; } else { $fi = $pag*$rpp; } // Risultati 1 - x... da 3 x 20 fare 60
echo "<html>\n<head>\n<title>";
if($chiave == "") { echo ""; } else { echo $chiave." - "; }
echo "La ricerca tutto free</title>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"index.css\">\n</head>\n<body>\n<table width=\"100%\" height=\"100%\" border=\"0\">\n<tr>\n<td width=\"200\" height=\"91\" colspan=\"2\"><a href=\"".$_SERVER['REQUEST_URI']."\"><img width=\"200\" height=\"91\" alt=\"Cerca ".$chiave." - La ricerca tutto free\" border=\"0\" src=\"lsearch.gif\"></a></td>\n</tr>\n<tr>\n<td width=\"100%\" height=\"20\" align=\"right\" colspan=\"2\" class=\"seris\">Risultati <b>".$in."</b> - <b>".$fi."</b> di <b>".$tot."</b> per <b>$chiave</b></td>\n</tr>\n<tr>\n<td align=\"left\" width=\"100%\" valign=\"top\">\n<br>\n";
if($chiave == "") { echo "<span class=\"setit\">Nessuna parola immessa nella ricerca</span>"; } else {
while($ris = mysql_fetch_assoc($seque)) {
for ($i=0; $i<count($search); $i++) {
$ris['titolo'] = eregi_replace($search[$i], "<b>".$search[$i]."</b>", $ris['titolo']); $ris['descrizione'] = eregi_replace($search[$i], "<b>".$search[$i]."</b>", $ris['descrizione']); $ris['url'] = eregi_replace($search[$i], "<b>".$search[$i]."</b>", $ris['url']);
}
echo "<span class=\"setit\">".$ris['titolo']."</span>\n<br>\n<span class=\"sedes\">".$ris['descrizione']."</span>\n<br>\n<span class=\"seurl\">".$ris['url']."</span>\n<br>\n<br>\n";
}
}
echo "</td>\n<td valign=\"top\">\n<br><span class=\"setit\" style=\"font-weight: 700\">Pubblicità</span>\n<br><br><script type=\"text/javascript\" language=\"Javascript\" src=\"http://pub.oxado.com/insert_ad?pub=173089\"></script>\n</td>\n</tr>\n</table>\n</body>\n</html>";
mysql_close($db) or die(mysql_error()); ?>
E funziona come previsto. Solo che ora non mi soddisfa una cosa: se cerco "XXXX Forum" e c'è un campo diretto nel database con "XXXX Forum" non me lo visualizza per primo, ma invece io voglio che visualizzi i risultati in ordine di parole scritte. Come faccio?
Grazie,
Ciao...
Messaggi: 1.323
Discussioni: 171
Registrato: Nov 2006
Reputazione:
2
Ti conviene utilizzare il mio metodo che è più veloce (sia per quanto riguarda il ciclo che la sostituzione del testo) aggiungendo:
Prima di:
Codice PHP: foreach($search as $parole){
E utilizzando str_ireplace al posto di str_replace.
Per la seconda domanda si fa tutto più complicato perché dovresti modificare il modo in cui generi la query. Adesso devo lavorare, ti scrivo la soluzione più tardi.
Mattia!
Messaggi: 24
Discussioni: 4
Registrato: Apr 2008
Reputazione:
0
Niente, non funziona come mi hai detto tu, come se non faccio niente, i risultati vengono sempre visualizzati a caso.
Comunque per la funzione uso eregi_replace().
Come risolvo?
Grazie,
Ciao...
Messaggi: 1.323
Discussioni: 171
Registrato: Nov 2006
Reputazione:
2
Quella che ti ho scritto io era solo un'ottimizzazione del mio codice per farlo funzionare. Ti ricordo che la funzione che utilizzo io è molto più veloce di quella che vuoi utilizzare tu.
L'ordinamento non te lo avevo ancora suggerito perché non ho avuto tempo.
Mattia!
Messaggi: 24
Discussioni: 4
Registrato: Apr 2008
Reputazione:
0
Ma se devo usare str_ireplace() al posto di eregi_replace() a me mi va anche bene. ;)
Comunque io voglio risolvere il fatto dell'ordinamento, come faccio? :)
Grazie,
Ciao...
Messaggi: 1.323
Discussioni: 171
Registrato: Nov 2006
Reputazione:
2
Potresti utilizzare l'IF nella query SQL e ordinare il tutto per il valore che trovi.
Ti scrivo l'esempio della query che potrai applicare al tuo script:
Codice: SELECT url, titolo, descrizione, (IF(titolo='parola',1,2)) AS ordine
FROM ricerca
WHERE [TUTTI I TUOI VARI LIKE]
ORDER BY ordine
Mattia!
Messaggi: 24
Discussioni: 4
Registrato: Apr 2008
Reputazione:
0
Ehm... aspetta... quel "ordine" a che campo ti riferisci?
Messaggi: 1.323
Discussioni: 171
Registrato: Nov 2006
Reputazione:
2
E' il nuovo campo che creo grazie all'IF. Se il campo 'titolo' è uguale alla parola cercata, il nuovo campo creato avrà come valore 1, altrimenti avrà valore 2. In questo modo chi ha il titolo uguale alla parola cercata apparirà per primo perché ordinato tramite ORDER BY.
Mattia!
Messaggi: 24
Discussioni: 4
Registrato: Apr 2008
Reputazione:
0
Ehm... non ho capito bene... cioè io devo creare un'altro campo nella tabella... e che ci devo mettere dentro?
Ciao
Messaggi: 1.323
Discussioni: 171
Registrato: Nov 2006
Reputazione:
2
Non devi creare un altro campo, l'IF crea un campo virtuale che non esiste.
Mattia!
Messaggi: 24
Discussioni: 4
Registrato: Apr 2008
Reputazione:
0
Ok ho capito, userò la query che mi hai dato, però oltre al campo titolo, come aggiungo gli altri due campi?
Grazie
Ciao
Messaggi: 1.323
Discussioni: 171
Registrato: Nov 2006
Reputazione:
2
Puoi creare altri due IF però non credo che ti servano perché è molto difficile che uno ricerchi un indirizzo che conosce già (URL) o inserisci tutto quello che vuole leggere (descrizione).
Codice: SELECT url, titolo, descrizione, (IF(titolo='parola',1,2)) AS ordine1, (IF(url='parola',1,2)) AS ordine2, (IF(descrizione='parola',1,2)) AS ordine3
FROM ricerca
WHERE [TUTTI I TUOI VARI LIKE]
ORDER BY ordine1, ordine2,ordine3
Mattia!
|