GiNeLi diese Version ist sehr sehr unelegant, besonders was die IP-Speere angeht, das geht etwas besser.
1. 2 Tabellen: für die IP-Speere und eine für den Counter.
2. Lösche alle IPs die älter sind als time()
3. IP wird abgefragt ob vorhanden, wenn nicht--->Counter + 1
3.1 IP-Speeren mit einem time() + 3600 * 12
4. Wenn IP Vorhanden Counterabfrage.
Vorteile:
1. Du kannst den Counter sehr schnell um Gestern/Heute/Gesammt erweitern.
2. Kleine Tabellen mit überschaubaren werten.
3. Nur Zahlenwerte.
4. Wenn IP-Vorhanden nur 3 Datenbankabfragen die sehr klein Sinnd, wenn nicht vorhanden sind es 4.
So dann zu deinem Script:
$ergebnis=@mysql_query("SELECT sid FROM counter");
$counter=@mysql_num_rows($ergebnis); //eingetragene Hash's zählen.
$counter="Sie sind der ".$counter." Besucher!";
würde besser aussehen mit
$ergebnis = @mysql_query("SELECT COUNT(sid) FROM counter");
$counter = mysql_fetch_row($ergebnis)
$counter = $counter[0];
Lies mal
http://www.php-einfach.de/einf_mysql_anzahl_zeilen.php
Zudem ist es vollkommen "dumm" unötig lange Hashs in der Datenbank zu speichern, da es nur Speicherplatz kostet. Lieber 2 kleine Tabellen wo aus der einen Ständig die IPs gelöscht werden und die andere hat maximal 3 Datensätze!
@ Broken Sword in einem fertigen Script macht es schon sind mit @ Fehlermeldungen zu unterdrücken. Das wirst du später merken, wobei man für die Datenbankabfragen sowie so lieber entweder ein
@mysql_query() or DIE ("Fehler: $query <br/>".mysql_error()); schreiben sollte oder eben gleich eine eigene Datenbankklasse schreiben die das mit den Fehlern übernimmt.
So und da ich nicht untätig bin-->gleich mal ran gesetzt und getestet.
Für die Datenbankstruktur:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
|
--
-- Tabellenstruktur für Tabelle `counter`
--
CREATE TABLE `counter` (
`id` int(1) NOT NULL auto_increment,
`type` varchar(255),
`time` int(10) NOT NULL,
`counter` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
--
-- Daten für Tabelle `counter`
--
INSERT INTO `counter` VALUES (1, 'heute', 1148292091, 0);
INSERT INTO `counter` VALUES (2, 'gestern', 0, 0);
INSERT INTO `counter` VALUES (3, 'gesammt', 0, 0);
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `ipsperre`
--
CREATE TABLE `ipsperre` (
`id` int(11) NOT NULL auto_increment,
`ip` varchar(50) NOT NULL,
`date` int(10) NOT NULL,
PRIMARY KEY (`id`)
);
|
|
Und der PHP-Code
php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
|
<?php
@mysql_query("DELETE FROM ipsperre WHERE date < '".time()."'");
$ip = $_SERVER['REMOTE_ADDR'];
$abfrage= "SELECT COUNT(id) FROM ipsperre WHERE ip = '$ip'";
$count = @mysql_query($abfrage);
$count = mysql_fetch_row($count);
$count = $count[0];
if($count == 0) {
$abfrage = "SELECT time, counter, id FROM counter";
$ergebnis = @mysql_query($abfrage);
while($row =mysql_fetch_assoc($ergebnis)) {
if($row['id'] == "1") {
$timestamp = time();
if(date("Ymd",$row['time']) < date("Ymd",$timestamp)) {
@mysql_query("UPDATE counter SET counter = '".$row['counter']."', time = '".$row['time']."' WHERE ID = '2'");
@mysql_query("UPDATE counter SET counter = '1', time = '$timestamp' WHERE ID = '1'");
$ycounter = $row['counter'];
$ncounter = 1;
}//Wenn Gestern, counterstand von Heute nach Gestern verschieben
else {
$ncounter = $row['counter'] + 1;
@mysql_query("UPDATE counter SET counter = '$ncounter' WHERE ID = '1'");
}//Wenn nicht Gestern um eines erhöhen
}//Counter Heute
if($row['id'] == "3") {
$gcounter = $row['counter'] + 1;
@mysql_query("UPDATE counter SET counter = '$gcounter' WHERE ID = '3'");
}//Gesammt Counter
if($row['id'] == "2") {
$ytime = $timestamp - 3600*24;
if(date("Ymd", $row['time']) == date("Ymd", $row['time'])) $ycounter = $row['counter']; //Wenn heute - 1 Tag = Gestern nimm den!
}//Counter Gestern
}//Counter
$time = time() + 12*3600;
@mysql_query("INSERT INTO ipsperre (ip, date) VALUES ('$ip','$time')");
}//Wenn IP nicht vorhanden alles weiter Zählen und IP speichern
else {
$abfrage = "SELECT time, counter, id FROM counter";
$ergebnis = @mysql_query($abfrage);
while($row=mysql_fetch_assoc($ergebnis)) {
if($row['id'] == "1") {
$timestamp = time();
if(date("Ymd",$row['time']) < date("Ymd",$timestamp)) {
@mysql_query("UPDATE counter SET counter = '".$row['counter']."', time = '".$row['time']."' WHERE ID = '2'");
@mysql_query("UPDATE counter SET counter = '0', time = '$timestamp' WHERE ID = '1'");
$ycounter = $row['counter'];
$ncounter = 0;
}//Wenn Gestern, counterstand von Heute nach Gestern verschieben
else {
$ncounter = $row['counter'];
}//Wenn nicht Gestern um eines erhöhen
}//Counter Heute
if($row['id'] == "3") {
$gcounter = $row['counter'];
}//Gesammt Counter
if($row['id'] == "2") {
$ytime = $timestamp - 3600*24;
if(date("Ymd", $row['time']) == date("Ymd", $row['time'])) $ycounter = $row['counter']; //Wenn heute - 1 Tag = Gestern nimm den!
}//Counter Gestern
}//Counter
}
echo <<<COUNTER
Gesammt: $gcounter <br/>
Gestern: $ycounter <br/>
Heute: $ncounter <br/>
COUNTER;
?>
|
|
Hab darauf geachtet nicht mehr abfragen wie nötig zu machen.

Vorallem ist die Datenbank nicht besonders groß was die ip-speere angeht.
Für die IP-Speere
$time = time() + 12*3600;
@mysql_query("INSERT INTO ipsperre (ip, date) VALUES ('$ip','$time')");
Wenn ihr hier eine andere Zeit haben wollt einfach das 12*3600 ab ändern. (Achtung Zeit in Sekunden.