YourWBB


yourWBB » yourWBB Misc * » Das Proggen » MySQL und PHP » MySQL-Counter mit IP-Sperre » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag 3.970 Views | | Thema zu Favoriten hinzufügen

Neues Thema erstellen Antwort erstellen

Zum Ende der Seite springen MySQL-Counter mit IP-Sperre
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
24Bytes 24Bytes ist männlich
Der Coolste


Dabei seit: 19.07.06
Beiträge: 2.909
Fähigkeiten: WBB3 Anfänger; WBB2 Profi; WBB Lite 2 Anfänger; WBB Lite 1 Fortgeschritten
Forenversion: 3.0; 2.3

 MySQL-Counter mit IP-Sperre Antworten Zitieren Editieren Melden       UP

guten tag,
hier mal ein tutorial, wie man ein mysql-counter mit ip-sperre erstellt (egal ob für wBB oder nicht).
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:
<?php
//counter.php
$host="";  //mysql-host
$user="";  //mysql-user
$pass="";  //mysql-pass
$db="";  //mysql-datenbank
$verbindung=@mysql_connect($host$user$pass) or die ("Fehler!"); //mysql-verbindung
@mysql_select_db($db) or die ("Fehler!"); //mysql-datenbank verbindung
$sid=$_SERVER['REMOTE_ADDR'];  //besucher-ip
$sid.=gethostbyaddr($sid);  //besucher-host
$sid.=date("d.m.Y");  //datum des Besuchs
$sid=md5($sid);  //md5 generierter hash aus ip,host,datum
$check=0;  //abfrage, ob md5 hash in datenbank vorhanden ist
$i=@mysql_query("SELECT sid FROM counter WHERE sid='".$sid."'");
while($i=@mysql_fetch_array($i)){
  $check=1;
}
if($check !==1){  //falls nicht, eintragen
  @mysql_query("INSERT INTO counter (sid) VALUES ('".$sid."')");
}
$ergebnis=@mysql_query("SELECT sid FROM counter");
$counter=@mysql_num_rows($ergebnis);  //eingetragene Hash's zählen.
$counter="Sie sind der ".$counter." Besucher!";
@mysql_close($verbindung);
?>

damit werden alle besucher völlig anonym gezählt und 100% keiner doppelt (es sei den, ip/host/datum ändern sich).
nun muss man nur noch $counter oder echo $counter; irgendwo einfügen!

__________________
Online Passwort Generator

Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von 24Bytes: 20.05.06 23:34.

20.05.06 23:32 24Bytes ist offline E-Mail Finden Als Freund hinzufügen
Broken Sword Broken Sword ist männlich
Mitglied


images/avatars/avatar-5300.jpg

Dabei seit: 18.06.04
Beiträge: 537
Forenversion: 2.3

 Anregung Antworten Zitieren Editieren Melden       UP

Aber das Script wird die Datenbank doch ganz schön belasten, ich stell mir das auf einer Seite mit 100 Besuchern (pro Tag Augenzwinkern ) und mehr vor. Da kommen schon MB zusammen.
Nimm doch einfach noch eine Tabelle und speicher dort die Zahl (INT halt) und die andere erweiterst du mit einer Datumsspalte und die wird nach jedem Tag gelöscht.

Außerdem versteh ich nicht warum du bei jeder mysql-Funktion mit @ die Fehler unterdrückst. Außerdem ist keine Fehlersuche möglich, da nie mit mysql_error() gearbeitet wird.
Auch die while-Schleife in Zeile 15 nenn ich Sinnlos, wie viel Einträge erwartest du? Es kann nur ein Eintrag vorhanden sein.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Broken Sword: 22.05.06 11:20.

22.05.06 08:06 Broken Sword ist offline WWW Finden Als Freund hinzufügen
Game(R)ST Game(R)ST ist männlich
Mitglied


Dabei seit: 21.08.05
Beiträge: 101
Fähigkeiten: WBB3 Profi
Herkunft: Veraltet
Forenversion: 3.0

Antworten Zitieren Editieren Melden       UP

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. Augenzwinkern 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.

__________________
Überzeugter vB-Besitzer.
Aber genau so gerne setzte ich das wBB ein.

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Game(R)ST: 22.05.06 12:07.

22.05.06 11:47 Game(R)ST ist offline E-Mail Finden Als Freund hinzufügen
Broken Sword Broken Sword ist männlich
Mitglied


images/avatars/avatar-5300.jpg

Dabei seit: 18.06.04
Beiträge: 537
Forenversion: 2.3

Antworten Zitieren Editieren Melden       UP

Zitat:
Original von Game(R)ST
@ 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.

Und der wäre? Dass man als User einfach nur sagen kann "Weiß auch nicht warum, aber geht nicht!"?
Sehr unlogisch.


Habe mal mein Script angehangen, in dem auch das Problem mit der Einbindung in der Homepage erledigt sein müsste.

Dateianhang:
zip mastercount.zip (7 KB, 5 mal heruntergeladen)
22.05.06 16:15 Broken Sword ist offline WWW Finden Als Freund hinzufügen
Game(R)ST Game(R)ST ist männlich
Mitglied


Dabei seit: 21.08.05
Beiträge: 101
Fähigkeiten: WBB3 Profi
Herkunft: Veraltet
Forenversion: 3.0

Antworten Zitieren Editieren Melden       UP

Zitat:
Original von Broken Sword
Zitat:
Original von Game(R)ST
@ 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.

Und der wäre? Dass man als User einfach nur sagen kann "Weiß auch nicht warum, aber geht nicht!"?
Sehr unlogisch.


Habe mal mein Script angehangen, in dem auch das Problem mit der Einbindung in der Homepage erledigt sein müsste.

Es geht einfach darum das, wenn wir Fehler zeigen, diese entweder direkt zeigen über mysql_error() oder über eine eigene Fehlerbehandlung!
Wenn du eine SQL-Klasse schreibst (hab jetzt eine für mysql und mysqli sowie mssql) legst du die Fehlerbehandlung in die Klasse und schreibst im normal fall ein
function sql_query($querstring) {
$this->querystring = $querystring
$query = @mysql_query($this->querystring) or $this->sql_error(2);
return $query;
}
Um eben so ganz bestimmte Sachen zuverhindern. Nicht jeder muss einen PHP-Fehler sehen und besonders nicht die vom mysql_query Befehel. Offenbart oft schöne Angriffspunkte und Schwächen. Augenzwinkern

__________________
Überzeugter vB-Besitzer.
Aber genau so gerne setzte ich das wBB ein.
22.05.06 17:02 Game(R)ST ist offline E-Mail Finden Als Freund hinzufügen
Broken Sword Broken Sword ist männlich
Mitglied


images/avatars/avatar-5300.jpg

Dabei seit: 18.06.04
Beiträge: 537
Forenversion: 2.3

Antworten Zitieren Editieren Melden       UP

Zitat:
Original von Game(R)ST
Offenbart oft schöne Angriffspunkte und Schwächen. Augenzwinkern

Eigentlich nicht oô
Mir fällt jedenfalls auf Anhieb nichts ein, was dadurch gefährdet sein könnte.
22.05.06 17:37 Broken Sword ist offline WWW Finden Als Freund hinzufügen
Game(R)ST Game(R)ST ist männlich
Mitglied


Dabei seit: 21.08.05
Beiträge: 101
Fähigkeiten: WBB3 Profi
Herkunft: Veraltet
Forenversion: 3.0

Antworten Zitieren Editieren Melden       UP

Zitat:
Original von Broken Sword
Zitat:
Original von Game(R)ST
Offenbart oft schöne Angriffspunkte und Schwächen. Augenzwinkern

Eigentlich nicht oô
Mir fällt jedenfalls auf Anhieb nichts ein, was dadurch gefährdet sein könnte.

glaub mir, da gibts nen paar nette löcher... besonders wenn register_globals auf on sind. Augenzwinkern

__________________
Überzeugter vB-Besitzer.
Aber genau so gerne setzte ich das wBB ein.
23.05.06 12:21 Game(R)ST ist offline E-Mail Finden Als Freund hinzufügen
Broken Sword Broken Sword ist männlich
Mitglied


images/avatars/avatar-5300.jpg

Dabei seit: 18.06.04
Beiträge: 537
Forenversion: 2.3

Antworten Zitieren Editieren Melden       UP

Zitat:
Original von Game(R)ST
glaub mir

Würde ich das tun, hät ich ja geschrieben, "ok".
Hab ich aber nicht Augenzwinkern
23.05.06 14:59 Broken Sword ist offline WWW Finden Als Freund hinzufügen
Baumstruktur | Brettstruktur
Gehe zu:

Neues Thema erstellen Antwort erstellen

yourWBB » yourWBB Misc * » Das Proggen » MySQL und PHP » MySQL-Counter mit IP-Sperre