Visualizzazione risultati 1 fino 27 di 27

Discussione: Estrazione righe dal database dove nei campi c'è almeno una parola specifica

  1. #1
    Guest

    Predefinito Estrazione righe dal database dove nei campi c'è almeno una parola specifica

    Ciao a tutti,

    ho cercato con le parole chiave "estrazione dati simili database" ma mi dice "Nessuna corrispondenza".

    Il mio fatto è estrarre dati dal database dove c'è una stringa predefinita.

    Esempio, nel database ci sono queste righe:

    Codice:
    Campo nome              Campo descrizione            Campo link
    
    Sito                    Il sito dei siti             www.sito.net
    Io voglio che con una determinata query si estraggono le righe dove in almeno un campo ci sia la parola "Sito".

    Quindi mi deve dare la riga di esempio che ho scritto poco sopra.

    Coma faccio a fare la query? Cioè che devo mettere al WHERE della query?


    Grazie,
    Ciao...

  2. #2
    Guest

    Predefinito

    Potresti utilizzare l'operatore like...

    Ciao

  3. #3
    Guest

    Predefinito

    per l'esattezza " LIKE '%sito%' ", ripetendo ciò 3 volte per tutti e 3 i campi, con l'operatore OR
    Ultima modifica di Zorinik : 01-05-2008 alle ore 22.14.28

  4. #4
    Guest

    Predefinito

    Mi fate un esempio di una query sql che faccia questo?


    Grazie,
    Ciao

  5. #5
    Guest

    Predefinito

    SELECT * FROM tabella WHERE campo1 LIKE '%parola%' OR campo2 LIKE '%parola%'

    Per la cronaca, esiste anche la guida di riferimento ufficiale, on-line. Un po' di buona volontà e spirito d'iniziativa.


    Ciao!

  6. #6
    Guest

    Predefinito

    Aspetta, della query non ho capito una cosa, la parola va tra % e %?

    Poi, in un solo LIKE ci possono essere più parole?


    Grazie,
    Ciao...

  7. #7
    Guest

    Predefinito

    Citazione Originalmente inviato da heidi52
    la parola va tra % e %?
    Citazione Originalmente inviato da debug
    campo1 LIKE '%parola%'
    Citazione Originalmente inviato da heidi52
    Poi, in un solo LIKE ci possono essere più parole?
    Citazione Originalmente inviato da debug
    Per la cronaca, esiste anche la guida di riferimento ufficiale, on-line. Un po' di buona volontà e spirito d'iniziativa.
    http://dev.mysql.com/doc/refman/4.1/en/


    Ciao!

  8. #8
    Guest

    Predefinito

    Ho letto ma non ho capito una cosa come faccio a fare un auto aggiunta di OR LIKE quante sono le parole nella stringa?

    Cioè se metto una parola la query dev'essere questa:

    Codice PHP:
    select * from tabella where campo1 like '%parola1%' or campo2 like '%parola1%' or campo3 like '%parola1%'

    E se metto due parole la query dev'essere questa:

    Codice PHP:
    select * from tabella where campo1 like '%parola1%' or campo2 like '%parola1%' or campo3 like '%parola1%' or campo1 like '%parola2%' or campo2 like '%parola2%' or campo3 like '%parola2%'

    Come faccio a farlo in automatico?


    Grazie,
    Ciao...

  9. #9
    Guest

    Predefinito

    Explodi la stringa divisa per spazi, ottenendo un array con tutte le parole cercate.
    Dopo di che, cicli questo array con un foreach, così:

    Codice PHP:
    foreach($array as $parola){
    $clausola.=" campo1 LIKE '%$parola%' OR ";
    }
    poi talgi via l'ultimo OR, altrimenti ritorna errore:

    Codice PHP:
    $clausola=substr($clausola,0,strlen($clausola)-3);
    e poi includi nella query:

    Codice PHP:
    "SELECT * FROM tabella WHERE $clausola "

    Ciao!

  10. #10
    Guest

    Predefinito

    Allora ho visto l'esempio che mi hai fatto e dato che i campi sono 3 ho fatto quest'aggiunta:

    Codice PHP:
    foreach($array as $parola){
    $clausola . = " campo1 LIKE '%".$parola."%' OR campo2 LIKE '%".$parola."%' OR campo3 LIKE '%".$parola."%' OR ";
    }
    $clausola = substr($clausola,0,strlen($clausola)-3);

    E non ho capito queste cose:

    - che devo assegnare ad $array?
    - il 3 che hai messo nella funzione substr() significa di togliere gli ultimi 3 caratteri da $clausola?
    - le posizioni delle veriabili sono come li ho messi mo qui?


    Grazie,
    Ciao...
    Ultima modifica di heidi52 : 02-05-2008 alle ore 13.36.47

  11. #11
    Guest

    Predefinito

    - $array è la variabile risultante da: explode(" ",$stringa);

    - sì

    - è uguale


    Ciao!

  12. #12
    Guest

    Predefinito

    Ok debug,

    però se io a quel $stringa assegno $_GET['parola'], e ovviamente nel get gli spazi sono trasformati in +, php riconosce quei più come spazi o come normali più?


    Grazie,
    Ciao...

  13. #13
    Guest

    Predefinito

    Prova no?


    Ciao!

  14. #14
    Guest

    Predefinito

    Citazione Originalmente inviato da heidi52 Visualizza messaggio
    Ok debug,

    però se io a quel $stringa assegno $_GET['parola'], e ovviamente nel get gli spazi sono trasformati in +, php riconosce quei più come spazi o come normali più?


    Grazie,
    Ciao...
    http://it.php.net/urldecode

  15. #15
    Guest

    Predefinito

    Citazione Originalmente inviato da debug Visualizza messaggio
    Prova no?


    Ciao!
    Allora, ho provato a fare una pagina search.php con questo codice dentro:

    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 tutto mi dà bene, funziona con il più al $_GET['search'].

    Ora quello che vorrei fare è evidenziare con il tag <b> le parole cercate con il $_GET['search']. Come faccio?

    Poi, un'altra cosa che vorrei fare, è limitare il numero dei risultati per pagina a un certo numero (esempio: 20) e mostrare quante pagine ci sono nei risultati. Come faccio?


    Grazie,
    Ciao...
    Ultima modifica di heidi52 : 02-05-2008 alle ore 15.05.27

  16. #16
    Guest

    Predefinito

    1) devi usare le espressioni regolari. Fai qualche ricerca (e leggi la guida di riferimento)

    2) devi usare la paginazione. Fai qualche ricerca (e leggi la guida di riferimento)


    Ciao!

  17. #17
    Guest

    Predefinito

    Almeno mi dici le funzioni di php che devo usare?


    Grazie

  18. #18
    Guest

    Predefinito

    Non ce ne sono di particolari, uniche.
    Per le espressioni regolari puoi usare ereg_replace o preg_replace.
    Per la paginazione, devi usare una moltitudine di funzioni.

    Ecco perchè ti ho invitato a fare qualche ricerca.


    Ciao!

  19. #19
    Guest

    Predefinito

    Citazione Originalmente inviato da debug Visualizza messaggio
    Non ce ne sono di particolari, uniche.
    Per le espressioni regolari puoi usare ereg_replace o preg_replace.
    Ecco bravo, mi hai ricordato, userò la funzione eregi_replace(), però non so come utilizzarla solo nelle parole cercate, come faccio?

    Grazie

  20. #20
    Guest

    Predefinito

    Cioè tu vuoi evidenziare con il grassetto tutte le parole cercate? E se cerchi "auto" e nei risultati sta scritto "pubbliauto" vuoi che si grassetti solo "auto" o tutta la parola "pubbliauto"?

  21. #21
    Guest

    Predefinito

    Beh, secondo il tuo esempio voglio evidenziare solo la parola "auto", cioè solo le parole immesse nel $_GET['search'], che possono essere più di una, e ho pensato a eregi_replace(), però non so come usarla dato che le parole possono essere più di una e trovarsi a caso nei dati estratti dal database.

    Qualcuno mi può dire come fare questa cosa che molti motori di ricerca fanno?


    Grazie,
    Ciao...
    Ultima modifica di heidi52 : 04-05-2008 alle ore 21.37.43

  22. #22
    Guest

    Predefinito

    nel css giochi con una cosa simile:

    Codice:
    em{font-weight:800;  background-color:yellow;}
    per il risultato potresti prendere spundo da questo :

    Codice PHP:
    $risultato = eregi_replace($stringa, "<em>$parolacercata</em>", $risultato);

  23. #23
    Guest

    Predefinito

    Ma funziona solo se le parole sono trovate nello stesso ordine in cuile scrivi, esempio se nel mio database c'è un sito con una descrizione:

    Visualizzare le immagini
    e cerchi "visualizzare le immagini", nel risultato te lo dà in grassetto, ma se scrivi "immagini visualizzare le" non me lo dà, ma io voglio che ogni parola singola messa nel $_GET['search'] venga racchiusa tra i tag <b> e </b>, anche se da sola o separate, puù o meno come fa google, capito?


    Come posso fare?


    Grazie,
    Ciao...

  24. #24
    Guest

    Predefinito

    Codice PHP:
    $search = $_GET['search'];

    $keywords = split(" ",$search);

    for (
    $i=0; $i<count($keywords ); $i++) {

    $replace = '<b>'.$keywords[$i].'</b>';

    $result = eregi_replace($keywords[$i], $replace, $result);

    };
    da provare

  25. #25
    Guest

    Predefinito

    Allora aspetta... questo che mi hai dato tu sommato a questo come verrebbe in totale? (scusami l'ignoranza)

    Questo è il mio:

    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)) {

    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 dove devo mettere il tuo? E poi come? (scusami l'ignoranza)

    Ciao...


    EDIT: Ho assemblato il mio e tuo 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...
    Ultima modifica di heidi52 : 05-05-2008 alle ore 21.02.18 Motivo: Provato

  26. #26
    Guest

    Predefinito

    nella query di ricerca aggiungi :

    ORDER BY parolacercata ASC

    oppure

    ORDER BY parolacercata DESC

    se ho capito cosa vuoi.

  27. #27
    Guest

    Predefinito

    Si hai capito, ma siccome le parola possono essere pià di una e sono state explode(), fatte in array, come faccio?





    Grazie,
    Ciao...

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •