• Consiglio Direttivo

    Ciao ManuelHT.

    Potresti provare a creare una tabella associativa doce vengono associati gli id post agli id categoria, ottenendo alla fine qualcosa del genere:

    |post| cat|
    | 1 | 2 |
    | 1 | 6 |
    | 3 | 2 |

    Durante l'estrazione per categoria o per post otterrai in un lampo tutti i post/categoria associati. 🙂


  • User

    Si però poi come faccio nel while che uso per mostrare il post a recuperare i dati che mi servono per ogni categoria???


  • Consiglio Direttivo

    Fai una select per recuperarti le categorie relative a quel post e ti estrapoli i nomi delle categorie. Per il link alla categoria immagino che già ti basti l'id. 😉


  • User

    Dal punto di vista dello script come posso fare per associare l'id di un post (per esempio 26) all'id di una o più categorie (per esempio a 2, 7 e 9)?


  • Consiglio Direttivo

    Potresti inserire una multi select nella pagina di creazione del post per selezionare le categorie da associare e quindi raccoglierti gli id categorie, con l'id del post appena creato - tramite la funzione mysql_inserted_id(); che ti da appunto l'id del record appena inserito 😉 - e quindi popolare la tabella associativa ciclando i risultati ottenuti per riempire i campi.

    Una cosa del genere potrebbe essere la pagina dove crei il post:
    [html]<form method="post" action="insert.php">
    <!-- oltre i vari titolo, testo del post e quant'altro estrapoli dinamicamente le option della seguente select recuperando i dati dalla tabella delle categorie, il value delle option ovviamente è l'id della categoria -->
    <select name="categoria[]" multiple="1" size="4">
    <option value="1">Categoria 1</option>
    <option value="2">Categoria 2</option>
    <option value="3">Categoria 3</option>
    <option value="4">Categoria 4</option>
    </select>

    <input type="reset" />
    <input type="submit" value="Inserisci" />
    </form> [/html]Mentre la pagina di inserimento potrebbe essere qualcosa del genere:
    [php]<?php

    // esegui i vari passaggi per inserire il post nella relativa tabella e quindi...

    $id_post=mysql_insert_id();
    $array=$_POST['categoria'];

    for ($i=0; $i<count($array); $i++)
    {
    $sql="INSERT INTO assoc (id_post,id_categoria) VALUES ('$id_post','$array*')";
    $query=@mysql_query($sql) or die (mysql_error());
    }

    ?>[/php]
    ...o qualcosa del genere. 😉


  • User

    E per mostrare il risultato dell'associazione???
    Ciao associando ad ogni id_categoria un nome presente nella tabella categorie, come faccio a stampare tutti i valori?

    Questo è il codice che uso per mostrare i post:

    
    <?
    require_once ("config.php");
    
    $sql="SELECT * FROM posts ORDER BY id DESC" ;
    $query=@mysql_query($sql) or die (mysql_error());
    
    while ($array=mysql_fetch_array($query))
    {
    
    $titolo=html_entity_decode($array['titolo']);
    $post=html_entity_decode($array['post']);
    $immpost=html_entity_decode($array['immpost']);
    $contenuto=html_entity_decode($array['contenuto']);
    $fontenome=html_entity_decode($array);
    $fonteind=html_entity_decode($array);
    $tags=$array['tags'];
    $giorno=$array['giorno'];
    $mese=$array['mese'];
    $anno=$array['anno'];
    $ora=$array['ora'];
    $id=$array['id'];
    $postid=$id;
    
    }
    
    ?>
    
    

    Come posso implementare questo codice?


  • Consiglio Direttivo

    Cosa intendi per stampare tutti i valori?

    In questa pagina mi sembra di capire che elenchi tutti i post...

    Comunque, avendo l'id del post per tirar fuori le categorie associate basta fare un'altra select del genere 😉

    SELECT * FROM categorie AS C JOIN assoc AS A ON C.id = A.id_categoria WHERE A.id_post=1
    

  • User

    E per stampare tutte le categorie associate ad un determinato id_post come devo fare?


  • Consiglio Direttivo

    La select che ti ho postato prima. 😉


  • User

    E ma poi cosa ci stampo?
    Cioè devo fare un echo di qualcosa no? E cosa ci metto dentro l'echo?


  • Consiglio Direttivo

    [php]$sql="SELECT * FROM categorie AS C JOIN assoc AS A ON C.id = A.id_categoria WHERE A.id_post='$post_id'";
    $query=@mysql_query($sql) or die (mysql_error());

    while ($array=mysql_fetch_array($query))
    {
    echo $array['campo_nome_categoria'].",";
    } [/php]
    🙂


  • User

    Grazie mille gentilissimo veramente...domani provo se riesco.

    Poi ti posso chidere un ultimo favore???
    Se nella tabella posts ho un campo 'mese' in cui vengono elencati i mesi di ogni post, come faccio a creare uno script che mi prenda tutti i tipi di valori che ci sono in quel campo e me li stampi e che poi per ogni valore mi dica quante volte viene ripetuto all'interno della tabella???

    In modo da postare tipo

    • Novembre (4)
    • Dicembre (9)

    dove 4 e 9 sono gli articoli per il determinato mese...
    Se hai voglia di farmi vedere un esempio ti sarei molto grato, altrimenti fa niente mi hai comunque dato un grosso aiuto quindi grazie mille lo stesso 🙂


  • Consiglio Direttivo

    Puoi selezionare i dati mettendo DISTINCT per non avere doppioni e per il conteggio ti basterà utilizzare count(campo). 😉


  • User

    Ho un piccolo problemino, in pratica mettendo il codice in questo modo:
    [PHP]

    <?
    require_once ("config.php");

    $sql="SELECT * FROM posts ORDER BY id DESC" ;
    $query=@mysql_query($sql) or die (mysql_error());

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

    $titolo=html_entity_decode($array['titolo']);
    $post=html_entity_decode($array['post']);
    $immpost=html_entity_decode($array['immpost']);
    $contenuto=html_entity_decode($array['contenuto']);
    $fontenome=html_entity_decode($array);
    $fonteind=html_entity_decode($array);
    $tags=$array['tags'];
    $giorno=$array['giorno'];
    $mese=$array['mese'];
    $anno=$array['anno'];
    $ora=$array['ora'];
    $id=$array['id'];
    $postid=$id;

    $sql="SELECT * FROM categorie AS C JOIN assoc AS A ON C.id = A.id_categoria WHERE A.id_post='$post_id'";
    $query=@mysql_query($sql) or die (mysql_error());

    while ($array=mysql_fetch_array($query))
    {
    echo $array['campo_nome_categoria'].",";
    }

    }

    ?>

    [/PHP]

    (Ovviamente con i nomi dei campi corretti), funziona, però mi mostra solo l'ultimo post inserito; dov'è il problema?


  • Consiglio Direttivo

    Perché devi utilizzare altri nomi per le istruzioni sql e l'array dentro il while primario. 🙂

    Dovresti strutturarle in questa maniera:
    [php]<?php

    require_once ("config.php");

    $sql_post="SELECT * FROM posts ORDER BY id desc" ;
    $query_post=@mysql_query($sql_post) or die (mysql_error());

    while ($array_post=mysql_fetch_array($query_post))
    {

    echo $array_post['id']."-".$array_post['title']."-".$array_post['text']."-".$array_post['date'];

    $sql_cat="SELECT * FROM categorie AS C JOIN assoc AS A ON C.id = A.id_cat WHERE A.id_post='".$array_post['id']."'";
    $query_cat=@mysql_query($sql_cat) or die (mysql_error());

    while ($array_cat=mysql_fetch_array($query_cat))
    {
    echo "-".$array_cat['categoria'];
    }
    echo "<br />";

    }
    ?>[/php]

    😉


  • User

    Guarda ho provato così, ti mostro tutto il codice completo:

    [PHP]
    <?
    require_once ("config.php");

    //verifico che ci siano post
    $sql="SELECT id FROM posts";
    $query=@mysql_query($sql) or die (mysql_error());
    $row=mysql_num_rows($query);

    //procedo nel caso ci siano post
    if ($row!=0) {

    $sql_post="SELECT * FROM posts ORDER BY id DESC" ;
    $query_post=@mysql_query($sql_post) or die (mysql_error());

    while ($array_post=mysql_fetch_array($query_post))
    {

    $titolo=html_entity_decode($array_post['titolo']);
    $post=html_entity_decode($array_post['post']);
    $immpost=html_entity_decode($array_post['immpost']);
    $contenuto=html_entity_decode($array_post['contenuto']);
    $fontenome=html_entity_decode($array_post);
    $fonteind=html_entity_decode($array_post);
    $categorie=html_entity_decode($array_post['categorie']);
    $tags=$array_post['tags'];
    $giorno=$array_post['giorno'];
    $mese=$array_post['mese'];
    $anno=$array_post['anno'];
    $ora=$array_post['ora'];
    $id=$array_post['id'];
    $postid=$id;

    //conto quanti commeti ci sono per questo post
    $st="SELECT COUNT(*) AS tot FROM commenti WHERE postid='$postid'" ;
    $que=@mysql_query($st) or die (mysql_error());
    $que=mysql_fetch_assoc($que);
    $totalecom=$que['tot'];

    //associo le categorie al post
    $sql_cat="SELECT * FROM categorie AS C JOIN postcat AS A ON C.id = A.id_categoria WHERE A.id_post='$postid'";
    $query_cat=@mysql_query($sql_cat) or die (mysql_error());

    while ($array_cat=mysql_fetch_array($query_cat))
    {
    echo $array_cat['codicecat'].", ";
    }

    }

    //poi qui metto le varie scritture per stampare i risultati e chiudo l'if

    }

    ?>
    [/PHP]

    Però non mi va lo stesso, non so come mai, mi mostra sempre il primo post


  • Consiglio Direttivo

    @ManuelHT said:

    >
    
    **}**
    
    **//poi qui metto le varie scritture per stampare i risultati e chiudo l'if**
    
    }
    
    ?>
    
    >```
    
    Eccallà :D
    Perché la stampa la effettui fuori dal ciclo while, indi ti manda in stampa l'ultimo dato salvato nelle variabili, ti basta mettere la stampa dei risultati prima di quella graffa. ;)

  • User

    Perfetto ora va tutto alla perfezione, grazie mille.
    Un ultimissima cosa, se volessi fare in modo che per ogni post si vedano solo un tot di parole e poi cliccando su "Leggi tutto" si vada al resto dell'articolo come potrei fare??

    Grazie ancora


  • ModSenior

    Ciao io opterei per una sottostringa.

    $quanticaratteri=10;
    $lunghezza= strlen($messaggio);
    if($lunghezza<=$quanticaratteri)
    {
       echo $messaggio
    }
    else
    {
       $sottostringa=substr($messaggio, 0, $quanticaratteri); 
       echo $sottostringa."...";
    }
    

    Chiedo scusa se il codice è sbagliato, ma provengo da Asp, Php lo ho visto poco.


  • Consiglio Direttivo

    Giusto Marco, manca solo un banale ; dopo echo $messaggio, ma va benissimo. 😉

    Mi permetto l'intervento solo per una precisazione sull'utilizzo di questo script, perché finché il dato contenuto in $messaggio è privo di tag html va benissimo, ma se utilizzi un editor per salvare il post o comunque utilizzi un qualche tipo di formattazione, ti ritroveresti con dei tag html aperti e non chiusi. 😉

    Nel caso tu formattassi il testo dei post allora un metodo è quello di utilizzare la funzione strip_tags, prima di passare $messaggio allo script che ti ha postato Marco. 😉