kostenloser Webspace werbefrei: lima-city


ilch & besucherzähler

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    sebbel

    sebbel hat kostenlosen Webspace.

    Hallo Leute,

    das Problem hier geht vorwiegend an die Leute die das ilch-cms benutzen und/oder sich damit auskennen. Mein Problem also: Der tag/count">Counter sperrt jede IP ganze 24 stunden, ich möchte das auf eine übliche zeitspanne reduzieren. Ich steig aber nicht durch und das forum auf ilch.de ist auch nicht sonderlich hilfreich.

    Ich hab hier mal nen codeschnipsel, von dem ich glaube dass er für die sperre zuständig ist, vielleicht hilft das ja allen nicht-ilch-usern weiter.

    function site_statistic () {
    	if (!array_key_exists('ilchCMSstati',$_SESSION)) {
    		$_SESSION['ilchCMSstati'] = 'geloggt';
    	  $d = date('j');
    		$m = date('n');
    		$y = date('Y');
    		$ip = getip();
    		$ergResul = db_result(db_query("SELECT COUNT(ip) FROM prefix_stats WHERE ip = '".$ip."' AND `day` = ".$d." AND mon = ".$m." AND yar = ".$y ),0);
    		debug ( $ergResul.'#statistic res' );
    		if ( $ergResul == 0 ) {
    		  $os = site_statistic_get_os($_SERVER['HTTP_USER_AGENT']);
    		  $br = site_statistic_get_browser($_SERVER['HTTP_USER_AGENT']);
    		  $wt = date('w');
    		  $st = date('G');
    		  $ur = ( isset ($_SERVER['HTTP_REFERER']) ? site_statistic_get_referer($_SERVER['HTTP_REFERER']) : '' );
    		  db_query("INSERT INTO prefix_stats (wtag,stunde,`day`,mon,yar,os,browser,ip,ref)
    			VALUES(".$wt.",".$st.",".$d.",".$m.",".$y.",'".$os."','".$br."','".$ip."','".$ur."')");
    		
    		  $dc = ( strlen ($d) == 1 ? '0'.$d : $d );
    			$mc = ( strlen ($m) == 1 ? '0'.$m : $m );
    		  $cdate = $y.'-'.$mc.'-'.$dc;
    			$query = "SELECT COUNT(date) FROM `prefix_counter` WHERE `date` = '".$cdate."'";
    		  if ( db_result(db_query($query),0) == 0 ) {
    		    db_query('INSERT INTO `prefix_counter` VALUES ( "'.$cdate.'" , "1" ) ' );
    		  } else {
    		    db_query('UPDATE `prefix_counter` SET `count` = `count` +1 WHERE `date` = "'.$cdate.'"');
    		  }
    	  }
      }
    }


    Schonmal danke für die hilfe

    function getip() {
      if (getenv("HTTP_X_FORWARDED_FOR")) {
         return (getenv("HTTP_X_FORWARDED_FOR"));
      } else {
         return (getenv("REMOTE_ADDR"));
      }
    }


    Beitrag geändert: 31.10.2006 17:07:31 von sebbel
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo sebbel,
    ich konnte jetzt auf die Schnelle auch nicht herausfinden, welcher Teil des Codes für die Sperre verantwortlich ist.
    Die benutzte Funktion getip() ist mir jedoch nicht bekannt, poste deshalb bitte noch den Code, mit welchem diese Funktion definiert ist (bitte nicht als neues Posting, sondern als Edit des Topics).

    Gruß
    ferdinand24
  4. Wenn du die IP sperre auf Stunden auslegen willst muss bei der date abfrage noch "H" abgefragt werden für Hour.
    Das wiederum muss dann auch in die DB eingetragen werden
    und es muss dann auch später beim abfragen die Stunden zeit abgefragt werden.

    Beitrag geändert: 31.10.2006 18:48:36 von garlian
  5. Autor dieses Themas

    sebbel

    sebbel hat kostenlosen Webspace.

    ja und wie mach ich das?
    Wenns ich könnte hätt ich ja den Fred nicht eröffnet :-)
  6. Gib mal die komplette Datei, wenn´s geht.
  7. Autor dieses Themas

    sebbel

    sebbel hat kostenlosen Webspace.

    Also, da das offensichtlich etwas größeres ist, bin ich bereit einen finanziellen obolus zu leisten. Wer interesse hat soll sich melden
  8. Ich kann leider nur sagen, dass was dort steht an Code macht nur was es sagt:
    site_statistic ()

    Es legt also eine Statistik an.

    User werden, davon aber nicht ausgesperrt, dafür müsste was mehr geschechen im Code, als DB count Abfragen und schreiben von Daten in DB.

    Man bräuchte glaub ich schon den ganzen Code, um was zu finden ...
  9. Autor dieses Themas

    sebbel

    sebbel hat kostenlosen Webspace.

    man brauch wohl noch diese debug funktion, oder?

    Ich kann dem oder den interessierten auch gerne den ganzen code zukommen lassen.

    Beitrag geändert: 1.11.2006 12:47:12 von sebbel
  10. Autor dieses Themas

    sebbel

    sebbel hat kostenlosen Webspace.

    demjenigen der diese kleine änderung zum laufen bringt, dem zahle ich 10 Euro
  11. So schwer scheint es garnicht zu sein. ;)
    Eigendlich musst du nur hier etwas ändern.
    sebbel schrieb:
    function site_statistic () {
    		$ergResul = db_result(db_query('SELECT COUNT(ip) FROM prefix_stats WHERE ip = ''.$ip.'' AND `day` = '.$d.' AND mon = '.$m.' AND yar = '.$y ),0);
    		debug ( $ergResul.'#statistic res' );
    		if ( $ergResul == 0 ) {



    Bei dieser abfrage wird gefragt ob die IP heute schon einen eintrag hat.
    Wenn nicht ist $ergResul == 0 und somit wird einer angelegt.

    Was du machen musst ist, den Letzen eintrag der IP zu holen und dann nachzuschauen wann der Eintrag war (Es wird auch die Uhrzeit gespeichert Allerdings nicht die Minuten sonder nur die Stunden).

    Also wenn +/- eine Stunde ok ist musst du nichts an der Datenbank ändern.
    Sondern nur:
    $ergResul = db_result(db_query('SELECT COUNT(ip) FROM prefix_stats WHERE ip = ''.$ip.'' '),0);
    Ändern, damit holst du dir alle Einträge der IP.
    Und dann musst du dir nur den letzten Raussuchen (kannst du auch über die abfrage machen).
    Wenn du dir die Uhrzeit und das Datum aus der Rückgabe geholt hast, dann vergleichst du es mit den aktuellen Datum.

    P.S. solltest du vorhaben die DB zu ändern dan füge anstatt der Minuten besser einen Timestamp ein. Und den könntest du dann in der Abfrage abfragen.

    Jens
  12. Autor dieses Themas

    sebbel

    sebbel hat kostenlosen Webspace.

    Hi,

    danke für die Anwort, das bringt mich schonmal ein gutes stück weiter. Ich hatte vor, das ganze auf übliche 30 Minuten festzulegen. Wie muss dann der Code aussehen, was muss ich in der Datenbank ändern?

    Schonmal vielen Dank
  13. Dann würde ich dir raten, statt drei feldern mit `day`, `mon`, `yar`
    Ein feld `time` zu verwenden.

    das würde dann so aussehen:

    $ergResul = db_result(db_query('SELECT COUNT(ip) FROM prefix_stats WHERE ip = ''.$ip.'' AND `time` > ' .time()-1800. ' ),0);
    debug ( $ergResul.'#statistic res' );
    if ( $ergResul == 0 ) {

    Die 1800 sind deine 30 Min, aber in sekunden.
  14. Autor dieses Themas

    sebbel

    sebbel hat kostenlosen Webspace.

    funktioniert das eigentlich dann auch wenn der letzte besuch um 23:50 war und der neue aufruf dann um 00:20 kommt, also sich diese Sperre mit dem beginn eines neuen tages überschneidet.
    Und wie sieht der rest von dem code nach
    if ( $ergResul == 0 ) { ...

    aus?

    Der muss doch dann auch geändert werden, damit der in die tabelle auch diesen timestamp einträgt wenn die IP noch nicht geloggt wurde

    Beitrag geaendert: 27.11.2006 10:04:11 von sebbel
  15. sebbel schrieb:
    funktioniert das eigentlich dann auch wenn der letzte besuch um 23:50 war und der neue aufruf dann um 00:20 kommt, also sich diese Sperre mit dem beginn eines neuen tages überschneidet.


    Bei eine Timestamp ist das kein Problem. Ich verstehe eigendlich nicht, warum die das nicht so gemacht haben.
    Allerdings würde ich die anderen Daten trozdem speichern.
    Es könnte ja sein, dass sie noch an einer anderen Stelle in System genutzt werden.


    Und wie sieht der rest von dem code nach
    if ( $ergResul == 0 ) { ...

    aus?

    Der muss doch dann auch geändert werden, damit der in die tabelle auch diesen timestamp einträgt wenn die IP noch nicht geloggt wurde


    Das schöne ist wenn du TIMESTAMP benutzt. Musst du da garnicht ändern. Da ein TIMESTAMP bei jeder ändern automatisch aktuallisert wird.
    Allerdings ist ein TIMESTAMP was anderes als das was man bei PHP kennt darum musst du ihn mit der Funktion UNIX_TIMESTAMP() umwandeln.



    speedtouch92 schrieb:
    Ein feld `time` zu verwenden.


    Benutze an besten:
    `myTime` TIMESTAMP(14)

    speedtouch92 schrieb:
    das würde dann so aussehen:

    $ergResul = db_result(db_query('SELECT COUNT(ip) FROM prefix_stats WHERE ip = ''.$ip.'' AND `time` > ' .time()-1800. ' ),0);
    debug ( $ergResul.'#statistic res' );
    if ( $ergResul == 0 ) {

    Die 1800 sind deine 30 Min, aber in sekunden.


    Wenn du es mit TIMESTAMP machst dann musst du das ein bisschen ändern.

    $ergResul = db_result(db_query('SELECT COUNT(ip) FROM prefix_stats WHERE ip = ''.$ip.'' AND UNIX_TIMESTAMP(`myTime`) > ' .time()-1800. ' ),0);
    debug ( $ergResul.'#statistic res' );
    if ( $ergResul == 0 ) {

    Aber mehr musst da an deinen Skript eigendlich nicht ändern.

    Fassen wir mal zusammen.
    Du musst in der Datenbank eine zusätzliche Spalte von typ TIMESTAMP(14) anlegen.
    Und dann diese eine Zeile ändern.

    Mehr brauchst du nicht machen.

    Jens

    Beitrag geaendert: 27.11.2006 12:29:31 von jacr
  16. Autor dieses Themas

    sebbel

    sebbel hat kostenlosen Webspace.

    also wenn ich das so mache, dann bekomme ich

    Parse error: parse error, unexpected T_CONSTANT_ENCAPSED_STRING in ... on line 126

    und das ist exakt diese zeile:
    $ergResul = db_result(db_query('SELECT COUNT(ip) FROM prefix_stats WHERE ip = ''.$ip.'' AND UNIX_TIMESTAMP(`myTime`) > ' .time()-1800. ' ),0);

    edit: die zeile myTime sieht so aus:
    Feld Typ Attribute Null Standard Extra
    myTime timestamp(14) Ja NULL

    und in alle felder hat er jetzt 20061129062327 eingetragen, auch in die alten einträge. Ist das normal?

    Beitrag geaendert: 29.11.2006 6:57:35 von sebbel

  17. also wenn ich das so mache, dann bekomme ich

    Parse error: parse error, unexpected T_CONSTANT_ENCAPSED_STRING in ... on line 126

    und das ist exakt diese zeile:
    $ergResul = db_result(db_query('SELECT COUNT(ip) FROM prefix_stats WHERE ip = ''.$ip.'' AND UNIX_TIMESTAMP(`myTime`) > ' .time()-1800. ' ),0);


    Ich habe halt das benutzt was du gepostet hast. Da ist der Fehler schon drin.
    Vielleicht hat da Lima-City was geändert.
    Aber eigendlich sollte klar sein, wo der Fehler ist. ;)

    So müsste das dann aussehen.

    $ergResul = db_result(db_query('SELECT COUNT(ip) FROM prefix_stats WHERE ip = '.$ip.' AND UNIX_TIMESTAMP(`myTime`) > ' .(time()-1800)),0);

    Natürlich nicht geteste, somit können da kleinere Fehler noch drin sein. ;)


    edit: die zeile myTime sieht so aus:
    Feld Typ Attribute Null Standard Extra
    myTime timestamp(14) Ja NULL

    und in alle felder hat er jetzt 20061129062327 eingetragen, auch in die alten einträge. Ist das normal?



    Ob das jetzt normal ist, kann ich dir nicht sagen.
    Müsste dann erstmal selber nachlesen.
    Ist aber nicht schlimm, dass er bei allen das aktuelle Datum (2006.11.29. 06:23 27 sec) Einträgt.

    Jens
  18. Autor dieses Themas

    sebbel

    sebbel hat kostenlosen Webspace.

    so, der code an sich spuckt jetzt keine fehlermeldung mehr aus, nur wenn ein neuer besucher auf die seite kommt, der noch nicht gezählt, dann kommt

    Warning: mysql_result(): supplied argument is not a valid MySQL result resource in ...mysql.php on line 44

    und line 44 ist folgendes

    function db_result ($erg, $zeile, $spalte=0) {
    return (mysql_result ($erg,$zeile,$spalte)); <<<<<------
    }


    ich hab noch nicht getestet ob das mit der reloadzeit geht, das mach ich irgendwann nachts wenn nix los ist, aber wenn das funzt, dann setz ich einfach vor die zeile ein @ wenn keiner einen besseren vorschlag ha

    edit: mit einer geringeren reloadzeit (1 sekunde) hats mal nicht funktioniert
    edit2: mit 180 sekunden scheint es ganz offensichtlich zu funktionieren, exakt testen tue ich das heute oder morgen nacht wenn keiner mehr unterwegs ist und evtl messungen stören könnte.

    edit3: also das funzt nicht. nach 180 sekunden und danach die seite aktualisieren das funzt net. Wenn ich den browser schließe und neu öffne, dann gehts. Das geht aber jedesmal, auch wenn ich es alle 10 sekunden machen würde.
    Kann das was mit sessions zu tun haben?

    Beitrag geaendert: 29.11.2006 19:58:46 von sebbel

    Beitrag geaendert: 29.11.2006 20:17:14 von sebbel

    Beitrag geaendert: 30.11.2006 2:41:42 von sebbel
  19. Autor dieses Themas

    sebbel

    sebbel hat kostenlosen Webspace.

    *mal ganz schüchtern nachfrag ob jemand ne lösung hat*
  20. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!