Oha, schon älter, aber ich habe es nicht gesehen!
Es geht relativ einfach:
Code:
CREATE TABLE `ipcounter` (
`ipaddress` varchar(15) collate utf8_unicode_ci NOT NULL,
`time` int(10) unsigned NOT NULL,
`exacttime` int(10) unsigned NOT NULL,
UNIQUE KEY `ipaddress_time` (`ipaddress`,`time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Dadurch, dass die IP zusammen mit der zeit einen UNIQUE index bildet, kann gar kein datensatz doppelt vorkommen. Für time sehe ich hier keine stamp vor, sondern einen formatierten string im date-format.
Also für eine IP sperre von einer stunde: date('YmdH',time());
Wegen des indizies kann man dann natürlich keinen normalen INSERT mehr verwenden. Entweder nutzt man ON DUPLICATE KEY bei einem INSERT oder REPLACE INTO.
Code:
REPLACE INTO ipcounter
(
ipaddress,
time,
exacttime
)
VALUES
(
"'.$_SERVER['REMOTE_ADDR'].'",
'.date('YmdH',time()).',
'.time().'
)
Auch, wenn man als client REMOTE_ADDR eigentlich nicht manupulieren kann, sollte man nicht auf nen mysql-escape verzichten!!
Statt der php time() funktion kann man natürlich auch mysql funktionen verwenden.
Also, wie man jetzt auslies, wer wann online war:
Letzter Monat:
Code:
SELECT COUNT(*) AS counter FROM ipcounter WHERE time>='.(time()-60*60*24*30).'
Letzte Woche:
Code:
SELECT COUNT(*) AS counter FROM ipcounter WHERE time>='.(time()-60*60*24*7).'
Heute:
Code:
SELECT COUNT(*) AS counter FROM ipcounter WHERE time>='.(time()-60*60*24*1).'
Gerade online (= letzte10 minuten)
Letzter Monat:
Code:
SELECT COUNT(*) AS counter FROM ipcounter WHERE exacttime>='.(time()-60*10).'
Alles ist ungetestet und dient als vorlage!