- Home
- Categorie
- Coding e Sistemistica
- PHP
- Aiuto con elenco categorie in articoli di un blog
-
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.
-
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?
-
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
-
E per stampare tutte le categorie associate ad un determinato id_post come devo fare?
-
La select che ti ho postato prima.
-
E ma poi cosa ci stampo?
Cioè devo fare un echo di qualcosa no? E cosa ci metto dentro l'echo?
-
[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]
-
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
-
Puoi selezionare i dati mettendo DISTINCT per non avere doppioni e per il conteggio ti basterà utilizzare count(campo).
-
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?
-
Perché devi utilizzare altri nomi per le istruzioni sql e l'array dentro il while primario.
Dovresti strutturarle in questa maniera:
[php]<?phprequire_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]
-
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
-
@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. ;)
-
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
-
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.
-
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.
-
Ok allora proverò come dici tu.
Ma per esempio una volta mi ricordo di aver visto dei pannelli di controllo già fatti che assomigliavano a quello di wordpress (non so se avete presente) ed erano installabili sui siti web normali, sapete mica dove posso reperirli??Ps: Comunque grazie a tutti e due per l'aiuto.
-
Mannaggia hai ragione Samyorn.
Si trovava con div aperti e mai chiusi, magari si spostava anche tutto il template.
-
@ManuelHT said:
Ma per esempio una volta mi ricordo di aver visto dei pannelli di controllo già fatti che assomigliavano a quello di wordpress (non so se avete presente) ed erano installabili sui siti web normali, sapete mica dove posso reperirli??
Sotto quest'aspetto non saprei aiutarti, mi spiace, i pannelli di controllo me li faccio da me.
@marcocarrieri said:
Mannaggia hai ragione Samyorn.
Ma figurati Marco, il tuo indirizzo era giustissimo, solo che immaginavo potevano esserci delle formattazioni nel testo e quindi era consigliabile aggiungere una funzione.