Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
#1
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...
Cita messaggio
#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!
Cita messaggio
#3
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&agrave;</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...
Cita messaggio
#4
Ti conviene utilizzare il mio metodo che è più veloce (sia per quanto riguarda il ciclo che la sostituzione del testo) aggiungendo:
Codice PHP:
reset($search); 

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!
Cita messaggio
#5
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...
Cita messaggio
#6
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!
Cita messaggio
#7
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...
Cita messaggio
#8
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!
Cita messaggio
#9
Ehm... aspetta... quel "ordine" a che campo ti riferisci?
Cita messaggio
#10
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!
Cita messaggio
#11
Ehm... non ho capito bene... cioè io devo creare un'altro campo nella tabella... e che ci devo mettere dentro?



Ciao
Cita messaggio
#12
Non devi creare un altro campo, l'IF crea un campo virtuale che non esiste.
Mattia!
Cita messaggio
#13
Ok ho capito, userò la query che mi hai dato, però oltre al campo titolo, come aggiungo gli altri due campi?


Grazie
Ciao
Cita messaggio
#14
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!
Cita messaggio


Vai al forum:


Utenti che stanno guardando questa discussione: 1 Ospite(i)