Webdesign in Siegen

IP-Sperre im Counter funktioniert nur aufm Localhost

Fragen zum Thema PHP können hier gestellt werden

Moderator: Basti

IP-Sperre im Counter funktioniert nur aufm Localhost

Beitragvon SvenSun am 25.09.2007, 21:38

Also ich hab folgendes Problem: Habe gerade das Counter Modul für ".svensun - web development center" geschrieben und auch ausgiebig auf meinem Localhost getestet. Aber nu wenn ichs auf meinen Webspace lade funktioniert plötzlich die IP-Sperre nicht mehr und der zählt jeden Aufruf der Seite... Ich verzweifle hier noch also helft mir bitte ^^

Code: Alles auswählen
$ip = $_SERVER['REMOTE_ADDR']; // IP des Besuchers
$timestamp = time(); // Timestamp
$search_ip = mysql_query("SELECT ip, timestamp FROM wdc_counter WHERE ip = '$ip' ORDER BY timestamp DESC LIMIT 0,1"); // Suche nach IP in Datenbank
if(mysql_num_rows($search_ip) == 0){ // Wenn IP nicht in Datenbank
   $save_ip = mysql_query("INSERT INTO wdc_counter (ip, timestamp) VALUES ('$ip', '$timestamp')"); // IP in Datenbank eintragen
}else{
   while($time_ip = mysql_fetch_array($search_ip)){
      if($timestamp - $time_ip['timestamp'] > 1800){
         $save_ip = mysql_query("INSERT INTO wdc_counter (ip, timestamp) VALUES ('$ip', '$timestamp')"); // IP in Datenbank eintragen
      }
   }
}
Bild
Benutzeravatar
SvenSun
Mitglied
 
Beiträge: 916
Registriert: 04.09.2005
Wohnort: DE | Müllheim-Baden | BW

Beitragvon Manuel am 25.09.2007, 21:45

Hi Sven!

Hast du die Sachen denn mal durchgetestet? Schreibt er die IP in die Datenbank? Wird die IP korrekt ausgelesen und verglichen? Wird die eigene IP im Netz korrekt angezeigt?

Quasi kann es nur an solchen Dingen liegen, wenn es ja lokal vom Quellcode her funktioniert hat, es sei denn es hat dort schon irgendwie nicht so richtig funktioniert, was man ja auch oft nicht so richtig bemerkt wenn man nicht so ausgiebig testet (Beispiel: Whitebox-, Blackboxtest usw.)

Lg,
Manuel ;-]
Benutzeravatar
Manuel
Site Admin
 
Beiträge: 8787
Registriert: 10.12.2004
Wohnort: Asbach

Beitragvon SvenSun am 25.09.2007, 21:51

Also in der Datenbank steht immer die gleiche IP und die Zeitstempel stimmen auch, also wird es ja wohl auch richtig verglichen haben...
Bild
Benutzeravatar
SvenSun
Mitglied
 
Beiträge: 916
Registriert: 04.09.2005
Wohnort: DE | Müllheim-Baden | BW

Beitragvon Manuel am 25.09.2007, 22:20

Wo hängt es denn? Trägt er denn bei jedem Aufruf die IP dann wieder neu ein obwohl diese schon in der Datenbank steht? Wenn ja, dann scheint eben bei diesem Vergleich etwas nicht zu stimmen oder der Wert wird nicht korrekt aus der Datenbank ausgelesen, denn sonst würde dieser Teil doch gar nicht durchlaufen werden oder?
Benutzeravatar
Manuel
Site Admin
 
Beiträge: 8787
Registriert: 10.12.2004
Wohnort: Asbach

Beitragvon Persisteus am 26.09.2007, 16:22

Code: Alles auswählen
$search_ip = mysql_query("SELECT ip, timestamp FROM wdc_counter WHERE ip = '$ip' ORDER BY timestamp DESC LIMIT 0,1");

Warum steht 0,1 hinter LIMIT? Da müsste doch 1 hin, oder?

Die While-Schleife find ich übrigens auch ziemlich überflüssig.
Persisteus
Mitglied
 
Beiträge: 39
Registriert: 29.07.2007

Beitragvon Basti am 26.09.2007, 17:33

In dem Fall sind die Angaben bei Limit identisch. Bei LIMIT kann man entweder nur eine Angabe machen, die dann festlegt, wieviele Datensätze zurückgegeben werden sollen, oder eben bei Bedarf zwei Parameter, wobei der erste für den Beginn der Abfrage steht (z.B. bei Seitenaufteilung wichtig) und der zweite wie zuvor für die Anzahl der Datensätze, die zurückgegeben werden sollen.

Ich habe jetzt aber auf die Schnelle auch keinen möglichen Fehler gefunden, vielleicht find ich ja gleich noch was ;)

//edit: @SvenSun: Ich würde dein Script mal ein bisschen anders strukturieren und konzipieren, so wie es im Moment ist finde ich das persönlich sehr unpraktisch und komisch gelöst.

Ich würde einfach in der Datenbank die IP, die Besuchszeit und die letzte Aktivität speichern.
So sparst du Platz in der Datenbank und es ist einfacher zu verwalten.
Dann würde ich einfach abfragen, ob die aktuelle IP schon in der Datenbank steht.
Ist das der Fall, wird die letzte Aktivität aktualisiert, wenn nicht, erstellst du eine neue Zeile.

Außerdem würde ich die if-Abfragen für den "Such"query eher so gestalten:

Code: Alles auswählen
$result = mysql_query(QUERY);
if($result && mysql_num_rows($result)>0)
{
// Aktivität aktualisieren
}
else {
// neuer Eintrag
}


So wird nicht nur überprüft, ob der Query durchgeführt werden konnte (was ja noch nichts darüber aussagt, ob ein Ergebnis zurückgeliefert wurde), sondern eben auch, ob es passende Datensätze gab.
Das ist vielleicht auch der Grund dafür, dass dein aktuelles Script nicht wirklich zuverlässig arbeitet ;)
Benutzeravatar
Basti
Moderator
 
Beiträge: 1889
Registriert: 15.06.2006
Wohnort: Rheinbreitbach


Zurück zu PHP

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast