• User

    Aiuto con elenco categorie in articoli di un blog

    Ciao a tutti, sono un newbie del PHP che sta cercando di imparare questo linguaggio di programmazione e per farlo mi sto creando un blog personale, così unisco l'utile al dilettevole e imparo qualcosa aprendomi un blog personale, una robetta semplice per ora che poi verrà implementata con l'aumentare della conoscenza nei vari linguaggi e nel PHP stesso.

    Ho finito quasi tutto però ho ancora dei problemini.
    Sostanzialmente ho creato queste tabelle:

    • posts
    • commenti
    • categorie

    La tabella posts contiene i posts, i commenti sono messi nella tabella commenti (che sono associati ad ogni post tramite l'id del post) e la tabella categorie in cui vorrei mettere l'elenco di tutte le categorie esistenti.

    Inoltre ho creato i vari file tipo index.php dove vengono visualizzati tutti i posts e single.php per visualizzare i posts singolarmente con tanto di commenti ecc.
    Ho solo un "piccolo" problema che ho provato e riprovato a risolvere da solo ma non riesco.

    In pratica nella tabella posts c'è un campo chiamato 'categoria' che deve contenere una sorta di richiamo alla categoria presente nella tabella categorie.
    Il problema è che non so come strutturare questo richiamo, anche perchè vorrei fare in modo che poi in ogni post ci sia scritto per esempio "Inserito nelle categorie: Web Design, Software, Tecnologia.
    Una cosa del genere, e cliccando su ciascuna categoria si apra una pagina che mostra tutti i post che contengono quella determinata categoria.

    Come posso quindi strutturare le mie tabelle e gli script php per utilizzare questo sistema??

    Grazie mille in anticipo a tutti, spero che sia troppo complicato farlo 🙂

    PS: per mostrare i post utilizzo un while che mi cicla il contenuto di ogni singola riga della tabella posts


  • 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.