|
 |
|
| Autor |
Nachricht |
Venom Stammuser [User]

Anmeldung: 05.11.05 Beiträge: 25
|
Verfasst am: 23.12.2005, 16:25 Titel: klickcounter mit ip sperre |
|
|
guten tag.ich wollte einen klickcounter basteln.ch sollte auch eine ip sperre besitzten.ich habe auf meinen webspace in meiner mysql tabelle banner und wenn man auf sie klickt soll das gezählt werden.ich benutze die id später für die datei wo ich einmal die ip und die dazu gehörige zeit speichere.
| Code: | <?
include ("../admin/konfig.php");
$id = $_GET['id'];
dbcon();
$time = time();
$ip = getenv ("REMOTE_ADDR");
$datei = "../counter/".$id.".txt";
$verbin = "SELECT
count,
link
FROM
suche
Where
ID='".$id."';";
$verbin1 = mysql_query ($verbin) OR die (mysql_error());
$verbin2 = mysql_fetch_assoc($verbin1)or die(mysql_error());
if (file_exists ($datei)) {
$counter = fopen ($datei, "w+");
$counter1 = fread ($counter, filesize ($datei));
$counter2 = unserialize ($counter1);
if (array_key_exists ($ip,$counter2)) {
$datum = $counter2[$ip];
$wert = $time - $datum;
if ($wert >= 18000) {
$count = $verbin2["count"];
$count++;
$update = "UPDATE
suche
SET
count='".$count."'
Where
ID='".$id."';";
$verbin3 = mysql_query ($update) OR die (mysql_error());
$counter2[$ip] = $time;
$counter3 = serialize ($counter2);
fwrite ($counter, $counter3);
fclose ($counter);
header("Location: ".$verbin2['link']."");
exit;
}
}
else {
$counter2[$ip] = $time;
$counter3 = serialize ($counter2);
fwrite ($counter, $counter3);
fclose ($counter);
$count = $verbin2["count"];
$count++;
$update = "UPDATE
suche
SET
count='".$count."'
Where
ID='".$id."';";
$verbin3 = mysql_query ($update) OR die (mysql_error());
header("Location: ".$verbin2['link']."");
exit;
}
}
else {
$counter = fopen ($datei, "w+");
$counter1[$ip] = $time;
$counter2 = serialize ($counter1);
fwrite ($counter, $counter2);
fclose ($counter);
$count = $verbin2["count"];
$count++;
$update = "UPDATE
suche
SET
count='".$count."'
Where
ID='".$id."';";
$verbin3 = mysql_query ($update) OR die (mysql_error());
header("Location: ".$verbin2['link']."");
exit;
}
?> |
irgendwie zählt er aber jeden klick und nimmt gar keine rücksicht auf die ip.kann mir einer helfen. _________________ Ich will mehr Besucher ----> Pagerank-promo.de
|
|
| Nach oben |
|
 |
Metaman Power-Poster [User]


Anmeldung: 20.11.05 Beiträge: 635
|
Verfasst am: 23.12.2005, 20:19 Titel: |
|
|
hmm warum so umständlich und die IPs in einer Datei speichern???
wenn du schon Mysql nutzt , dann kannst Du doch auch die IPAdressen in der DB speichern, das erleichtert die Auswertung und Abfrage.
mein Vorschlag, eine neue Tabelle für die IP´s
mit den Spalten ID, IP und Zeit.
Angenommen eine IP SPerre von 2 Stunden.
dann könnte die Abfrage so aussehen.
select * from iptabelle where ID=$id AND IP=USERIP AND Zeit>AktuelleZeit-2Stunden
Über mysql_num_rows bekommst Du dann die Anzahl der Ergebnisse, wenn diese =0 dann wird Counterstand erhöht sonst nicht.
Bei erhöhung des Counterstandes speicherst du dann die neue IP mit Zeit und ID in der Datenbank und löscht gleichzeitig alle Einträge die älter als 2 Stunden sind.
Das ist bedeutend einfacher zu handhaben und auch sicherer als die Daten in einer Textdatei abzulegen _________________
Webmaster Lexikon
Schnäppchensuche
Wenn Du einen Clan Sponsor suchst, schreibe mich NICHT an!!!
|
|
| Nach oben |
|
 |
Venom Stammuser [User]

Anmeldung: 05.11.05 Beiträge: 25
|
Verfasst am: 24.12.2005, 09:51 Titel: |
|
|
ich glaube nicht,dass sich jemand die mühe macht und versucht etwas an meinen daten zu verändern um den klickcounter aus zu tricksen.er könnte höchstens die zeit löschen was aber bei meinen anbieter nicht möglich ist.außerdem gibt es für jede id nicht nur eine ip.wenn da jetzt 300 leute drauf klicken muss ich es trotzdem in einer spalte speichern und für jede id eine neue tablle bei wahrscheinlich mehr als 300 einträgen wäre viel zu viel.könnte vielleicht jemand meins cript nach dem fehler druch´schauen.ich amch das lieber so.
aber trotzdem danke für die anregung. _________________ Ich will mehr Besucher ----> Pagerank-promo.de
|
|
| Nach oben |
|
 |
Metaman Power-Poster [User]


Anmeldung: 20.11.05 Beiträge: 635
|
Verfasst am: 24.12.2005, 10:57 Titel: |
|
|
ok da muß ich jetzt aber noch was zu sagen.
mit der sicherheit meinte ich jetzt nicht das jemand den Counter manipuliert. sondern eher generell.
denn bei solchen Textdateien kann es passieren das die durch doopelte zugriffe gelöscht werden,
Dazu kommt auch die Serverlast. denn deine txt Datei muß ja immer erst komplett in den array eingelesen werden und kann dann erst nach der IP durchsucht werden.
wenn das aber in einer DB steht, liest du dort nur die Zeilen aus in denen die IP auch wirklich vorhanden ist.
| Zitat: | | wenn da jetzt 300 leute drauf klicken muss ich es trotzdem in einer spalte speichern und für jede id eine neue tablle bei wahrscheinlich mehr als 300 einträgen wäre viel zu viel |
auch das hast Du etwas falsch verstanden, denn für jede ID eine eigene Tabelle wäre natürlich absolut hirnrissig, bei einer solchen IP Sperre reicht eine einzige Tabelle aus, alles andere passiert über die select abfragen.
dazu brauchst du nur eine Tabelle mit den Spalten ID(deine Download ID) IPAdresse und Zeit
was die Menge der Einträge betrifft, da sehe absolut keine Probleme.
selbst bei 300 zugriffen pro Datei wäre diese Tabelle nur wenige kb groß
da man ständig die alten Einträge rauslöschen kann.
aber egal,
zu deinem Code,
da kann ich Dir im Grunde empfehlen, dir mal die einzelnen Schritte
oder besser die zwischengespeicherten Werte des Scriptes ausgeben zu lassen.
spezielle vielleicht mal die Zeilen
| Code: | $datum = $counter2[$ip];
$wert = $time - $datum;
if ($wert >= 18000) {
$count = $verbin2["count"];
|
dort würde ich einmal mal ein paar echo ausgaben zum Testen einsetzen.
ist jetzt jedoch nur eine vermutung _________________
Webmaster Lexikon
Schnäppchensuche
Wenn Du einen Clan Sponsor suchst, schreibe mich NICHT an!!!
|
|
| Nach oben |
|
 |
Venom Stammuser [User]

Anmeldung: 05.11.05 Beiträge: 25
|
Verfasst am: 24.12.2005, 11:03 Titel: |
|
|
ich werde wahrscheinlich deine methode versuchen.aber ich habe voher eine frage.wie soll ich denn an eine ip von 300 bei einer id ran kommen.kannst du mir das noch voher erklären? _________________ Ich will mehr Besucher ----> Pagerank-promo.de
|
|
| Nach oben |
|
 |
Metaman Power-Poster [User]


Anmeldung: 20.11.05 Beiträge: 635
|
Verfasst am: 24.12.2005, 12:46 Titel: |
|
|
ganz einfach.
zuerst die Tabelle für die IP´s erstellen und zwar mit den Spalten
ID Feldtyp int
IP Feldtyp Varchar Feldlänge 15
ZEIT Feldtyp varchar Feldlänge 16
diese Tabelle dann aber OHNE Primärschlüssel und OHNE auto_increment !!!
nennen wir diese Tabelle ipsperre
dann sollte folgendes passieren.
User klickt auf den Link
beim Klick wird die ID übergeben und ist als $id vorhanden,
dann wird die IP Adresse des Users ermittelt und in $ip gespeichert und die aktuelle Zeit.
die Zeit ermitelst Du mit time()
jetzt must du die dauer der IP sperre in sekunden von time abziehen
also z.b.
$aktuell=time();
$sperre=3600*2; # sind zwei Stunden
$sperrzeit=$aktuell-$sperre
jetzt kommt die prüfung ob dieser User diesen Link innerhalb der letzten 2 Stunden schonmal aufgerufen hat und zwar mit folgender select abfrage
select * from ipsperre where ID='$id' AND IP='$ip' AND ZEIT>'$sperrzeit'
Jetzt brauchst Du nur die Anzahl der ERgebnisse dieser Abfrage zählen,
das sind dann entweder 0 oder 1
das geht am besten mit der Funktion mysql_num_rows
so wenn das ergebniss =1
dann erfolgt die Weiterleitung ohne den Klick zu zählen.
wenn Ergebniss = 0
dann wird der Klick gezählt und die Daten in die Tabelle eingetragen
insert into ipsperre (ID,IP,ZEIT)values('$id','$ip','$aktuell')
dann löscht Du gleich alle alten Datensätze einfach mit
delete from ipsperre where Zeit < '$sperrzeit'
und dann erfolgt die weiterleitung zur Datei _________________
Webmaster Lexikon
Schnäppchensuche
Wenn Du einen Clan Sponsor suchst, schreibe mich NICHT an!!!
|
|
| Nach oben |
|
 |
Venom Stammuser [User]

Anmeldung: 05.11.05 Beiträge: 25
|
Verfasst am: 25.12.2005, 08:56 Titel: |
|
|
also gibt es wahrscheinlich mehrere spalten,die die selbe id haben aber verschiedene ip und die zeiten dazu gespeichert.
danke für deine hilfe
edit er gibt mir einen fehler aus
| Zitat: | | 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 '.60.77 AND zeit > 1135484783' at li |
| Code: | <?
include ("../admin/konfig.php");
$id = $_GET['id'];
dbcon();
$time = time();
$ip = getenv ("REMOTE_ADDR");
$sperre = $time - 15000;
$aufruf = "SELECT
*
FROM
ip
Where
id=".$id."
AND
ip=".$ip."
AND
zeit > ".$sperre.";";
$aufruf3 = "SELECT
*
FROM
suche
Where
ID=".$id.";";
$aufruf1 = mysql_query ($aufruf) OR die (mysql_error());
$aufruf2 = mysql_num_rows ($aufruf1) OR die (mysql_error());
$aufruf4 = mysql_query ($aufruf3) OR die (mysql_error());
$aufruf5 = mysql_fetch_assoc($aufruf4);
$aufruf10 = "DELETE FROM
ip
WHERE
zeit < ".$sperre.";";
switch ($aufruf2) {
case 1:
$unw = mysql_query($aufruf10) OR die (mysql_error());
header("Location: ".$aufruf5["link"]."");
case 0:
$aufruf5["count"]++;
$aufruf6 = "INSERT INTO
suche
(count)
VALUES
(".$aufruf5["count"].");";
$aufruf7 = mysql_query($aufruf6) OR die (mysql_error());
$aufruf8 = "INSERT INTO
ip
(id,ip,zeit)
VALUES
(".$id.",".$ip.",".$time.");";
$aufruf9 = mysql_query($aufruf8) OR die (mysql_error());
$unw1 = mysql_query($aufruf10) OR die (mysql_error());
header("Location: ".$aufruf5["link"]."");;
}
?> |
ich versteh nicht warum _________________ Ich will mehr Besucher ----> Pagerank-promo.de
|
|
| Nach oben |
|
 |
Metaman Power-Poster [User]


Anmeldung: 20.11.05 Beiträge: 635
|
Verfasst am: 25.12.2005, 21:03 Titel: |
|
|
könnte es sein das Du die Spalte IP als Int oder fload erstellt hast ???
die IP Spalte sollte am besten Varchar sein !!! _________________
Webmaster Lexikon
Schnäppchensuche
Wenn Du einen Clan Sponsor suchst, schreibe mich NICHT an!!!
|
|
| Nach oben |
|
 |
Venom Stammuser [User]

Anmeldung: 05.11.05 Beiträge: 25
|
Verfasst am: 26.12.2005, 13:23 Titel: |
|
|
ne eigentlich nicht
id, int(11) ,null nein ,standart 0,
ip,varchar(20),null nein,
zeitvarchar(20),null nein,
so steht es in meiner tabelle. _________________ Ich will mehr Besucher ----> Pagerank-promo.de
|
|
| Nach oben |
|
 |
Metaman Power-Poster [User]


Anmeldung: 20.11.05 Beiträge: 635
|
Verfasst am: 26.12.2005, 15:04 Titel: |
|
|
ich sehe leider den fehler auch nicht direkt.
aber es hilft sicher wenn du statt dem OR die (mysql_error()
ein echo mysql_error benutzt.
also das die SQL Fehlermeldung ausgegeben wird.
ansonsten auch mal die SQL Statements direkt anzeigen lassen.... _________________
Webmaster Lexikon
Schnäppchensuche
Wenn Du einen Clan Sponsor suchst, schreibe mich NICHT an!!!
|
|
| Nach oben |
|
 |
Venom Stammuser [User]

Anmeldung: 05.11.05 Beiträge: 25
|
Verfasst am: 26.12.2005, 16:05 Titel: |
|
|
muss vielleicht ein komma oder sonst was hin=vielleicht muss die anfrage in "" stehen? _________________ Ich will mehr Besucher ----> Pagerank-promo.de
|
|
| Nach oben |
|
 |
Metaman Power-Poster [User]


Anmeldung: 20.11.05 Beiträge: 635
|
Verfasst am: 26.12.2005, 17:24 Titel: |
|
|
nein aber alle werte die keine Zahl sind, sollten in einfache anführungszeichen gesetzt werden.
also
insert into TABELLE(feld1,feld2,feld3)values(1,'127.0.0.1',1234567) _________________
Webmaster Lexikon
Schnäppchensuche
Wenn Du einen Clan Sponsor suchst, schreibe mich NICHT an!!!
|
|
| Nach oben |
|
 |
Venom Stammuser [User]

Anmeldung: 05.11.05 Beiträge: 25
|
Verfasst am: 30.12.2005, 13:26 Titel: |
|
|
das script was du mir geschrieben hast funkt nicht.es sind schon 3 foren verzweifelt nach dem suchen des fehlers.
| Code: | <?
error_reporting(E_ALL);
include ("../admin/konfig.php");
$id = $_GET['id'];
dbcon();
$time = time();
$ip = getenv ("REMOTE_ADDR");
$sperre = $time -18000;
$aufruf = "SELECT
*
FROM
ip
Where
id=".$id."
AND
ip='".$ip."'
AND
zeit > ".$sperre.";";
$aufruf3 = "SELECT
*
FROM
suche
Where
ID=".$id.";";
$aufruf1 = mysql_query ($aufruf) OR die (mysql_error());
$aufruf2 = mysql_num_rows ($aufruf1) OR die (mysql_error());
$aufruf4 = mysql_query ($aufruf3) OR die (mysql_error());
$aufruf5 = mysql_fetch_assoc($aufruf4);
$aufruf10 = "DELETE FROM
ip
WHERE
zeit < ".$sperre.";";
switch ($aufruf2) {
case 1:
$unw = mysql_query($aufruf10) OR die (mysql_error());
header("Location: ".$aufruf5["link"]."");
echo "1";
break;
case 0:
$aufruf5["count"]++;
$aufruf6 = "INSERT INTO
suche
(count)
VALUES
(".$aufruf5["count"].");";
$aufruf7 = mysql_query($aufruf6) OR die (mysql_error());
$aufruf8 = "INSERT INTO
ip
(id,ip,zeit)
VALUES
(".$id.",'".$ip."',".$time.");";
$aufruf9 = mysql_query($aufruf8) OR die (mysql_error());
$unw1 = mysql_query($aufruf10) OR die (mysql_error());
header("Location: ".$aufruf5["link"]."");
echo "2";
break;
default:
echo "3";
break;
}
echo $id."<br>";
echo $ip."<br>";
echo $time."<br>";
echo $sperre."<br>";
echo $aufruf2;
?> |
die ausgabe ist eine weiße seite.da steht nichts.woran liegt das? _________________ Ich will mehr Besucher ----> Pagerank-promo.de
|
|
| Nach oben |
|
 |
Campino Beliebter [User]


Anmeldung: 19.09.04 Beiträge: 451 Wohnort: Delmenhors ...
|
Verfasst am: 30.12.2005, 14:06 Titel: |
|
|
Hi,
also wenn die Ausgabe weiß ist, dann müssten ja alle Variablen, die du ganz unten ausgibst leer sein.
Ab besten überprüftst du mal, ob die überhaupt gesetzt wurden [ if(isset()) ] . Dann müsstest du noch die Dateien überprüfen, die du per include lädst, u.U. kommentierst du da irgendwie rum, oder was weiß ich.
Dann solltest du die Rechte der Dateien überprüfen (chmod 755) und die Funktion dbcon posten.
gruß,
Campino _________________ d >_< b
|
|
| Nach oben |
|
 |
Metaman Power-Poster [User]


Anmeldung: 20.11.05 Beiträge: 635
|
Verfasst am: 30.12.2005, 16:02 Titel: |
|
|
| Zitat: | | das script was du mir geschrieben hast funkt nicht. |
sorry aber diese Aussage ist wohl nicht so ganz richtig !!!
denn dieses Script hast du selber geschrieben, und nicht ich.
ich hab lediglich versucht die auf dem richtigen Weg zu bringen...
wenn man bei einem Script absolut nicht weiterkommt, ist es manchmal vom Voteil das ding direkt zu löschen und nochmal neu anzufangen.
Hier mal ein solches Script allerdings ungetestet(also ohne Funktionsgarantie)..
must Dir jedoch den Code anschauen und namen und Variablen anpassen..
Falls Fehler im Code sein sollten, lassen sich die aber recht schnell beheben | Code: | <?
### Daten
$dbName="xxxxxxxxx"; # Datenbankname
$hostname="xxxxxxxxxxx"; # Hostname
$userdb="xxxxxxxxxx"; # Datenbank Username
$passworddb="xxxxx"; # Datenbank Passwort
$tab1="Tabelle1"; # Tabellename mit den URLS
##### im Script benutzte Feldnamen
# id, url, anzahl
$tab2="Tabelle2"; # Tabellename der IP Adressen
##### im Script benutzte Feldnamen
# id,ip,zeit
$sperre=18000; # Dauer der IP SPerre in Sekunden
## vom Script ermittelte Werte
$ip = getenv ("REMOTE_ADDR"); # IP Adresse des Users
$aktuell=time(); # aktueller Zeitwert
$sperrzeit=$aktuell-$sperre; # aktuelle Zeit minus Sperrzeit
# Mysql Verbindung
@$db = @MYSQL_CONNECT($hostname, $userdb, $passworddb);
if(!$db)
{
echo "Fehler bei Verbindung mit Datenbank";
}
@mysql_select_db($dbName,$db);
########
# URL die aufgerufen werden soll anhand der ID aus Datenbank hohlen
$sql="select url from $tab1 where id=$id";
$result=mysql_query($sql);
$menge = mysql_num_rows($result); # Anzahl der ERgebnisse prüfen
echo mysql_error();
if($menge==1){ # nur wenn eine URL ausgelesen wurde
$row=mysql_fetch_array($result);
$seitenurl=$row['url'];
# Prüfen ob der User innerhalb der IpSperrzeit die URL schonmal aufgerufen hat
$sql="select * from $tab2 where id=$id and ip='$ip' and zeit > $sperrzeit";
$result=mysql_query($sql);
$ipmenge = mysql_num_rows($result); # Anzahl der Ergebnisse prüfen
echo mysql_error();
if($ipmenge>=1){
####################################################
# Hier gehts rein wenn der Aufruf NICHT gezählt werden soll
####################################################
header("Location: $seitenurl");
exit;
} else{
####################################################
# Hier gehts rein wenn der Aufruf gezählt werden soll
####################################################
# Zähler der URL um 1 hochsetzen
$sql="update $tab1 set anzahl=anzahl+1 where id=$id";
$result=mysql_query($sql,$db);
echo mysql_error();
# IP des Users mit ID und Aktueller Zeit speichern
$sql="insert into $tab2(id,ip,zeit)values($id,'$ip',$aktuell)";
$result=mysql_query($sql,$db);
echo mysql_error();
# alte Datensätze in der IP Tabelle löschen
$sql="delete from $tab2 where zeit < $sperrzeit";
$result=mysql_query($sql,$db);
echo mysql_error();
# URL Aufrufen
header("Location: $seitenurl");
exit;
}
} else{
####################################################
# Wird nur angezeigt wenn zur ID keine URL in der DB gefunden wurde;
####################################################
echo "Fehler, mit der Aufgerufenen ID konnte keine Seite gefunden werden !!!!";
}
?> |
_________________
Webmaster Lexikon
Schnäppchensuche
Wenn Du einen Clan Sponsor suchst, schreibe mich NICHT an!!!
|
|
| Nach oben |
|
 |
|
|
 |
|
Alle Zeiten sind GMT + 1 Stunde
|
| Seite 1 von 1 |
|  |