Domande per un forum amatoriale
  • In diretta da GamesVillage.it
    • News
    • -
    • In Evidenza
    • -
    • Recensioni
    • -
    • RetroGaming
    • -
    • Anteprime
    • -
    • Video
    • -
    • Cinema

Visualizzazione risultati da 1 a 10 di 10

Discussione: Domande per un forum amatoriale

Cambio titolo
  1. #1
    Utente
    Registrato il
    04-09
    Messaggi
    601

    Domande per un forum amatoriale

    Sto cercando di creare un forum semplice semplice con php e mysql, ma con la mia bassa conoscenza dei suddetti argomenti ho qualche problema:

    - come fare a contare le volte che una discussione è stata visualizzata ?
    - come posso contare i messaggi all'interno della discussione ? Oltre a darglielo manualmente all'interno della discussione...
    - quale sarebbe il modo più semplice per gestire le sottosezioni ? Per ora ho inserito una colonna dove, se il valore è 0 la sezione compare come principale, mentre se ha un valore diverso coincide con l'id della sezione di cui sarà dipendente.
    - come posso controllare quanti utenti siano connessi in un dato momento ? Questo tenendo conto che utilizzo delle sessioni...
    - come indicare se una discussione è stata visualizzata o meno ? per intenderci, le buste aperte e chiuse su gv...

    ringrazio in anticipo per le risposte, spero di poter chiedere altre domande se mi vengono in mente
    Ultima modifica di Dedalpaperone; 26-07-2009 alle 13:10:18

  2. #2
    Headless Dove L'avatar di sydarex
    Registrato il
    07-04
    Messaggi
    7.847
    Citazione Dedalpaperone Visualizza Messaggio
    Sto cercando di creare un forum semplice semplice con php e mysql, ma con la mia bassa conoscenza dei suddetti argomenti ho qualche problema:

    - come fare a contare le volte che una discussione è stata visualizzata ?
    Beh, metti un contatyore, e ogni volta che la discussione viene aperta lo incrementi.
    Citazione Dedalpaperone Visualizza Messaggio
    - come posso contare i messaggi all'interno della discussione ? Oltre a darglielo manualmente all'interno della discussione...
    Supponendo che tu abbia un database tipo:
    Discussioni(id, titolo, ...)
    Messaggi(id, discussione, ...)
    Esegui una query usando la funzione COUNT() di MySQL; quidi per contare i messaggi della discussione con id=6:
    Codice PHP:
    SELECT COUNT(*) FROM Messaggi WHERE discussione=
    Citazione Dedalpaperone Visualizza Messaggio
    - quale sarebbe il modo più semplice per gestire le sottosezioni ? Per ora ho inserito una colonna dove, se il valore è 0 la sezione compare come principale, mentre se ha un valore diverso coincide con l'id della sezione di cui sarà dipendente.
    Il tuo metodo è quello migliore.
    Citazione Dedalpaperone Visualizza Messaggio
    - come posso controllare quanti utenti siano connessi in un dato momento ? Questo tenendo conto che utilizzo delle sessioni...
    Beh, qui è un discorso complicato. In PHP, purtroppo, non c'é un contatore delle sessioni aperte che puoi richiamare. Quindi ci sono due strade.
    La prima, è contare i file delle sessioni nella directory apposita (PHP salva un file per sessione in una directory - per altre info leggi il manuale). Ma per farlo devi vedere se (a) hai i permessi per leggere quella directory e (b) nal caso tu sia su un hosting condiviso, se la directory è la stessa per ogni dominio o no. Se è la stessa per ogni dominio il metodo non va. In generale non è portabile, come soluzione.
    L'altra, è tenere una tabella nel database:
    UtentiConnessi(id_utente, data)
    E ogni volta che un utente loggato apre una pagina, esegui una routine che fa le seguenti operazioni:
    - Verifica se l'utente è già nella tabella
    - Se si, aggiorna il campo 'data' con l'attuale data.
    - Se no, aggiungilo.
    - Cancella i record che hanno la data troppo vecchia (secondo un timeout che decidi tu).

    In questo modo, ti basta prendere i dati di questa tabella per sapere quanti e chi sono gli utenti connessi.
    Citazione Dedalpaperone Visualizza Messaggio
    - come indicare se una discussione è stata visualizzata o meno ? per intenderci, le buste aperte e chiuse su gv...
    Vari modi.
    Uno, scarso, è creare un cookie con la lista delle discussioni già viste.
    Un'altro è tenere una tabella:
    DiscussioniViste(id_utente, id_discussione)
    Spero di essere stato utile. Vista la quantità di domande è difficile essere dettagliati, perciò dimmi dove vuoi ulteriori dettagli che approfondisco.


  3. #3
    Citazione Dedalpaperone Visualizza Messaggio
    Sto cercando di creare un forum semplice semplice con php e mysql, ma con la mia bassa conoscenza dei suddetti argomenti ho qualche problema:

    - come fare a contare le volte che una discussione è stata visualizzata ?
    - come posso contare i messaggi all'interno della discussione ? Oltre a darglielo manualmente all'interno della discussione...
    - quale sarebbe il modo più semplice per gestire le sottosezioni ? Per ora ho inserito una colonna dove, se il valore è 0 la sezione compare come principale, mentre se ha un valore diverso coincide con l'id della sezione di cui sarà dipendente.
    - come posso controllare quanti utenti siano connessi in un dato momento ? Questo tenendo conto che utilizzo delle sessioni...
    - come indicare se una discussione è stata visualizzata o meno ? per intenderci, le buste aperte e chiuse su gv...

    ringrazio in anticipo per le risposte, spero di poter chiedere altre domande se mi vengono in mente
    - Ad ogni apertura aggiorni un valore relativo a quella discussione (Aggiorna visite della discussione #ID# aggiungengo 1)
    - SELECT COUNT(*) AS Num_Messaggi FROM Discussioni D INNER JOIN Messaggi M ON D.id_discussione = M.id_discussione WHERE D.id_discussione = #ID_DELLA_DISCUSSIONE#
    - A me sembra buono come metodo, se la stessa sottosezione deve essere visualizzabile in più sezioni fai una tabella "ha_sottosezioni" con "id_sezione_principale,id_sottosezione"
    - Ad ogni connessione salvi in una tabella l'ip e il timestamp del visitatore, e fai un controllo sul "tempo stimato" di tutti gli altri, per farti capire:
    Codice PHP:
    IF ((time()-$timestamp_di_collegamento_utente)>20)
    {
         
    //Cancella utente dalla tabella
    }
    {
        
    //L'utente è connesso

    In questo caso un utente di quella tabella che non effettua azioni da più di 20 secondi verrà eliminato.
    Dopo la "pulizia della tabella" basta contare i rimanenti per avere gli utenti online.

    Questo è il metodo più usato (viene chiamato "Tempo stimato" mi sembra, o una roba così), ovviamente non è realistico al 100% però la stima si avvicina molto alla realtà.
    NON è il metodo migliore (come prestazioni soprattutto) ma con i soli PHP e MySql non mi viene niente di meglio.

    - In una tabella (T) ad ogni accesso ad una discussione di un dato utente, salvi ID utente e ID discussione.
    Al caricamento selezioni l'ID delle ultime 500 discussioni, e selezioni le ultime 500 discussioni visualizzate da quell'utente dalla tabella T.
    Dalla prima select esegui un "NOT IN" della seconda e ottieni gli id delle discussioni "nuove".
    Fatto questo ripulisci dalla tabella T i record eccedenti i 500 per quell'utente così da averne sempre e solo 500 da controllare ottimizando le query.

    500 è un valore arbitrale che per un forum amatoriale come il tuo puoi anche mettere a mano o tramite file di configurazione, mentre se vuoi fare una cosa più seria lo calcoli dinamicamente.

    Questo è un esempio, puoi anche fare la stessa cosa salvando le ultime 500 visitate in un solo campo della tabella utente in questo formato "5#15#34#76" con i numeri ad indicare gli id delle ultime discussioni visualizzate, per poi ottenerne una lista (tramite esplosione dei valori) da utilizzare come filtro sulle ultime discussioni.

    ------------------

    Fai qualche prova calcolando i tempi di caricamento delle pagine, e cercando di ottimizzare il tutto
    Se ho detto qualche boiata pace son sveglio da 10 minuti

    @Sydarex: che stile abbiamo detto praticamente le stesse cose

  4. #4
    Utente
    Registrato il
    04-09
    Messaggi
    601
    Allora, in primis ringrazio entrambi. Ora:

    - se facessi una cosa del genere aumenterebbe il valore anche nel visionare pagine secondarie. Potrei sì fare in modo che il valore venga aumentato solo alla pagina iniziale, ma ad esempio su gamesvillage mi è parso di capire che se si aggiorna la pagina le visite non aumentano, ciò succede solo se si esce e si rientra nella discussione. L'idea mia era quella, tuttavia questo è un elemento marginale;

    - errore mio nella spiegazione: quello che volevo era dare al messaggio, oltre all'id univoco, anche il numero di posizione che ricopre nella discussione. Tuttavia anche questo non è indispensabile

    - grazie mille; l'unico problema a riguardo che sto riscontrando è nel momento in cui creo la serie di link (per intenderci: forum > sezione > sottosezione > discussione, come in gv in alto) non è urgente e comunque vedrò di lavorarci meglio

    - secondo il metodo di sydarex non saprei come inserire questo timeout, in effetti mi sono sempre chiesto come funzionino i processi che vanno a tempo, tipo browser game e simili. il metodo di browsersky mi sembra interessante: con questo metodo è l'utente stesso, non un'applicazione a tempo del server, a effettuare l'aggiornamento della tabella, giusto ? (spero)

    - centra di nuovo il fattore tempo, la discussione dovrebbe ritornare nuovamente come 'da leggere' nel momento in cui è stato inserito un nuovo messaggio. Quindi penso andrebbero bene entrambi i metodi (se nel metodo di sydarex inserisco un campo relativo al tempo da confrontare di volta in volta; quello di shadowsky sembra complessino (per me) ma molto interessante)

    punto finale: lentezza del server. Tenendo conto che uso Netsons, che spesso mi da problemini, credete che reggerà un tale susseguirsi di query ? Intendiamoci, il mio sito è rivolto a poche persone, di cui solo alcune di esse lo visiterebbero attivamente, tuttavia man mano le query aumentano. Che ne pensate ?

  5. #5
    Citazione Dedalpaperone Visualizza Messaggio
    Allora, in primis ringrazio entrambi. Ora:

    - se facessi una cosa del genere aumenterebbe il valore anche nel visionare pagine secondarie. Potrei sì fare in modo che il valore venga aumentato solo alla pagina iniziale, ma ad esempio su gamesvillage mi è parso di capire che se si aggiorna la pagina le visite non aumentano, ciò succede solo se si esce e si rientra nella discussione. L'idea mia era quella, tuttavia questo è un elemento marginale;

    - errore mio nella spiegazione: quello che volevo era dare al messaggio, oltre all'id univoco, anche il numero di posizione che ricopre nella discussione. Tuttavia anche questo non è indispensabile

    - grazie mille; l'unico problema a riguardo che sto riscontrando è nel momento in cui creo la serie di link (per intenderci: forum > sezione > sottosezione > discussione, come in gv in alto) non è urgente e comunque vedrò di lavorarci meglio

    - secondo il metodo di sydarex non saprei come inserire questo timeout, in effetti mi sono sempre chiesto come funzionino i processi che vanno a tempo, tipo browser game e simili. il metodo di browsersky mi sembra interessante: con questo metodo è l'utente stesso, non un'applicazione a tempo del server, a effettuare l'aggiornamento della tabella, giusto ? (spero)

    - centra di nuovo il fattore tempo, la discussione dovrebbe ritornare nuovamente come 'da leggere' nel momento in cui è stato inserito un nuovo messaggio. Quindi penso andrebbero bene entrambi i metodi (se nel metodo di sydarex inserisco un campo relativo al tempo da confrontare di volta in volta; quello di shadowsky sembra complessino (per me) ma molto interessante)

    punto finale: lentezza del server. Tenendo conto che uso Netsons, che spesso mi da problemini, credete che reggerà un tale susseguirsi di query ? Intendiamoci, il mio sito è rivolto a poche persone, di cui solo alcune di esse lo visiterebbero attivamente, tuttavia man mano le query aumentano. Che ne pensate ?
    - Basta dare un valore temporale anche a quello,all'accesso salvi un cookie così:
    Codice PHP:
    setcookie("set_visit",time(),time()+3600); 
    L'ultimo parametro segna la durata del cookie, scaduta la quale il browser scarterà il cookie come "vecchio", in questo caso dura 1 ora (timestamp attuale + i secondi in un ora).
    Se trovi settato il cookie non aggiungi la visita, e in più puoi usare questo cookie per avete il timestamp di accesso senza dover eseguire una query.

    - Non lo salvi, lo calcoli: quando stampi i vari post, nello stesso ciclo ci aggiungi un contatore, quello puoi usarlo come id del messaggio. Se vuoi isolare poi quel messaggio esegui un "LIMIT #ID_DEL_CONTATORE# ORDER BY #ID_MESSAGGIO# DESC" e prendi solo il primo record che ti torna dalla query

    - Non capisco quale possa essere il problema

    - Esatto, ma non è "browsersky" ma "shadowsky"

    - Quando ci sono nuovi messaggi cancelli tutti le visite relative a quella discussione nella tabella, in questo modo tutti ritorneranno a vederla come nuova

    Anch'io uso netsons per gli esperimenti e sò com'è
    Finchè la cosa è limitata basta e avanza altrimenti 30 euro l'anno e passa la paura

    PS. Non è la quantità di query a inchiodare un server sono le connessioni a distruggerlo.
    Se "accumuli" in modo intelligente tutte le query che devi fare in un unico "lancio" in questo modo:
    Codice PHP:
    QUERY 1
    GO
    QUERY 2
    GO
    QUERY 3
    GO 
    Non c'è dubbio che maggiore è il numero e la complessità delle query maggiore sarà il tempo necessario e minori saranno le prestazioni.
    Ma con una "costruzione" del genere aumenterai le performance almeno almeno del doppio, invece che fare:
    Codice PHP:
    mysql_query(QUERY_1);
    mysql_query(QUERY_2);
    mysql_query(QUERY_3);
    mysql_query(QUERY_4);
    mysql_query(QUERY_5);
    mysql_query(QUERY_6);
    mysql_query(QUERY_7); 
    Soprattuto se devi fare query one-way tipo aggiornamento,inserimento,cancellazione ecc.

    Poi vabbè indicizza, limita le chiamate, CHIUDI LE CONNESSIONI,... ecc ecc

  6. #6
    Utente
    Registrato il
    04-09
    Messaggi
    601
    Ops, browsersky non so proprio come mi sia uscito Solo 2 precisazioni:

    - circa il numerare i messaggi, quello che avevo intenzione di fare era non di far vedere il contatore nel momento in cui lo stampo, ma anche di salvare questo numero nel record del messaggio, così da poterlo individuare tramite numero_sezione, numero_discussione, numero_messaggio (oltre quindi all'id univoco del messaggio stesso)

    - scusami ma non ho ben capito: mi consigli di scrivere prima tutte le query e poi di farle 'partire' tutte insieme o di scriverne una e di inserirla, scrivere la seconda e inserirla, ecc. ?

  7. #7
    Citazione Dedalpaperone Visualizza Messaggio
    Ops, browsersky non so proprio come mi sia uscito Solo 2 precisazioni:

    - circa il numerare i messaggi, quello che avevo intenzione di fare era non di far vedere il contatore nel momento in cui lo stampo, ma anche di salvare questo numero nel record del messaggio, così da poterlo individuare tramite numero_sezione, numero_discussione, numero_messaggio (oltre quindi all'id univoco del messaggio stesso)

    - scusami ma non ho ben capito: mi consigli di scrivere prima tutte le query e poi di farle 'partire' tutte insieme o di scriverne una e di inserirla, scrivere la seconda e inserirla, ecc. ?
    Tutte assieme ed eseguirne il più possibile su una sola chiamata.

  8. #8
    Utente
    Registrato il
    04-09
    Messaggi
    601
    Scusa la mia ignoranza: In che senso una sola chiamata ?

    EDIT: perdonatemi, ma ho avuto un problemino: nel momento in cui creo una discussione, prima creo la discussione stessa nella relativa tabella, subito dopo devo però salvare il suo primo messaggio nella tabella dei messaggi. Per fare ciò mi serve però l'id della discussione in questione, che non so come ricavare. Pensavo che, se può essere possibile che due utenti creino una discussione nello stesso istante, non lo è che lo stesso utente crei 2 discussioni contemporaneamente, quindi potrei usare il valore di autore e data per collegarmi alla discussione appena creata, però forse voi conoscete una via più diretta per richiamare l'id in questione.

    RIEDIT: credo che questo forum me lo stiate facendo voi, e ciò mi dispiace molto perché cado sempre più nella trappola del "chiedere aiuto all'amico smanettone". Il problema è che mi sono reso conto che non ho ancora strutturato la lista dei thread in base al loro messaggio più recente, e non in base alla data in cui sono stati creati -.- Dovrei aggiungere un campo in cui salvare la data dell'ultimo messaggio immesso, oppure dovrei estrapolare questa con una subquery, ma non credo di esserne capace. Dovrei fare qualcosa tipo:
    $query = "...ORDER BY (SELECT max(data) FROM messaggi....e poi ?
    Ultima modifica di Dedalpaperone; 27-07-2009 alle 16:46:36

  9. #9
    festa privata L'avatar di alessio_roma
    Registrato il
    06-06
    Messaggi
    7.978
    certo bona voglia a creare un forum amatoriale,non potevi utilizzarne uno gratuito già fatto?

  10. #10
    Utente
    Registrato il
    04-09
    Messaggi
    601
    Lo so, infatti ho provato a utilizzare phpbb, ma non riuscivo a integrarlo appieno col sito, cioè a sfruttare le stesse tabelle per la registrazione e altro. Quindi ho pensato che sarebbe meglio fare un forum amatoriale, poiché in tal modo posso solo imparare e ho il pieno controllo di quello che faccio, anche se mi rendo conto che è immensamente più difficile.

Regole di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •