Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    143

    Query basata sui valori di un array

    Su internet ho trovato qualcosa ma niente di così “semplice” come serve a me.

    In pratica ho una tabella “ARTICOLI” di tipo:

    codice:
    ID | TITOLO | TESTO | TAGS
    1 | Bla Bla | ecc ecc ecc | cane,gatto,topo
    2 | Bla Bla2 | ecc ecc ecc | maiale,cane
    3 | Bla Bla3 | ecc ecc ecc | pesce,topo
    Ora ammettiamo di visualizzare la pagina article?id=1

    Quello che vorrei riuscire a fare è mostrare nella pagina del corrispondente articolo, anche i titoli degli articoli che hanno tag uguali a cane e/o gatto e/o topo (i classici “articoli simili”).

    Si tratta quindi di estrarre l’array “tags” della prima riga in questo caso, e attraverso una query andare a cercare soltanto gli articoli che contengono uno o più valori del suddetto array.

    Ma come?

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,508
    Mettiamo che hai il risultato della tua query nella variabile $articolo e che lo hai caricato con un mysql_fetch_assoc()
    Codice PHP:
    $tags explode(",",$articolo['tags']);

    $like '';
    foreach(
    $tags as $tag)
    {
        
    $like ' tags LIKE "%'.$tag.'%", OR ';
    }
    $like substr($like,0,strlen($like)-5); //rimuove l'ultimo , OR che non serve

    $query "SELECT * FROM articoli WHERE ".$like;
    //bal bla bla 
    Questo funziona solo se tutti gli articoli hanno almeno un tag.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    143
    Ti ringrazio innanzitutto della risposta!

    Ho provato a fare come mi hai detto, ma c'è qualcosa che non va.

    Intanto posto tutto il codice della pagina (ovviamente riassumo prendendo le parti più importanti):

    Codice PHP:
    //INIZIO VISUALIZZAZIONE DELL'ARTICOLO
    $id=$_GET['id'];

    $sql "SELECT * FROM articoli WHERE art_id='$id'";
    $query = @mysql_query($sql) or die (mysql_error());

    $row mysql_fetch_array($query) or die (mysql_error());

    $titolo stripslashes($row['art_titolo']);
    $descrizione $row['art_desc'];

    echo 
    $titolo."
    "
    .$desc."
    "
    ;
    //FINE VISUALIZZAZIONE DELL'ARTICOLO

    //INIZIO CODICE PER ARTICOLI SIMILI
    echo "Articoli simili: 
    "
    ;

    $tags explode(",",$row['tags']);

    $like '';

    foreach(
    $tags as $tag)
    {
        
    $like ' tags LIKE "%'.$tag.'%", OR ';
    }

    $like substr($like,0,strlen($like)-5); 

    $sql2 "SELECT * FROM articoli WHERE ".$like;
    $query2 = @mysql_query($sql2) or die (mysql_error());

    while (
    $riga mysql_fetch_assoc($query2)) {
    $titolo_simile $riga['art_titolo']; 

    echo 
    $titolo_simile."
    "
    ;

    Apparentemente funziona, solo che c'è qualche problema con le corrispondenze. Nel database ho questa situazione:

    Articolo 1 con tags A,C
    Articolo 2 con tags B,C
    Articolo 3 con tags B,E

    Visualizzando i tre articoli mi ritrovo in questa situazione:

    //Articolo 1 (A,C)
    Articoli simili:
    - Articolo 1 (A,C) [Non dovrebbe essere visualizzato perchè è lo stesso articolo che stiamo leggendo, ma questo si può risolvere pure dopo]
    - Articolo 2 (B,C)
    [e fin qui tutto ok]

    //Articolo 2 (B,C)
    Articoli simili:
    - Articolo 1 (A,C)
    - Articolo 2 (B,C)
    [Manca Articolo 3 che ha il tag "B" come Articolo 2]

    //Articolo 3 (B,E)
    Articoli simili:
    - Articolo 3 (B,E)
    [Manca l'Articolo 2 che ha il tag "B"]

    Come mai succede questo? Sbaglio io qualcosa?

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    143
    Ho capito il problema: semplicemente il ciclo foreach non scorreva tutti i valori dell'array, ma leggeva solo l'ultimo. Quindi ho risolto così:

    Ho sostituito
    Codice PHP:
        $like ' tags LIKE "%'.$tag.'%", OR ';
    }
    $like substr($like,0,strlen($like)-5); //rimuove l'ultimo , OR che non serve 
    con
    Codice PHP:
        $like .= 'OR tags LIKE "%'.$tag.'%"';
    }

    $like substr($like,2); 
    Ora però c'è il problema di eliminare dagli articoli simili, l'articolo che si sta attualmente visualizzando. Cioè, se visualizzo articolo 1, non voglio che negli articoli simili appaia articolo 1.

    Ho tentato in questo modo:

    Codice PHP:
    $sql2 "SELECT * FROM articoli WHERE art_id <> $id AND".$like
    Ma non va... è come se in presenza del LIKE non gliene fregasse niente della condizione "art_id <> $id".

    Consigli?

  5. #5
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,508
    Penso tu debba mettere
    art_id <> $row['art_id']

    Per quanto riguarda la query, in effetti mi ero mangiato il . e la stringa non veniva concatenata.

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    143
    Dopo un centinaio di prove, sono riuscito a risolvere semplicemente mettendo tra parentesi la clausula (art_id <> $id).

    Ti ringrazio per avermi aiutato, non ci sarei mai riuscito senza il tuo aiuto!

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.