Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    chiave di tipo FULLTEXT

    Dopo aver visto la pillola
    http://forum.html.it/forum/showthrea...+match+against
    e la pillola
    http://forum.html.it/forum/showthrea...light=fulltext
    ho un problema:
    ho una tabella creata con il seguente codice:
    Codice PHP:
    CREATE TABLE  forum_posts (
      
    id int(11NOT NULL auto_increment,
      
    topic_id int(11NOT NULL default '0',
      
    forum_id int(11NOT NULL default '0',
      
    author_id int(11NOT NULL default '0',
      
    update_id int(11NOT NULL default '0',
      
    date_posted datetime NOT NULL default '0000-00-00 00:00:00',
      
    date_updated datetime NOT NULL default '0000-00-00 00:00:00',
      
    subject varchar(255NOT NULL default '',
      
    body mediumtext NOT NULL,
      
    PRIMARY KEY  (id),
      
    KEY IdxArticle (forum_id,topic_id,author_id,date_posted),
      
    FULLTEXT KEY IdxText (subject,body)

    ed una query di ricerca con il seguente codice:
    Codice PHP:
    $sql "SELECT *, MATCH (subject,body) " .
             
    "AGAINST ('" $_GET['keywords'] . "') AS score " .
             
    "FROM forum_posts " .
             
    "WHERE MATCH (subject,body) " .
             
    "AGAINST ('" $_GET['keywords'] . "') " .
             
    "ORDER BY score DESC"
    I problemi sono che all'atto della creazione della tabella già mi vien detto che le chiavi di tipo FULLTEXT non sono supportate. Allora ho tolto le chiavi, creato la tabella con il codice e poi l'ho modificata con phpmyadmin aggiungendo le chiavi FULLTEXT sui campi subject e body.
    Tuttavia quando eseguo una ricerca mysql mi restituisce il seguente errore:
    "Could not perform search; Can't find FULLTEXT index matching the column list"
    Spero di essere stato abbastanza chiaro malgrado i codici siano spezzoni.

  2. #2
    se ti ha dato errore alla creazione e', forse, perche' la tabella e' per default con motore InnoDB, mentre l'indice fulltext e' compatibile solo con le tabelle MyIsam

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    L'errore durante la creazione è:
    "The used table type doesn't support FULLTEXT indexes"
    ma c'è un modo per dire subito all'interno di questo codice
    Codice PHP:
    CREATE TABLE  forum_posts (
      
    id int(11NOT NULL auto_increment,
      
    topic_id int(11NOT NULL default '0',
      
    forum_id int(11NOT NULL default '0',
      
    author_id int(11NOT NULL default '0',
      
    update_id int(11NOT NULL default '0',
      
    date_posted datetime NOT NULL default '0000-00-00 00:00:00',
      
    date_updated datetime NOT NULL default '0000-00-00 00:00:00',
      
    subject varchar(255NOT NULL default '',
      
    body mediumtext NOT NULL,
      
    PRIMARY KEY  (id),
      
    KEY IdxArticle (forum_id,topic_id,author_id,date_posted),
      
    FULLTEXT KEY IdxText (subject,body)

    che la tabella deve essere di tipo MyIsam? Risolto quello provo a vedere se la ricerca funziona.

  4. #4
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    Originariamente inviato da giancarlo75
    ma c'è un modo per dire subito all'interno di questo codice
    che la tabella deve essere di tipo MyIsam?
    mi sembra che nel primo thread che hai linkato la cosa sia indicata chiaramente nella definizione della tabella...
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  5. #5
    E' vero, infatti per un attimo credevo fosse un deja vu invece avevo già ricevuto la risposta.
    Ciò malgrado il codice continua a non funzionare, è un caso disperato. Ora la creazione della tabella riesce, ma la ricerca restituisce sempre nessun risultato anche cercando parole inserite.
    Il codice della ricerca è:
    Codice PHP:
    ...
    if (isset(
    $_GET['keywords'])) {
      
    $sql "SELECT *, MATCH (subject,body) " .
             
    "AGAINST ('" $_GET['keywords'] . "') AS score " .
             
    "FROM forum_posts " .
             
    "WHERE MATCH (subject,body) " .
             
    "AGAINST ('" $_GET['keywords'] . "') " .
             
    "ORDER BY score DESC";

      
    $result mysql_query($sql$conn)
        or die(
    'Could not perform search; ' mysql_error());
    }

    echo 
    "<table class=\"forumtable\" width=\"100%\" " .
         
    "cellspacing=\"0\">\n";
    echo 
    "<tr><th class=\"searchHeader\">Search Results</th></tr>\n";

    if (
    $result and !mysql_num_rows($result)) {
      echo 
    "<tr class=\"row1\"><td>No articles found that match the ";
      echo 
    "search term(s) '[b]" $_GET['keywords'] . "[/b]'";
      if (
    $access_lvl 2) echo "

    SQL: 
    $sql</p>";
      echo 
    "</td></tr>\n";
    } else {
      
    $rowclass "";
      while (
    $row mysql_fetch_array($result)) {
        
    $rowclass = ($rowclass == "row1"?"row2":"row1");
        echo 
    "<tr class=\"$rowclass\">\n<td>\n";
        
    $topicid=($row['topic_id']==0?$row['id']:$row['topic_id']);
        echo 
    "<p class=\"searchSubject\">\n<a href=\"viewtopic.php?t=" .
             
    $topicid "#post" $row['id'] . "\">" .
             
    $row['subject'] . "</a>\n";
        echo 
    "</p>\n";
        echo 
    "<p class=\"searchBody\">\n";
        echo 
    htmlspecialchars(trimBody($row['body']));
        if (
    $access_lvl 2) {
             echo 
    "

    SQL: 
    $sql</p>";
             echo 
    "

    relevance: " 
    $row['score'];
        }
        echo 
    "\n</p>\n";
        echo 
    "</td>\n</tr>\n\n";
      }
    }
    echo 
    "</table>";
    ... 
    e nella pagina scrive sempre
    "No articles found that match the (termine ricercato)"
    sia cercando una parola inserita che non.
    Chiedo venia per la ripetizione di prima.

  6. #6
    if ($result and !mysql_num_rows($result)) {

    questo controllo non e' corretto.

    Se $result fosse FALSE avresti il DIE che ti ferma prima. Se arrivi fin li e' TRUE per forza.

    Mysql_num_rows() rende il numero delle righe.
    Meglio se fai:

    if (mysql_num_rows($result) == 0 ) {

    ti conviene anche stampare la query per vedere cosa viene valorizzato dalle variabili. ISSET() ti rende true anche se la variabile fosse vuota. Userei !empty() al posto di isset().

    echo $sql;

    Da ultimo ma non per ultimo, occhio alle limitazioni dell'indice FULLTEXT ... parole troppo corte o nell'elenco di quelle escluse perche troppo frequenti.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Dopo aver modificato il controllo e fatto tutti gli accorgimenti, tra cui l'inserimento e la ricerca di parole sufficientemente lunghe e particolari il codice continua a non restituire i risultati della ricerca. A questo punto credo che possa dipendere o da un pezzo di codice che interagisce e devo riconoscere, ma è difficile, oppure da un errore nell'impostazione della query di ricerca o ancora un difettoso funzionamento di mysql, forse nelle impostazioni.
    Comunque i consigli sono utili e perfezionano un codice preso da manuale.
    Grazie, ciao.

  8. #8
    Ho risolto, anzi il problema si è autorisolto, infatti bastava aspettare. Utilizzando le stesse chiavi di ricerca sui messaggi inseriti ieri oggi vengono elencati. La cosa è strana perchè ieri non andava proprio, ma l'importante è che funziona.

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.