Archiv verlassen und diese Seite im Standarddesign anzeigen : Counter
Servus Leute, bin neu hier und ich muss sagen hier is ganz schön viel los. bin mir sicher, dass ich hier hilfe bekomm.
ich hab grad nen ganz simplen counter geprogt, mit textdatei und so. und jetzt will ich noch eine ip sperre hinzufügen. kann mir da einer vielleicht helfen??
also ich hab mir gedacht noch eine textdatei zu erstellen, in der die ganzen ips reingespeichert werden (so 5 Stunden lang oder so). lieg da richtig??
außerdem weiss ich gar nicht wie ich eine variable mit einer ip belegen kann. wie geht das?
Felix Kaiser
14.05.2002, 22:03
Welche Art IP Sperre? Eine IP für 5 Stunden sperren und dann wieder zulassen? Würde ich aber über MySQL machen und NICHT über eine Textdatei ;) Ist viel viel einfacher!
Die IP des Clienten befindet sich in der vordefinierten Variable $REMOTE_ADDR.
boar, danke man. das ging aber schnell.
und wie mach ich dass dann mit mysql???
tabelle mit einer spalte erstellen oder???? und was soll ich da als vorreservierte zeichenlänge nehmen?
entweder du nimmst die ip als dezimalwert, dann brauchst n integer mit 4 bytes.
oder du nimmst se halt als varchar, dann brauchts 15.
btw, du hast wohl ne multipleinterpunktionszeichenneurose???
bis ich das wort gelesen hab........
und verstanden..........
...... das hat gedauert :D
aber das stimmt schon!!! du auch oder????
nein, ich nicht! (ausser wenn ichs grad in ironischer weise verwende, wie eben.)
aso, naja egal.
ich werd ich noch oft vorbeischauen in nächster zeit, bin grad dabei meine seite neu zu progn.
TheCondor
15.05.2002, 15:50
also ich kann Dir auch nur empfehlen es mit mySQL zumachen...
Als ich mit PHP angefangen habe versuchte ich auch nen Counter mit IP-Sperre auf txt-files basierend zumachen...
Das hat zwar am Ende funktioniert, aber war dann auch schon um die 4 kb groß. Mit mySQL ist das ganze nur 1 kb groß/klein
Messiah_of_Death
15.05.2002, 16:00
für mein Selfmade counter .. setz ich ein Cookie... der hält max 86400 Sekunden.. bei jedem Besuch wird gecheckt, ob der noch existiert.. ich find das klappt prima :D und die Zugriffe werden in einer TExtdatei gelesen, incrementiert und gespeichert..
Felix Kaiser
15.05.2002, 17:53
Lass mal den Anwender Cookies deaktiviert haben, dann kannste das knicken. MySQL ist da viel zuverlässiger ...
xZeLeRaToR
15.05.2002, 20:33
wieso?
wenn er doch ne abfrage macht, ob cookies überhaupt angenommen werden! Und wenn nicht, knn er halt net voten! Ich wäre ja für eine Variante mit beidem, da Leue die nen Vote manipulieren wollten, ja einfach nur neuconnecten brauchen, bzw. die cookies löschen müssen!
cu
x
ich hab jetzt folgendes gemacht:
$db = mysql_connect(localhost, xxxxx, xxxx);
$sqlab = "select name, ip from usr_web162_1";
$sqlab .= " where ip = $REMOTE_ADDR";
mysql_close($db);
und danach wollt i ne if bedingung machen, ungefähr so:
if (!$sqlab)
- zahl von textdatei lesen
- um eins erhöhen
- dann neue zahl in textdatei schreiben
else
- zahl von txt lesen
$db = mysql_connect(localhost, xxxxx, xxxx);
- ip in datenbank speichern
mysql_close($db);
bin ich überhaupt auf dem richitgen weg, kann das so funktionieren oder ist das völliger schwachsinn???
Felix Kaiser
16.05.2002, 01:40
Ich verstehe deinen SQL Teil nicht ganz, sieht furchtbar kompliziert, obwohls einfach geht.
Du brauchst ne Tabelle mit zwei Spalten (IP, Zeitstempel). Und beim Start suchst du die Zeile, bei der die IP gleich $REMOTE_ADDR ist. Falls Erfolg nimmst du aus der Zeile den Zeitstempel. Wenn dieser z.B. älter als 12 Stunden ist -> Ok, ansonsten NICHT zählen.
So würde ich das machen. Prinzip klar?
ja das abfragen der ip mach i ja mit:
$sqlab = "select name, ip from usr_web162_1";
$sqlab .= " where ip = $REMOTE_ADDR";
tut mir jetzt leid wegen der nächsten frage :D
aber bin halt anfänger
was meinst du mit Zeitstempel und wie mach i das? :mauer:
Felix Kaiser
16.05.2002, 14:06
Zeitstempel meint einfach nur, dass es ein bestimmter Zeitpunkt ist. Wenn du in der Datenbank eine IP hinzufügen willst, musst du den Zeitpunkt angeben, wann diese IP gezählt wurde. Ist die IP bereits in der Datenbank mit einem älteren Zeitstempel, so musst du den alten Zeitstempel durch den aktuellen Zeitpunkt ersetzen.
Am besten hierzu geeignet ist die Funktion time(), welche den Unix Zeitstempel liefert (Sekunden seit 01.01.1970, 00:00:00).
als alternative zu der php funktion time(), deren output du erst zwischenspeichern musst, kannst auch die mysql funktion NOW() verwenden.
Felix Kaiser
16.05.2002, 18:30
Gute Idee sami, aber man muss time() nicht zwischenspeichern :]
In mysql_query Statements kannst du das locker mit .time(). einfügen, bei Feldtyp TEXT zumindest.
jo mit zwischenspeichern mein ich halt, dass es erst im sql query eingesetzt wird und dann so an die db gesendet.
jungs, also irgendwie häng i jetzt beim sql teil.
da hab i jetzt folgendes:
//zur datenbank verbinden
$db = mysql_connect(localhost, xxx, xxx);
//tabelle nach ip absuchen
$sqlab = "select name, ip from usr_web162_1";
$sqlab .= " where ip = $REMOTE_ADDR";
//wenn ip nich vorhanden, speichern
if (!$sqlab) mysql_db_query("ip", $sqlab);
//verbindung schließen
mysql_close($db);
und so gehts natürlich nicht, da is doch irgendwo ein fehler drin.
außerdem werden doch so ewig ip in die tabelle gespeichtert, lassen die sich auch irgendwie autmatisch löschen???
Felix Kaiser
17.05.2002, 01:53
Dass eine IP 2x in die Tabelle kommt lässt sich ja verhindern, ich glaub soviel weißte ja auch :D
Aber eine Möglichkeit, dass alte IPs automatisch nicht mehr drin sind, gibts nicht.
Ich glaub, angesicht der ganzen Sache, willstes vielleicht erstmal mit Cookies probiern? Ist viel einfacher und erzeugt keine mit der Zeit immer größer werdenden SQL Tabellen.
Aenguish
17.05.2002, 09:08
Wiso kann man denn keine "alten" EInträge aus der DB rauskicken?
Lass doch einfach das Datum mit in die DB eintragen und kick alles was älter als ...keine Ahnung... 30Tage ist!
cu Aenguish
Felix Kaiser
17.05.2002, 18:15
Jo manuell, aber es gibt keine Möglichkeit dass dies von selbst geschieht, wie bei z.B. Cookies.
Ansonsten, ok, folgendes:
-Erstelle eine MySQL Tabelle mit 2 Spalten:
Spalte 1 = Typ TEXT
Spalte 2 = Typ INT
-Über DELETE löschst du alle Zeilen deren Wert der Spalte 2 kleiner als time()-600 (600 Sek = 10 Minuten, z.B.)
-Wenn die aktuelle IP anschließend noch in der Tabelle ist -> Nicht berechtigt zu voten
-Ansonsten: IP eintragen und voten
Sorum gesehen die kürzeste Lösung.
Original von Guru
Aber eine Möglichkeit, dass alte IPs automatisch nicht mehr drin sind, gibts nicht.
klar geht das.
am besten löschst immer wenn wer votet alle alten ips (solange keiner votet spielts ja keine rolle, wenn die noch da sind).
Messiah_of_Death
17.05.2002, 20:04
?! gut.. aber wie kann ich rausfinden, ob der Typi ..nun "Cookies akzeptieren" im Browser aktiviert hat ?
Felix Kaiser
17.05.2002, 21:46
sami du Schnarchnase, überleg dir mal das Wort automatisch. Automatisch heißt für mich NICHT per Skript, dass wenn ein Feld zu alt ist es der Server automatisch aus der Tabelle löscht, bzw. die Zeile, und das gibts nicht....
Ob ein User Cookies aktiviert hat kann man so direkt nicht testen. Man merkts dann halt nur wenn man dem Anwender einen Cookie sendet, der beim nächsten Abruf des Skriptes / der Seite nicht mehr existiert (bei gültigem Expires)
automatisch (gegenteil von manuell) == der computer machts selbst, ohne einfluss eines menschlichen oder änlichem wesen.
und meine lösung passt doch, solange keiner die daten anschaut, müssen sie ja nicht aktuell sein.
Messiah_of_Death
20.05.2002, 21:06
da fällt mir ein..
mit mySQL-Tabelle und IP ....was machst du mit Leuten die ne Standleitung haben.. die haben doch immer eine _feste_ IP .. ??!
Felix Kaiser
20.05.2002, 21:36
Lass die IPs 12h lang nicht berechtigt sein zu voten. Die IP die ich jetzt habe kann sobald ich die Verbindung trenne jemand ganz anderes haben ...
Messiah_of_Death
20.05.2002, 23:50
ja ..is logisch .. (weis ich doch -_-)
kenn ja auch sites.. (das fand ich gar nicht witzig)
da komm ich zum ERSTEN mal drauf ..und da blinkt mich der Screen an ! (die war legal)
ACCESS NOT ALLOWED
YOUR IP HAS BEEN BANNED !!!
das fand ich echt komisch.. :mauer:
Felix Kaiser
21.05.2002, 00:03
Wird halt Zeit dass alles auf IPv6 umgestellt wird :]
also, hab jetzt ne tabelle mit 2 spalten erstelt:
1.) varchar (15)
2.) timestamp (14)
wenn die seite jetzt aufgerufen wird, wird mit nem code ip reingespeichert, timestamp macht er dann automatisch, der eintrag unter timestamt sieht dann so aus:
20020525150345 (keine ahung was das bedeuten könnte)
wie sieht dannn der befehl zum löschen der ip's aus, die älter als 24h sind??
mysql_???_??( select * where time < time()-6000)
so ungefähr oder? bloß weiss ich jetzt nicht die befehle dafür
mysql_query("DELETE FROM tabelle WHERE time < (UNIX_TIMESTAMP() - 86400)"
kA wie du auf 6000 gekommen bist, der tag hat 86400 sekunden.
die zahl im timestamp ist die anzahl vergangener sekunden seit dem 1.1.1970 00:00.
danke!
und die 6000 hab ich nur so hingeschrieben, weil ichs grad net ausrechnen wollte:D
aber ich hätt jetzt ein anderes problem:
mysql_select_db("usr_web162_1", $db);
$res = mysql_query("SELECT * FROM counter WHERE ip=$REMOTE_ADDR", $db);
$num = mysql_num_rows($res); (zeile 7)
ich will mit dem text prüfen ob die ip schon in der db eingespeichert wurde.
der zeigt mir aber immer eine fehlermeldung:
Warning: Supplied argument is not a valid MySQL result resource in /usr/local/httpd/htdocs/kunden/web162/html/gs/php/counter.php on line 7
das versteh ich aber nicht. der code ist doch so wie er da steht richtig.
da du die ip als char hast, musst ' drum rum machen. also ip = '$REMOTE_ADDR'
befindet sich in $db tatsächlich die verbindungskennung? oder einfach der db name?
für ersteres wärs n komischer variablenname, zweiteres wär falsch als parameter da.
ausserdem würd ich die anzahl zeilen durch SQL und ned durch php zählen lassen.
sieht dann so aus:
$res = mysql_query("SELECT COUNT(ip) AS anzahl FROM counter WHERE ip = '$REMOTE_ADDR'", $db);
$num = mysql_result($res, 0);
wow, danke!!!
mich würds aber noch interessieren für was die null da is
$num = mysql_result($res, 0);
Jan Krüger
27.05.2002, 01:29
die 0 gibt an, dass du den Wert aus dem DB-Feld mit dem Index 0 haben willst. ;)
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.