Aiuto realizzare forum

Salve a tutti mi servirebbe una mano nella realizzazione del mio forum cioè io ho realizzato il forum completamente da 0 senza usare paccheti preconfezionati ora però mi è sorto un dubbio cioè:

Come faccio a dire all'utente quali sono i topic letti e quelli no da lui??

Grazie per le risposte

inviato 10 anni fa
SuperSavio
X 0 X

Salve a tutti mi servirebbe una mano nella realizzazione del mio forum cioè io ho realizzato il forum completamente da 0 senza usare paccheti preconfezionati ora però mi è sorto un dubbio cioè:

Come faccio a dire all'utente quali sono i topic letti e quelli no da lui??

Grazie per le risposte

un lavoretto da niente  :o

Un modo potrebbe essere quello di memorizzare in una apposita tabella del DB un record ogni qualvolta l'utente legge un messaggio. il record potrebbe essere nella forma: ID_utente, ID_topic, ID_messaggio dove

ID_utente identifica l'utente

ID_topic identifica la discussione che l'utente ha letto

ID_messaggio indica quale era l'ultimo messaggio della discussione nel momento in cui l'utente ha letto la discussione.

Per vedere quindi se una discussione è da segnalare come "nuova" devi recuperare l'ID_topic e l'ID_messaggio dell'ultimo messaggio inviato nella discussione.

Poi devi cercare il record con ID_utente e ID_topic uguali a quelli suddetti e verificare che l'ID_messaggio associato sia uguale all'ID_messaggio suddetto. In questo caso l'utente ha letto tutta la discussione, altrimenti l'utente si è fermato ad un messaggio più vecchio della discussione pertanto questà è da segnalare come "nuova".

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

quindi dovrei creare una tabella dove per ogni utente registrato gli si associa un record

esempio

utente Prova ha id 1

quando entra nel forum c'è un controllo nella tabella messaggi_utenti_forum che contiene i campi da te citati trova il record che ha come id_utente 1 e confronta tutti i contenuti degli altri campi con quelli prensenti nel forum

se nel forum c'è un nuovo topic con id 3 e nel campo dell'utente c'è 1,2 significa che quel topic è nuovo

e lo stesso ragionamento vale per i messaggi nei topic

giusto?

risposto 10 anni fa
SuperSavio
X 0 X

Si, in pratica supponiamo di voler sapere se il topic 54, che ha l'ultimo messaggio con ID 256, è stato letto dall'utente 3

Allora:

1)cerca l'ID_messaggio associato record con ID_utente = 3 e ID_topic = 54

2) se non esiste allora l'utente non ha mai letto il topic, che quindi è nuovo

3) se esiste controlla che l'ID_messaggio trovato sia uguale a 256. Se tale condizione è verificata allora il topic è vecchio, altrimenti è nuovo.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

ok allora facciamo quest'altro tipo di ragionamento per vedere se ci troviamo così inizio a programmare allora prendiamo il tuo esempio

topic 54, che ha l'ultimo messaggio con ID 256, è stato letto dall'utente 3

Allora:

1)cerca l'ID_messaggio associato record con ID_utente = 3 e ID_topic = 54

2) se non esiste allora l'utente non ha mai letto il topic, che quindi è nuovo

3) se esiste controlla che l'ID_messaggio trovato sia uguale a 256. Se tale condizione è verificata allora il topic è vecchio, altrimenti è nuovo.

facciamo caso che nel campo id_topic il contenuto è disposto in questa maniera

12,13,15,16,17,18,19,20............,53

lo script nn legge i singoli id dp la virgola ma legge tutto insieme quindi anche se ci fosse il 54 quindi

12,13,15,16,17,18,19,20............,53,54

e gli faccio il controllo come fa lui a leggere solo 54?? cioè che metodo devo usare per far leggere i singoli id dp la virgola???

stesso ragionameto per i messaggi

risposto 10 anni fa
SuperSavio
X 0 X

forse non ho ben capito, comunque ti descrivo come deve essere fatta questa tabella per la memorizzazione delle discussioni lette:

[table]

[tr][td]ID_utente[/td][td]ID_topic[/td][td]ID_messaggio[/td][/tr]

[tr][td]2[/td][td]54[/td][td]250[/td][/tr]

[tr][td]3[/td][td]54[/td][td]256[/td][/tr]

[tr][td]3[/td][td]72[/td][td]512[/td][/tr]

[tr][td]4[/td][td]60[/td][td]346[/td][/tr]

[tr][td]5[/td][td]61[/td][td]370[/td][/tr]

[/table]

Relativamente a questi dati di esempio supponiamo che per la discussione con ID_topic = 54 l'ultimo messaggio sia il 256. Allora:

- L'utente 2 ha iniziato a leggere la discussione ma nel frattempo sono stati aggiunti nuovi messaggi (250 != 256). Per lui la discussione è nuova!

- L'utente 3 ha letto anche l'ultimo messaggio della discussione. Per lui la discussione è vecchia.

- Gli utenti 4 e 5 non hanno letto nulla della discussione che quindi per loro è nuova.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

allora ho fatto il codice e ti dico il ragionamento che ho seguito

ho creato la tabella forum_lettura_utenti che ha tre campi id_utente id_topic id_messaggio

nella pagina viewforum.php dove mi stampa tutti i topic contenenti in un forum ho fatto questa parte di codice

$sqlbis = "SELECT * FROM forum_lettura_utenti WHERE id_topic = '".$id_topic."' and id_utente = '".$_SESSION['id_user']."' and id_messaggio = '".$u_mess."'";
$resultsbis = mysql_query($sqlbis);
$numrowsbis = mysql_num_rows($resultsbis);
if($numrowsbis!=0){
$lettura_forum = "<img src=\"icons/letti.gif\">";
}else{
$lettura_forum = "<img src=\"icons/nonletti.gif\">";
}
if(!isset($_SESSION['username'])){
$lettura_forum = "<img src=\"icons/letti.gif\">";
}

legge la tabella seguendo la where così mi basta fare un mysql_num_rows per sapere se esiste o no..se esiste il forum è letto se nn esiste allora nn è letto.....nn guardare l'ultima parte di codice perchè per chi nn è loggato nn deve sapere i messaggi nuovi o i vecchi  >:D.....poi nella pagina topic dove si visualizza il singolo topic ho fatto questo codice

$sql5 = "SELECT * FROM forum_lettura_utenti WHERE id_topic = '".$id_topic."' and id_utente = '".$_SESSION['id_user']."'";
$results5 = mysql_query($sql5) or die ("Errore SQL 5");
$row5 = mysql_fetch_array($results5);
$id_utente_ = $row5[0];
$id_topic_ = $row5[1];
$id_messaggio = $row5[2];
if($id_topic_=="" AND $id_utente_=="" AND $id_messaggio==0){
$sql6bis = "INSERT INTO forum_lettura_utenti (id_utente, id_topic) VALUES ('".$_SESSION['id_user']."', '".$id_topic."')";
$results6bis = mysql_query($sql6bis);
}else{
$sql7 = "UPDATE `forum_lettura_utenti` SET `id_messaggio` = '".$id_reply."' WHERE `id_utente` ='".$_SESSION['id_user']."' AND id_topic = '".$id_topic."'";
$result7 = mysql_query($sql7) or die("Errore SQL 7");

semplice da capire in pratica interroga la tabella fa il controllo se i campi sono vuoi e se il campo id_messaggio è uguale a 0 ( default quindi nessuna risposta, lo 0 equivale al primo messaggio cioè il topic )

se la condizione è vera inserisce nella tabella forum_lettura_utenti i dati così risulta vero se la condizione è falsa quindi significa che i campi sono pieni e id_messaggio è diverso da 0 quindi ha risposta va a fare un update dell'id messaggio...e fino a qui tutto ok poi torno indietro nella lista dei topic e risulta che il topic è stato letto ma nel momento che aggiorno la pagina la casella diventa di nuovo nn letta....cosa devo fare sto uscendo matto   :'(

Grazie per l'aiuto

risposto 10 anni fa
SuperSavio
X 0 X

Cioè se carichi 2 volte la pagina dei topic la prima volta funziona mentre la seconda no?!?! :o

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

dopo letto il topic torno indietro e me lo segnala come letto poi quando aggiorno la pagina me lo segnala di nuovo come nn letto :-\

risposto 10 anni fa
SuperSavio
X 0 X

Per prima cosa ti consiglio di osservare tutti i cambiamenti che avvengono nei dati della tabella forum_lettura_utenti. Osserva con attenzione quali dati sono presenti nelle varie fasi di accesso al topic (mostra lista topic, mostra topic, torna alla lista topic, refresh della pagina). Aiutati con phpMyAdmin o con qualche altro client MySQL.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

io svuoto la tabella visualizzo il topic controllo la tabella poi aggiorno la pagina il topic viene riassegnato come nn letto e vado a controllare di nuovo la tabella ma è tutto ok...ho pensato che c'è un errore lato codice e non db visto che funziona corretamente la tabella ti ho postato i codice prima puio darci un'occhiata e dirmi se trovi qualcosa che nn và

risposto 10 anni fa
SuperSavio
X 0 X

Non mi è chiaro perché metti 0 come id del primo messaggio di un topic. Questo messaggio non ha un suo vero id?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

il topic si divide in topic in sè e il messaggio scritto

quindi il topic ha un suo id mentre il messaggio, che si trova nella stessa tabella del topic, si puo dire che ha come id quello del topic solo che per fare il controllo io gli ho messo un campo che ha come default 0 così quando l'utente l'egge il topic con id 54 nella tabella forum_lettura utenti inserisce

id_utente id_topic id_ messaggio

     1                 54         0

poi quando va a fare il controllo  vede nella tabella l'utente ha letto il topic 54 solo alla sua apertura senza alcuna risposta, e se invece c'è nè cambia il valore dell'id_messaggio con l'id_dell'utilmo messaggio postato nel topic

spero di essermi spiegato bene  :P :-[

risposto 10 anni fa
SuperSavio
X 0 X

ti consiglio di cambiare il codice che memorizza la lettura di un messaggio usando una query di tipo REPLACE. In pratica devi mettere come chiave primaria della tabella forum_lettura_utenti i campi id_utente e id_topic. Poi per memorizzare la visualizzazione di un messaggio ti basta un'unica query:

REPLACE INTO forum_lettura_utenti SET id_utente = ...

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

facendo così cosa elimino???

cioè il codice è il seguente

$sql5 = "SELECT * FROM forum_lettura_utenti WHERE id_topic = '".$id_topic."' and id_utente = '".$_SESSION['id_user']."'";
$results5 = mysql_query($sql5) or die ("Errore SQL 5");
$row5 = mysql_fetch_array($results5);
$id_utente_ = $row5[0];
$id_topic_ = $row5[1];
$id_messaggio = $row5[2];
if($id_topic_=="" AND $id_utente_=="" AND $id_messaggio==0){
$sql6bis = "INSERT INTO forum_lettura_utenti (id_utente, id_topic) VALUES ('".$_SESSION['id_user']."', '".$id_topic."')";
$results6bis = mysql_query($sql6bis);
}else{
$sql7 = "UPDATE `forum_lettura_utenti` SET `id_messaggio` = '".$id_reply."' WHERE `id_utente` ='".$_SESSION['id_user']."' AND id_topic = '".$id_topic."'";
$result7 = mysql_query($sql7) or die("Errore SQL 7");

con il metodo detto te cosa cambia??

risposto 10 anni fa
SuperSavio
X 0 X

devi solo eseguire la query che ti ho detto, pensa a tutto lei:

http://dev.mysql.com/doc/refman/5.0/en/replace.html

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

cioè allora devo fare

al posto di questo codice

$sql5 = "SELECT * FROM forum_lettura_utenti WHERE id_topic = '".$id_topic."' and id_utente = '".$_SESSION['id_user']."'";
$results5 = mysql_query($sql5) or die ("Errore SQL 5");
$row5 = mysql_fetch_array($results5);
$id_utente_ = $row5[0];
$id_topic_ = $row5[1];
$id_messaggio = $row5[2];
if($id_topic_=="" AND $id_utente_=="" AND $id_messaggio==0){
$sql6bis = "INSERT INTO forum_lettura_utenti (id_utente, id_topic) VALUES ('".$_SESSION['id_user']."', '".$id_topic."')";
$results6bis = mysql_query($sql6bis);
}else{
$sql7 = "UPDATE `forum_lettura_utenti` SET `id_messaggio` = '".$id_reply."' WHERE `id_utente` ='".$_SESSION['id_user']."' AND id_topic = '".$id_topic."'";
$result7 = mysql_query($sql7) or die("Errore SQL 7");

solo

$sql = "REPLACE INTO forum_lettura_utenti SET id_utente = '".$_SESSION['id_user']." and id_topic = '".$id_topic."' and id_messaggio = '".$u_mess."'";
$results = mysql_query($sql);

giusto?? oppure lo devo inserire sotto al codìce che ho già?

risposto 10 anni fa
SuperSavio
X 0 X

buona la prima! Leggiti la documentazione per scoprirne l'effetto. Non dimenticare di settare correttamente la chiave primaria della tabella come ti ho detto prima, altrimenti non funziona. Ovviamente dopo controlla che nel DB vengano memorizzate le informazioni proprio come te le aspetti.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

quindi al posto di tutti quelle query metto solo quella che mi hai detto te settando id_utente e id_topic come chiavi primarie

risposto 10 anni fa
SuperSavio
X 0 X
quindi al posto di tutti quelle query metto solo quella che mi hai detto te settando id_utente e id_topic come chiavi primarie

si

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

ho fatto solo che mi mette nei tre campi sempre il valore 0 ho stampato anche le variabile per vedere il loro contenuto e mi danno i seguenti valori

id_utente  id_topic   id_messaggio

    1                  1              0

e provando anche a mettere un messaggio dando come risultato

id_utente  id_topic   id_messaggio

    1                  1              1

nella tabella forum_lettura_utenti

id_utente  id_topic   id_messaggio

    0                  0              0

risposto 10 anni fa
SuperSavio
X 0 X

fai anche una echo delle query che lanci così sai che valori stai inviando al DB

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

bhè l'echo mi stampa questo

REPLACE INTO forum_lettura_utenti SET id_utente = '1' AND id_topic = '1' AND id_messaggio = '1'

solo che nella tabella ci sono sempre i valori 0

risposto 10 anni fa
SuperSavio
X 0 X

SORRY  :-[

REPLACE INTO forum_lettura_utenti SET id_utente = 1, id_topic = 1 , id_messaggio = 1

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

ora dopo aver aggiunto il primo record

id_utente  id_topic   id_messaggio

    1                  1              1

quando clikko su gli altri topic nn me li aggiunge nella tabella

risposto 10 anni fa
SuperSavio
X 0 X

Sicuro dei valori che passi a REPLACE?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

si..ho fatto una prova ed ho notato che dp aver aggiunto il primo record riguardante un topic dp nn li aggiunge più ma se  a quello già presente bisogna cambiare un valore lo cambia cioè

id_utente  id_topic   id_messaggio

    1                  1              1

il topic numero 1 ha una risposta che ha id 1 poi ho dato un'altra risposta con id 2 quella viene cambiata nella tabella

id_utente  id_topic   id_messaggio

    1                  1              2

solo che nn inserisce gli altri record dei altri topic

EDIT:

Risolto

risposto 10 anni fa
SuperSavio
modificato 10 anni fa
X 0 X

ora il problema e delle img.....quando leggo i topic della prima categoria me le segnala come letti poi basta che aggiorno la pagina per far uscire l'img dei topic nn letti poi nella seconda categoria quando leggo un qualsiasi topic mi segnala sempre il primo come letto e il resto sempre come nn letto e poi aggiorno la pagina e torna tutto come nn letto  :'( :'(

risposto 10 anni fa
SuperSavio
X 0 X

Ribadisco il consiglio di procedere prima ad una verifica dei dati del database, in modo da essere sicuro che le informazioni sulla lettura dei topics siano corrette. Se il rpoblema non è li allora cerca di scoprire qualce parte del codice erroneamente produce l'immagine "non letto". E' la SELECT che restituisce il valore errato?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

risolto  ;D Grazie mille per l'aiuto che mi hai dato gianno sei grande O0

risposto 10 anni fa
SuperSavio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda