Visualizzazione dei risultati da 1 a 10 su 10

Discussione: explode in una query

  1. #1

    explode in una query

    Salve a tutti,
    devo effettuare una ricerca in un database tramite una frase scritta in un input di testo, per fare in modo che ogni singola parola della frase venga cercata, credo che dovrei utilizzare explode per dividere tutte le parole all'interno della stringa, ma non mi è chiaro come impostare la query...
    C'è qualcuno che potrebbe spiegarmi come fare? Magari facendo qualche esempio..

    Spedisco la stinga tramite GET
    codice:
    <?php
    $stringa= $_GET['stringa']; //la salvo
    $stringa= explode(" ",$stringa); //esplodo... qua, essendo GET, non mi è chiaro se mettere " " o "+"
    //in ogni caso ho un array che contiene N parole
    $query= "SELECT * FROM articolo WHERE titolo LIKE 'COSA?' ";
    ?>
    Come faccio a sapere quanti slot contiene il mio array? E come cercare tutte le parole contemporaneamente?

  2. #2
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,133
    Ma il like cosi ("SELECT * FROM articolo WHERE titolo LIKE '%$stringa%'") dovrebbe fare questo!
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  3. #3
    Ciao, in questo modo, utilizzando l'explode, non ottengo mai un risultato. Se togliessi l'explode sì, funziona, ma non cerca la parole contenute nella frase singolarmente.
    In poche parole quello che serve a me è: nel database ho 2 articoli, uno chiamato "prova ecc", l'altro chiamato "come ecc"
    Nel campo di ricerca scrivo "prova come" e devono essere stampati entrambi i risultati...

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Il risultato che vuoi ottenere qual è?
    Deve trovarti gli articoli i cui titoli hanno esattamente quella parte di stringa? Quelli che hanno almeno una di quelle parole? Quelli che hanno tutte quelle parole anche non in ordine?

    Nel primo caso la soluzione è quella che ti ha già dato cavicchiandrea, altrimenti si deve elaborare l'input.
    In alternativa guardati come funziona la ricerca fulltext su MySQL e chiedi aiuto nella sezione database in caso avessi problemi con questa, perché dovrai passargli l'intera stringa, quindi non ci sarà alcuna manipolazione con PHP.

  5. #5
    Sì, trovare quello con almeno una parola di quelle, di conseguenza anche l'articolo che le contiene tutte e 2.. Ho comunque fatto un esempio sopra.

    PS:
    In realtà una mezza soluzione ce l'ho, nel senso che dovrei fare questo:
    supponendo che scrivo nel campo di ricerca "prova come"


    codice:
    $str_1=explode(" ",$string);
    $query="SELECT * FROM guida WHERE titolo LIKE '%$str_1[0]%' OR titolo LIKE '%$str_1[1]%' ORDER BY data DESC LIMIT ".$_GET['lim1'].",5";

    I questo modo ottengo quello che voglio, ma ovviamente è poco dinamico, perché non è detto che l'utente inserisca una frase di 2 parole, potrebbe inserirne 3,4,5,..N.
    Quindi mi serve sapere da quante parole è composta la frase, e tramite uno ciclo, aggiungere alla query "OR titolo LIKE '%str_1[$i]%' "

    Si può mettere un foreach dentro la query?

    So che così non funziona, ma è piu o meno la logica che dovrei usare

    codice:
    $query="SELECT * FROM guida WHERE ".foreach($str_1 as $parola){ echo "titolo LIKE '%$parola%'"; }
    Ultima modifica di frenkytribe; 29-10-2013 a 11:53

  6. #6
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  7. #7
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Codice PHP:
    $input explode(' ' $_POST['cerca_titolo']); //o $_GET, dipende come invii i dati del form, ma io usaerei post

    $like " ";

    foreach (
    $input as $parola)
    {
        
    $like .= "titolo LIKE '%$parola%' OR ";
    }

    $like substr($like0, -3); //elimina l'ultimo OR che non ha niente dopo e genererebbe errore

    $query="SELECT * FROM guida WHERE $like  ORDER BY data DESC LIMIT ".$_GET['lim1'].",5"

  8. #8
    Utente di HTML.it L'avatar di Angarat
    Registrato dal
    Nov 2003
    Messaggi
    157
    Ciao, come giustamente dice Alhazred anche secondo me devi usare una ricerca FULLTEXT, quindi per prima cosa devi modiifcare il campo di conseguenza.

    poi per la parte php/mysql ecco un esempio che avevo fatto tempo fa:

    Codice PHP:
    // questa mi serve per filtrare le stringe che siano almeno di 4 caratteri
    function filtro($val){
            if(
    strlen(trim($val))<4){
                return 
    false;
            } else {
                return 
    true;
            }
        }

    $expression "*".implode("* *", (array_unique(array_filter(explode(" "$_get['expression']), "filtro"))))."*";  

    // explode mi serve per far diventare la mia stringa un array
    // array_filter mi serve per eliminare gli elementi che contengono stringhe minori di 4 caratteri
    // array_unique mi serve per eliminare gli elementi doppi
    // implode mi serve per ricostruire la stringa dall' array, gli asterischi mi servono per la tipologia di ricerca che faccio
            
    $recDati mysql_query("SELECT *, MATCH( nome, testo) AGAINST('".$expression."' IN BOOLEAN MODE) AS attinenza FROM contenuti WHERE MATCH(nome, testo) AGAINST('".$expression."' IN BOOLEAN MODE) ORDER BY attinenza DESC LIMIT 0,20"); 

  9. #9
    Grazie mille a tutti per l'interessa mostrato, tuttavia la soluzione che ho applicato è quella descritta da Alzhared e funziona, era proprio quello di cui avevo bisogno.
    Avrei un altra domanda. Perché mi consigli di utilizzare POST e non GET? Cioè so che poi la stringa sarebbe visibile a tutti, ma in passato mi era stato consigliato di utilizzare questa aggiungendo un mysql_real_escape_string

  10. #10
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Perché alcuni caratteri (per esempio &) e gli spazi tra le parole del testo da cercare potrebbero generare problemi, inoltre GET ha una lunghezza limitata, se uno dovesse scrivere una stringa molto lunga, benché difficile che accada, potrebbe generare un errore.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.