controllo login e order by presenti
controllo login e order by presenti postato il 19/04/2014 04:33:06 nel forum programmazione, open source e hosting
Salve a tutti.
Risolto un problema se ne presentano sempre altri mille. E risolti questi se ne presentano altri. :-(
Mi restano da risolvere, per ora, due problemi. Uno son certo che sia di facile soluzione ma tutti i tentativi che ho fatto non sono andati a buon fine (forse l'ora tarda non aiuta). Uno invece è forse una mia fissazione e non c'è modo di farlo in maniera semplice.
Premessa: ho una tabella "personaggio" in cui ci sono i campi "nome", "password", "ora_entrata", "ora_uscita" (ce ne sono anche altri ma non servono).
1) Partiamo dal più facile (credo): una volta creata la pagina di login (che funziona senza problemi) mi sono accorto di un problema: se mentre sono connesso provo a rifare il login mi si connette lo stesso. Ergo non ho messo il controllo nel file di login. Quindi mi dico: "mettiamolo, cosa sarà mai". Ma non mi riesce. Ho fatto più di dieci tentativi, se non più di venti, e non ne sono venuto a galla. Molto probabilmente l'orario non è dalla mia parte e questo influisce sul risultato. Qualcuno potrebbe aiutarmi spiegandomi come vedere se una volta inseriti i dati l'utente è o meno connesso? E, nel caso sia già connesso, come faccio a far fare al programma un countdown tale che dopo 5 minuti risulta essere ora_uscita>ora_entrata e quindi l'utente può connettersi?
2) Ora quello più complesso (anche da spiegare). Supponiamo che ci siano i personaggi A e B.
A è connesso e B no. Quando B si connette è possibile leggere "B è entrato". Quando B esce è possibile leggere "B è uscito". Anche quando A entra o esce è possibile leggere, rispettivamente, "A è entrato" o "A è uscito". Il problema è il seguente: supponiamo che A e B facciano le seguenti azioni:
A è uscito
B è entrato
A è entrato
B è uscito
B è entrato
invece di visualizzarmi ingressi e uscite in quella maniera me li visualizza in questa:
A è entrato
A è uscito
B è entrato
B è uscito
Di sicuro il problema sarà nella query quando seleziono i dati dal db non avendo messo ORDER BY. Ma anche se lo metto l'ordine non è mai quello che voglio io. La query è questa:
$query=mysql_query("SELECT nome, ora_entrata, ora_uscita FROM personaggio ORDER BY XXX");
Il mio problema è che non capisco cosa debba mettere al posto di XXX per ottenere il risultato desiderato, ossia che le azioni di ingresso e uscita vengano visualizzate secondo questo criterio:
chiamiamo OE(A) l'ora di entrata di A
chiamiamo OU(A) l'ora di uscita di A
chiamiamo OE(B) l'ora di entrata di B
chiamiamo OU(B) l'ora di uscita di B
allora dovremmo avere (indicando gli "a capo" con "/"):
- se OE(B)>OE(A) visualizza "A è entrato / B è entrato"
- se OU(A)>OE(B)>OE(A) visualizza "A è entrato / B è entrato / A è uscito"
- se OE(A)>OU(A)>OE(B) visualizza "B è entrato / A è uscito / A è entrato"
- se OU(B)>OE(A)>OU(A)>OE(B) visualizza "B è entrato / A è uscito / A è entrato / B è uscito"
etc
in poche parole vorrei che mi visualizzasse, dall'alto verso il basso, gli eventi di accesso e uscita in ordine crescente di evento (quindi l'evento meno recente si trova sopra a quello più recente).
Sperando di essermi spiegato (altrimenti proverò a spiegarmi in un'altra maniera, ma spiegare l'idea del punto 2 è un pò difficile), qualcuno sa aiutarmi?
Grazie
Pagine → 1
19/04/2014 11:39:19
Per la seconda domanda, dalla query che vedo e da come hai hai postato la struttura della tabella l'approcico secondo me è sbagliato.
invece di creare due campi nella tabella personagigo con la data di entrata e di uscita del pg (anche perchè qui ti segna solo l'ultima entrata e l'ultima uscita e ti rende anche difficile ordinare gli eventi quando ci sono più di due pg) ti converrebbe crearti una sempkice tabella per il salvataggio del log degli ientrati e usciti.
uno schema semplice pe runa tabella del genere potrebbe essere:
--
-- Struttura della tabella 'logEntrate'
--
CREATE TABLE IF NOT EXISTS 'logEntrate' (
'id' bigint(20) unsigned NOT NULL AUTO_INCREMENT,
'idUtente' bigint(20) unsigned NOT NULL,
'dataEvento' datetime NOT NULL,
'tipoEvento' tinyint(1) unsigned NOT NULL,
'ip' varchar(45) NOT NULL,
PRIMARY KEY ('id'),
KEY 'idUtente' ('idUtente')
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Questa query ti crea una tabella con 5 campi:
id -> l'id univoco del record nel database
idUtente -> l'id dell'utente che dovrà corrispondere ad un id dell'utente nella tabella del personaggio a cui riferirsi per il recupero del nome.
dataEvento la data dell'evento che fa agiungere il record al database (ovvero in questo caso il login/logout del pg)
tipoEvento -> il tipo di evento generato (per esempio 1: entrata, 0 : sconnesso)
ip -> l'ip del giocatore che si connette
A questo punto non devi far altro che vengano inseriti un campo a dogni login/logout del pg e a questo punto richiamare la query ordinandola per l'id (visto che ad ogni id diversi corrisponderanno un'entrata successiv ain ordine cronologico del tipo:
SELECT idUtente, dataEvento, tipoEvento FROM logEntrate ORDER BY id DESC
Ho scelto di ordinarli al contrario in modo che la query mostri in ordine dall'ultimo entrato/uscito dall'alto verso il basso.
Esempio pratico: http://sqlfiddle.com/#!2/17b3b/2 ↗
E' una tabella molto generica e adtattabile in molti modi alle proprie esigenze ci sono solo da ricordarsi 3 code:
1) ad ogni idUtente nella tabella logEntrate deve esserci associato un id nella tabella personaggio per visualizzar eil nome tramite una LEFT JOIN
2) stessa cosa per il campo codEvento o si f auna associazione con un IF ELSE ai due valori usati per l'entrato e l'uscito per visualizzare il nome del tipo del record.
3) io ho usato dei campi BIGINT per id e idUtente ma se non ci si aspetta una grande massa di logEntrate o di pg i due campi pososno essere passati a INT, ricordando però in quel caso che sarebbe buona norma far corrispondere anche il tipo di dato nella tabella personaggio
19/04/2014 15:22:08
La tabella dei log l'avevo creata ma non avevo pensato di usarla anche per questo. In effetti semplifica molto le cose. Grazie mille. :-D
Per il primo problema (il controllo del login) qualcuno sa aiutarmi?
19/04/2014 15:32:40
Per la prima domanda ammetto che oggi sono un po' rinco io ma non ho capito se vuoi:
fareun controllo se il pg sia gia loggato e in caso tenti di fare un nuovo login venga restituito un messaggio dove dice appunto ch eil pg è gia loggato
oppure se vuoi far eun controllo se il pg è loggato e se non è loggato impedire l'accesso alla pagina
22/04/2014 17:26:58
Quello che vorrei è la prima che hai scritto. Se il pg è loggato vorrei che esca un messaggio tipo "il pg è già connesso, attendere 5 minuti" e che dopo 5 minuti venga distrutta la sessione di questo pg permettendogli di poter loggare.
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
RAID Shadow Legends ↗
Project Entropy ↗
Hero Wars ↗
Exclusive Villa GdR ↗
Tibia ↗