• User

    Semplice Motore di Ricerca su database SQL

    Ciao a tutti.
    Volevo chidere se qulacuno mi sa consigliare una guida o un tutorial per creare un semplice script in PHP motore di ricerca per parole chiave da aggiungere al mio sito che è collegato ad un database con una tabella articoli.
    La ricerca volevo farla solo sulla tabella articoli; in pratica un semplice form dove io inserisco una parola da cercare nella tabella articoli e se c'è corrispondenza mi stampa l'articolo o gli articoli interessati in una tabella come risultato.
    Grazie mille per i consigli


  • User

    In pratica ho scritto questo form cerca.php:

    <form action="elabora_ricerca.php" method="get">
    <input type="text" name="parola"><br>
    <input type="submit" value="Search">
    </form>
    
    

    L'altro file che ho chiamato elabora_ricerca.php dovrebbe prendere la parola immessa sul campo text del form con name="parola" ed effettuare una ricerca sulla tabella articoli.

    Ho provato a scrivere una query direttamente ma SQL mi ritorna che trova zero righe:

    $query = "SELECT * FROM articoli WHERE MATCH(art_articolo, art_titolo, art_articolo) AGAINST ('montagna')";
    

    La query contiene la parola "montagna" che è presente nell'articolo in tabella ma mi non restituisce risultati. Qualche consiglio sulla query?
    La tabella l'ho modificata aggiungendo l'attributo FULLTEXT all'articolo.


  • Super User

    Dopo aver creato gli indici fulltext devi eseguire un repair table (con phpmyadmin è facile da fare)


  • User

    grazie per il consiglio. Ho fatto come hai detto ma mi restituisce sempre lo stesso risultato:
    ***MySQL ha restituito un insieme vuoto (i.e. zero righe). ***:x
    Non capisco il motivo. La sintassi della query è giusta perchè altrimenti mi darebbe errore. Ma non riesce a leggere dentro al testo articolo e dare il risultato.


  • User

    Allora ho scritto questo codice nel form:

    <form action="elabora_ricerca.php" method="post">
    <input type="text" name="keyword">
    <input type="submit" value="Search!">
    </form>
    ```.
    
    Poi nella pagina elabora_ricerca ho scritto quest'altro codice:
    

    <?php
    $keyword = $_POST['keyword'];

    $sql = "SELECT art_id, art_titolo FROM articoli WHERE MATCH (art_autore, art_titolo) AGAINST ('$keyword')";
    $query = mysql_query($sql) or die (mysql_error());

    if(mysql_num_rows($query) > 0){

    while ($riga = mysql_fetch_array($query)) {

    $autore = $row['art_autore'];
    $titolo = $row['art_titolo'];

    echo $autore;
    echo $titolo;
    

    }
    } else {
    echo "Errore";
    }
    ?>

    
    Però non ho ottenuto i risultati sperati. :x Cioè non mi compare niente a video. Qualcuno può aiutarmi per favore? Grazie mille

  • User

    Ho provato a riscrivere il codice ma mi da errore nella riga ```
    $query = mysql_query($sql) or die(mysql_error());

    Questo è il nuovo codice:
    
    

    <?php
    $keyword = $_POST['keyword'];

    $sql = mysql_query("SELECT *, MATCH(art_titolo, art_articolo) AGAINST ('$keyword') AS score from articoli WHERE MATCH (art_titolo, art_articolo) AGAINST('$keyword') order by score desc");
    $query = mysql_query($sql) or die(mysql_error());
    $row_sql = mysql_fetch_array($query);
    $total = mysql_num_rows($query);

    if($total>0) {
    while ($row_sql = mysql_fetch_array($query)) {//echo out the results
    echo ''.$row_sql['art_titolo'].'<br />'.$row_sql['art_articolo'].'';
    }
    } else
    {
    echo "No results to display";
    }
    ?>

    Mi segnala:
    **Warning**: mysql_query() expects parameter 1 to be string, resource given  in **C:\Documents and Settings**.....
    Come posso risolvere?

  • User

    Sistemato. Adesso però mi visualizza solo il primo risultato della query, quello con id più basso. Il codice è questo:

    <?php
    $keyword = $_POST['keyword'];
    
            $sql = "SELECT *, MATCH(art_titolo, art_articolo) AGAINST ('$keyword') AS score from articoli WHERE MATCH (art_titolo, art_articolo) AGAINST('$keyword') order by score desc";
            $query = mysql_query($sql) or die(mysql_error());
            $riga = mysql_fetch_array($query);
            $righe = mysql_num_rows($query);
    
        if($righe>0) {
            echo ("<br/><h2>Search results:</h2>");
                while ($riga = mysql_fetch_array($query)) {
                    echo ("<h3>{$riga['art_titolo']} ({$riga['score']})</h3>{$riga['art_articolo']}<br/><br/>");
                }
        } else
            {
                echo "Nessun risultato";
            }    
    ?>
    

    Qualche consiglio?


  • User

    la query funziona solo se metto boolean mode in questo modo. però mi fa vedere sempre solo un risultato: :arrabbiato:

    SELECT *, MATCH(art_titolo, art_articolo) AGAINST ('$keyword') AS score from articoli WHERE MATCH (art_titolo, art_articolo) AGAINST('$keyword' IN BOOLEAN MODE) order by score desc
    

    Consigli?


  • User

    Ok. Risolto il problema. I record contenenti la parola cercata devono essere meno della metà del totale altrimenti ritornerà risultato zero.
    Qualcuno mi sa consigliare qualcosa per ovviare a questa mancanza?
    Grazie mille