Rispondi 
 
Valutazione discussione:
  • 0 voti - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
04-05-2008, 21:33
Messaggio: #1
Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
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...
Trova tutti i messaggi di questo utente
Cita questo messaggio nella tua risposta
05-05-2008, 09:18
Messaggio: #2
RE: Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
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!
Visita il sito web di questo utente Trova tutti i messaggi di questo utente
Cita questo messaggio nella tua risposta
05-05-2008, 19:23 (Questo messaggio è stato modificato l'ultima volta il: 05-05-2008 22:43 da Damiano.)
Messaggio: #3
RE: Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
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...
Trova tutti i messaggi di questo utente
Cita questo messaggio nella tua risposta
09-05-2008, 09:25
Messaggio: #4
RE: Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
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!
Visita il sito web di questo utente Trova tutti i messaggi di questo utente
Cita questo messaggio nella tua risposta
12-05-2008, 22:25
Messaggio: #5
RE: Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
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...
Trova tutti i messaggi di questo utente
Cita questo messaggio nella tua risposta
13-05-2008, 10:37
Messaggio: #6
RE: Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
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!
Visita il sito web di questo utente Trova tutti i messaggi di questo utente
Cita questo messaggio nella tua risposta
13-05-2008, 18:53
Messaggio: #7
RE: Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
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...
Trova tutti i messaggi di questo utente
Cita questo messaggio nella tua risposta
16-05-2008, 11:48
Messaggio: #8
RE: Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
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!
Visita il sito web di questo utente Trova tutti i messaggi di questo utente
Cita questo messaggio nella tua risposta
16-05-2008, 19:17
Messaggio: #9
RE: Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
Ehm... aspetta... quel "ordine" a che campo ti riferisci?
Trova tutti i messaggi di questo utente
Cita questo messaggio nella tua risposta
17-05-2008, 10:37
Messaggio: #10
RE: Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
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!
Visita il sito web di questo utente Trova tutti i messaggi di questo utente
Cita questo messaggio nella tua risposta
17-05-2008, 17:16
Messaggio: #11
RE: Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
Ehm... non ho capito bene... cioè io devo creare un'altro campo nella tabella... e che ci devo mettere dentro?



Ciao
Trova tutti i messaggi di questo utente
Cita questo messaggio nella tua risposta
17-05-2008, 17:17
Messaggio: #12
RE: Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
Non devi creare un altro campo, l'IF crea un campo virtuale che non esiste.

Mattia!
Visita il sito web di questo utente Trova tutti i messaggi di questo utente
Cita questo messaggio nella tua risposta
17-05-2008, 17:40
Messaggio: #13
RE: Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
Ok ho capito, userò la query che mi hai dato, però oltre al campo titolo, come aggiungo gli altri due campi?


Grazie
Ciao
Trova tutti i messaggi di questo utente
Cita questo messaggio nella tua risposta
17-05-2008, 17:43
Messaggio: #14
RE: Impostare eregi_replace() per ogni parola cercata in una pagina di ricerca
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!
Visita il sito web di questo utente Trova tutti i messaggi di questo utente
Cita questo messaggio nella tua risposta
Rispondi 


Vai al forum:


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

Contattaci | Matriz | Torna all'inizio della pagina | Torna al contenuto | Modalità archivio | RSS Syndication