Gjorde en anmälning till nyhetsbrev och använder en funktion som tar bort alla rader som inte aktiverats inom en viss tid. Det verkar som att tabellen får ganska mycket outnyttjat utrymme när man gör så här vilket innebär att tabellen bör optimeras mellan varven.
Du kan lösa det genom att använda funktionen OPTIMIZE. Låt säga att den finns i skriptet och körs direkt efter ovanstående om datumet uppfyller kravet.
mysql_query("DELETE FROM online WHERE ip = '$REMOTE_ADDR'");
$date = time();
mysql_query("INSERT INTO online VALUES( '$REMOTE_ADDR', '$date' )");
mysql_query("DELETE FROM online WHERE date 1 INTERVAL 5 MINUTE <= current_timestamp");
mysql_query("DELETE FROM online WHERE ip = '$REMOTE_ADDR'");
$date = time();
mysql_query("INSERT INTO online VALUES( '$REMOTE_ADDR', '$date' )");
mysql_query("DELETE FROM online WHERE date + INTERVAL 5 MINUTE <= current_timestamp");
Hmm... $REMOTE_ADDR, visst är det IP-nummret? Eller? Sen funkar inte intervaldeleten heller
mysql_query("DELETE FROM online WHERE ip = '$REMOTE_ADDR'");
$date = time();
mysql_query("INSERT INTO online VALUES( '$REMOTE_ADDR', '$date' )");
mysql_query("DELETE FROM online WHERE date + INTERVAL 5 MINUTE <= current_timestamp") or die(mysql_error());
Om man gör insert på alla kolumner som finns i tabellen så behöver man inte ange någon kolumnlista. Värdena måste då anges i samma ordning som kolumnerna är definierade.
$date = time() - 300;
mysql_query("DELETE FROM online WHERE date < $date");
mysql_query("DELETE FROM online WHERE ip = '$REMOTE_ADDR'") or die(mysql_error());
$date = time();
mysql_query("INSERT INTO online VALUES( '$REMOTE_ADDR', '$date' )");
Det som inte fungerar här är andra queryn där man tar bort alla rader som har ip = $REMOTE_ADDR.
Borde fungera tycker man.
Testa om det här fungerar.
// timestamp
$date = time();
// timestamp minus utloggningstiden
$date_out = time()- 300;
// datumet i månaden
$date_optimize = date(d);
// Besökarens ip
$ip = $HTTP_SERVER_VARS[REMOTE_ADDR];
// Plocka bort alla ip-nummer som funnits länre än $date_out
mysql_query("DELETE FROM online WHERE date < $date_out");
// Ta bort aktuell besökares ip ifall den redan existerar
mysql_query("DELETE FROM online WHERE ip='$ip'");
// Lägg till aktuell besökares ip
mysql_query("INSERT INTO online (ip, date) VALUES ('$ip', '$date')");
// Optimera tabellen en gång i månaden
if ($date_optimize == 01) {
mysql_query("OPTIMIZE TABLE online");
}
Nu är det ju besökarna själva som sköter tillägg/radering av rader och då kommer databasen att växa i takt med antalet besökare. Alla rader som raderats allokeras fortfarande av MySQL även om de inte existerar. Kan därför vara bra att frigöra utrymmet genom att optimera tabellen någon gång ibland.
Eftersom bl.a. flera företag och skolor går ut via en proxy, så blir ju inte denna typen av online-statistik särskilt tillförlitlig men det kanske inte gör något.