Come si procede normalmente per vedere tutti gli utenti che sono loggati su un sito?! sistema data/ora o cosa?
Come si procede normalmente per vedere tutti gli utenti che sono loggati su un sito?! sistema data/ora o cosa?
[ SimplyMepis 8 ]Copyleft
www.mepisitalia.org IL SITO ITALIANO UFFICIALE DI MEPIS
www.salentomovida.it LA MOVIDA DEL SALENTO HA UN NUOVO PUNTO D'INCONTRO SUL WEB
[ SUD SOUND SYSTEM MINA FUECU INTRA ALLU SALENTU ]
anche qualche script che supporti sta funzionalità che me lo studio un po'..
[ SimplyMepis 8 ]Copyleft
www.mepisitalia.org IL SITO ITALIANO UFFICIALE DI MEPIS
www.salentomovida.it LA MOVIDA DEL SALENTO HA UN NUOVO PUNTO D'INCONTRO SUL WEB
[ SUD SOUND SYSTEM MINA FUECU INTRA ALLU SALENTU ]
Potresti inserire in un db ogni visitatore che entra nel portale (controlli nel database, se non ce lo inserisci, se ce aggiorni l'ora), dopo 5 minuti se il visitatore se ne è andato, lo cancelli dal database (potresti inserire un controllo dopo 30 secondi, ma faresti appesantire il tuo sito)
Codice PHP:
@$date = date(YmdHi);
//Inserisco nel database i nuovi visitatori o aggiorno l'ora di quelli gia' presenti
$on = mysql_num_rows(mysql_query("SELECT * FROM online WHERE ip='$ip"));
if ($on>0) {
$update = mysql_query("UPDATE online SET date='$date' WHERE ip='$ip'");
} else {
$insert = mysql_query("INSERT INTO online VALUES ('$ip','$date')");
}
//Cancello dal database i dati piu' vecchi di 5 minuti
$old = mysql_query("SELECT * FROM online");
while ($row = mysql_fetch_assoc($old)) {
$ip_db = $row['ip'];
$date_db = $row['date'];
if ($date_db<($date-5)) {
$delete = mysql_query("DELETE FROM online WHERE ip='$ip_db'");
}
}
Sarebbe anche il caso di ottimizzare le query qualche volta...ad esempio:Originariamente inviato da mem
Potresti inserire in un db ogni visitatore che entra nel portale (controlli nel database, se non ce lo inserisci, se ce aggiorni l'ora), dopo 5 minuti se il visitatore se ne è andato, lo cancelli dal database (potresti inserire un controllo dopo 30 secondi, ma faresti appesantire il tuo sito)
Codice PHP:
@$date = date(YmdHi);
//Inserisco nel database i nuovi visitatori o aggiorno l'ora di quelli gia' presenti
$on = mysql_num_rows(mysql_query("SELECT * FROM online WHERE ip='$ip"));
if ($on>0) {
$update = mysql_query("UPDATE online SET date='$date' WHERE ip='$ip'");
} else {
$insert = mysql_query("INSERT INTO online VALUES ('$ip','$date')");
}
//Cancello dal database i dati piu' vecchi di 5 minuti
$old = mysql_query("SELECT * FROM online");
while ($row = mysql_fetch_assoc($old)) {
$ip_db = $row['ip'];
$date_db = $row['date'];
if ($date_db<($date-5)) {
$delete = mysql_query("DELETE FROM online WHERE ip='$ip_db'");
}
}
lo sostituirei con una REPLACE dato che IP (volendo seguire il tuo scheda), siccome unico, lo imposterei chiave primaria o unique e quindi basterebbe un:codice://Inserisco nel database i nuovi visitatori o aggiorno l'ora di quelli gia' presenti $on = mysql_num_rows(mysql_query("SELECT * FROM online WHERE ip='$ip")); if ($on>0) { $update = mysql_query("UPDATE online SET date='$date' WHERE ip='$ip'"); } else { $insert = mysql_query("INSERT INTO online VALUES ('$ip','$date')"); }
in modo da evitare anche la query SELECT.codice:REPLACE INTO online (ip, date) VALUES( '$ip', NOW() );
Poi abolirei quel WHILE xkè è un po inutile...basta costruire una query un po migliore e sostituire:
con un più rapido e pulito:codice://Cancello dal database i dati piu' vecchi di 5 minuti $old = mysql_query("SELECT * FROM online"); while ($row = mysql_fetch_assoc($old)) { $ip_db = $row['ip']; $date_db = $row['date']; if ($date_db<($date-5)) { $delete = mysql_query("DELETE FROM online WHERE ip='$ip_db'"); } }
Ovviamente tutto questo impostando il campo DATE di tipo TIMESTAMP...codice:DELETE FROM online WHERE (data + INTERVAL 5 MINUTE) < NOW()
Così in definitiva il codice risultante sarebbe:
Se analizziamo la differenza è molto grande in termini di spreco...supponendo che nella tabella "online" ci siano 1000 tuple (righe) tutte più vecchie di 5 minuti l'algoritmo proposto prima faceva: 1004 query al database ed un ciclo while da 1000 iterazioni, mentre quello che ho proposto io fa 2 query al database e nessun ciclo while.codice:$ip = $_SERVER['REMOTE_ADDR']; mysql_query("REPLACE INTO online (ip, date) VALUES( '$ip', NOW() );"); mysql_query("DELETE FROM online WHERE (data + INTERVAL 5 MINUTE) < NOW()");
Ragazzi ottimizziamo quando si può...in questo modo magari uno si può anche permettere di fare ogni minuto...tanto la query la deve fare le stesso ogni volta che qualcuno carica una pagina...
Ottimi consigli, hai ragione![]()
grazie!..ma non andrebbe messo comunque l'if per controllare se l'utente è gia inserito?..cioè..il replace non implica che ci sia già l'ip in tabella?e se non ci fosse?..Originariamente inviato da LeaderGL
Sarebbe anche il caso di ottimizzare le query qualche volta...ad esempio:
Così in definitiva il codice risultante sarebbe:
codice:$ip = $_SERVER['REMOTE_ADDR']; mysql_query("REPLACE INTO online (ip, date) VALUES( '$ip', NOW() );"); mysql_query("DELETE FROM online WHERE (data + INTERVAL 5 MINUTE) < NOW()");
[ SimplyMepis 8 ]Copyleft
www.mepisitalia.org IL SITO ITALIANO UFFICIALE DI MEPIS
www.salentomovida.it LA MOVIDA DEL SALENTO HA UN NUOVO PUNTO D'INCONTRO SUL WEB
[ SUD SOUND SYSTEM MINA FUECU INTRA ALLU SALENTU ]
scusate eh.. ma non mi fa il replace!
mi aggiunge una riga ogni volta nuova..
ho fatto la tabella online con i cambi id(chiave) ip date username
il replace con:
"REPLACE INTO online (id, ip, date, username) VALUES('','$ip', NOW(), '$username')";
il delete è ok..
[ SimplyMepis 8 ]Copyleft
www.mepisitalia.org IL SITO ITALIANO UFFICIALE DI MEPIS
www.salentomovida.it LA MOVIDA DEL SALENTO HA UN NUOVO PUNTO D'INCONTRO SUL WEB
[ SUD SOUND SYSTEM MINA FUECU INTRA ALLU SALENTU ]
Il REPLACE funzionerebbe benissimo se la tabella fosse studiata bene, in quanto questa funzione di MySQL ha la stessa valenza dell'INSERT solo che se dovesse trovare valori corrispondenti (al nuovo inserimento) per una CHIAVE PRIMARIA e una UNIQUE va a sostituire quelli che già ci sono nel database.
Quindi la tua tabella o la fai così:
oppure:codice:CREATE TABLE login ( ip VARCHAR(15) NOT NULL, data TIMESTAMP, PRIMARY KEY(ip) );
codice:CREATE TABLE login ( id INT(10) NOT NULL, ip VARCHAR(15) NOT NULL, data TIMESTAMP, PRIMARY KEY(id), UNIQUE (ip) );
anche se trovo inutile la presenza del campo ID in quanto l'identificativo univoco è sicuramente l'indirizzo IP.![]()
ok grazie ragazzi!
funziona tutto alla perfezione..
si in effetti è ridondante pero' usando il formato text per l'ip non mi permetteva di metterlo come identificativo..ora l'ho eliminato![]()
[ SimplyMepis 8 ]Copyleft
www.mepisitalia.org IL SITO ITALIANO UFFICIALE DI MEPIS
www.salentomovida.it LA MOVIDA DEL SALENTO HA UN NUOVO PUNTO D'INCONTRO SUL WEB
[ SUD SOUND SYSTEM MINA FUECU INTRA ALLU SALENTU ]
non è detto se al sito si accede da una LAN (come dall'università), l'ID univoco non può essere l'IP perchè per "n" computer è sempre quello.Originariamente inviato da LeaderGL
anche se trovo inutile la presenza del campo ID in quanto l'identificativo univoco è sicuramente l'indirizzo IP.![]()
io suggerisco una chiave "username" + "ip"
![]()
www.funkazzisti.it - The Real Venetian Funky Style
www.feempandora.it - Progetto di Ricerca sullo sviluppo sostenibile
www.e-makina.it - Web Design