(zuletzt bearbeitet )

In diesem Code wird gezeigt, wie man Klicks nur einmal am Tag zählen lassen kann. Diese sog. "IP-Sperre" funktioniert nur in Kombination mit einer MySQL-Datenbank.

Lies bitte die Kommentare aufmerksam durch, dort wird alles genau erklärt.

Werbung

Werbeblocker aktiv?

Vermutlich aufgrund eines Werbeblockers kann an dieser Stelle leider keine Werbung angezeigt werden. Als Blog ist diese Website jedoch darauf angewiesen, um diverse Kosten abdecken zu können.

Vielleicht möchtest du Servaholics ja in deinem Werbeblocker als Ausnahme hinzufügen und so unterstützen? Das wäre jedenfalls sehr nett! :-)

  1. <?php
  2. /* Vorabinformationen:
  3.   In diesem Beispiel wird als Tabelle der Beispielname "ipsperre" verwendet, dies ist natürlich anpassbar.
  4.   Diese Tabelle MÜSSEN Sie erstellen, Sie MUSS folgende Zeilen enthalten: ip und datum
  5.       Sie können folgenden SQL-Code dafür verwenden:
  6.     CREATE TABLE `ipsperre` (
  7.     `ip` VARCHAR( 100 ) NOT NULL ,
  8.     `datum` VARCHAR( 100 ) NOT NULL
  9.     )
  10. */
  11.  
  12. // Datenbankzugang
  13. $server = "localhost"; // z.B. localhost, 127.0.0.1 oder externer Server
  14. $user = ""; // Benutzername | EINFÜGEN
  15. $password = ""; // Passwort | EINFÜGEN
  16. $database = ""; // Datenbank | EINFÜGEN
  17.  
  18. // Verbindung aufbauen
  19. @mysql_connect ($server, $user, $password) or die ("Entweder der Server (Host), der Benutzername oder das Passwort stimmen nicht. MySQL gibt folgenden Error aus:".mysql_error()."");
  20. @mysql_select_db ($database) or die ("Die Datenbank ist nicht vorhanden, MySQL gibt folgenden Error aus:".mysql_error()."");
  21.  
  22. // Zeit in UNIX
  23. $timestamp2 = time();
  24. // Zeit auf Deutsch
  25. $timestamp = date("d.m.Y",$timestamp2);
  26.  
  27. // IP-Adresse ermitteln
  28. $ip = $_SERVER['REMOTE_ADDR'];
  29.  
  30. // Prüfen, ob an diesem Tag mit dieser IP schon geklickt
  31. $a = "SELECT * FROM ipsperre WHERE ip = '".$ip."' AND datum = '".$timestamp."'";
  32. $b = mysql_query($a);
  33. if (mysql_num_rows($b) == 0) { // Falls nicht
  34.     echo "IP-Sperre ist noch inaktiv.";
  35.  
  36.     // hier folgt dann Ihr PHP-Script (o.ä.), das ausgeführt werden soll //
  37.  
  38.     // Neuer Eintrag für diesen Klick
  39.     $sperren = "INSERT INTO ipsperre (ip, datum) VALUES ('".$ip."', '".$timestamp."')";
  40.     $vollenden = mysql_query($sperren);
  41.     echo "IP-Sperre ist jetzt aktiv.";
  42. } else { // Falls doch
  43.     echo "IP-Sperre aktiv."; // nichts tun
  44. }
  45. ?>

Deine Meinung zu diesem Artikel?


12 Kommentare zu "IP-Sperre per MySQL-Datenbank" (RSS)

Dan
netter Codes 🙂
Anynoum
Super. Wie du es erklärt hast 😉.
User
Wie muss ich den Code verändern, wenn die IP-Sperre nach bspw. 6h aufgehoben sein soll?
Chris
Hallo!

- In der Datenbank das Feld datum auf Typ int(255) umstellen
- Zeile 25 entfernen
- Zeile 23 ersetzen durch: $timestamp = time();
- Zeile 31 ersetzen durch:
$a = "SELECT * FROM ipsperre WHERE ip = '".$ip."' AND datum > '".($timestamp - (60*60*6))."'";

60*60*6 beschreibt hierbei sechs Stunden in Sekunden.

Der Code ist ungetestet, sollte allerdings funktionieren. 😛

Viel Spaß und Grüße,
Chris

// Hinweis: Code korrigiert (5.12.2013)
User
Vielen Dank für die superschnelle Antwort!
Habe noch nicht die Zeit gefunden es zu testen, aber denke mal das es klappt.

Großes Lob noch für die immer aktuelle Seite - auch wenn ich das Forum von About-PC vermisse 😉
Marcel
Geil. Das ist ja wesentlich einfacher als ich sowas erwartet hätte. Vielen Dank dafür. 🙂
Rainer
Leider führt die Änderung von datum auf int(255) beim sql Statement zu einer Fehlermeldung bzw. der mysql_num_rows führt so denke ich dazu das es zu der Warnung:

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in ....
ich denke das
$b = mysql_query($a);
if (mysql_num_rows($b) == 0) { // Falls nicht

Änderungen wie von Chris beschrieben habe ich durchgeführt. Leider spreche ich nicht gut PHP um das Problem zu lösen.
Somit geht eine Prüfung auf Stunden leider nicht ☹
Gibt es vielleicht eine Lösung dafür?
Chris
Hi,

füge am besten nach Zeile 32 (nach dem Aufruf von mysql_query()) die folgenden Zeilen ein und schaue dir sowohl die genaue Fehlermeldung sowie deine SQL-Anfrage an:
if (!$b) {
    echo '<p>Fehler: '.mysql_error().'</p>';
    echo '<p>SQL-Anweisung: '.$a.'</p>';
}


Gerne kannst du die Ausgabe dann auch noch einmal hier posten. 🙂

Grüße, Chris
Rainer
Wow, das nenne ich super schnell. Tja, ich habe an dem sql query nichts geändert, sondern diesen hier aus dem Script übernommen.
Wenn ich es richtig verstehe kommt -21600 aus dem sql Statement heraus .
Diesen habe ich benutzt:
$a = "SELECT * FROM ipsperre WHERE ip = '".$ip."' AND datum > '".$timestamp - (60*60*6)."'";

Fehler: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-21600'' at line 1

SQL-Anweisung: -21600'

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in J:\xamps
Chris
Probier mal folgendes:
$a = "SELECT * FROM ipsperre WHERE ip = '".$ip."' AND datum > '".($timestamp - (60*60*6))."'";

Alternativ kannst du dir mal den Wert von $timestamp ausgeben lassen.

Grüße, Chris
Rainer
Hi,

vielen lieben Dank. Damit funktioniert es . Super einen schönen Abend noch

Grüße
Rainer
Chris
Hi,

gerne, und danke für das Feedback. Ebenfalls. 🙂

Grüße, Chris