Martin: + MySQL: Tabelle auswerten

Hallo zusammen,

beim Aufruf meiner Seiten schreibt eine kleines Script immer einen Eintrag in eine MySQL-Tabelle und hält somit immer das Datum und die IP-Adresse des Users fest.

Jetzt möchte ich die Tabelle auswerten - sie sieht so aus:
logid|datum|ip
1|2004-04-01|123.456.789.5

Ich benutze dafür zur Zeit folgendes Script um die unetrschiedlichen User auszugeben:

//User auswerten
 $count_user = 0;
 $query = "SELECT ip FROM logs GROUP BY ip ORDER BY ip";
 $result = MYSQL_QUERY($query,$conn);
 while ($row = mysql_fetch_array ($result))
 {
 $count_user++;
 }

Dabei werden jetzt alle unterscheidlichen IPs gezählt. Das klappt soweit ganz gut. Allerdings gibt es das Problem, dass ja z.B. ein User vor 5 Stunden da war und jetzt wieder da ist und dazu noch die gleiche IP-Adresse verwenden - dann wird dies aber nicht als zwei Besuche gezählt ...
Ich weiß, das Ganze ist sowieso nicht so ganz genau - mir würde es aber ausreichen, wenn das Ergebnis meiner MySQL-Auswertung alle IP ausgeben würde, wobei jeweils die IPs einer Stunde zusammengefasst werden sollten.

Ich hoffe mich hat jemand verstanden und kann mir helfen ...

Gruss, Martin

  1. Das mit der Auswertung pro Stunde ist wahrscheinlich derzeit nicht möglich, weil Du unter datum eben nur das datum, nicht aber die Uhrzeit eintragen lässt. Wenn Du das aber änderst und etwa in der Spalte time Datum und Uhrzeit erfasst, könnte es mit folgendem SELECT-Befehl klappen:

    SELECT COUNT(ip) AS count_user, HOUR(time) AS stunde FROM logs GROUP BY HOUR(time), ip;

    Es müsste (?, konnte es nicht ausprobieren) eine Tabelle mit den Einträgen: count_user, stunde herauskommen, wo für jede Stunde die Anzahl der ip's enthalten ist... (hoffentlich) Das würde Dir dann auch die anschließende Zählschleife ersparen.

    Axel

    1. hi axel,

      erstmal danke ... aber leider funktioniert es nicht :-(((
      da ich mich nicht auskenne, weiss ich auch nicht, was ich machen kann. wäre nett, wenn mir jemand weiter helfen könnte ...

      martin

    2. Hallo nochmal,

      kann mir evtl noch jemand anderes bei meinem Problem (s.o.) helfen?

      Gruss, Martin

  2. Hallo zusammen,

    hallo martin,

    //User auswerten
     $count_user = 0;
     $query = "SELECT ip FROM logs GROUP BY ip ORDER BY ip";
     $result = MYSQL_QUERY($query,$conn);
     while ($row = mysql_fetch_array ($result))
     {
     $count_user++;
     }

    ich würde das zählen der datenbank überlassen, dann sparst du dir die while-schleife:
    'SELECT COUNT(DISTINCT ip) FROM logs'

    für die lösung deines eigentlichen problems fällt mir auf die schnelle nur eins ein: erweitere die log-tabelle um ein feld 'timestamp' des typs timestamp und prüfe vor dem eintragen, ob in der tabelle schon eine zeile mit der gleichen ip und einem timestamp der nicht älter als eine stunde ist, existiert. in dem fall wird nichts eingetragen. so in etwa:

    //check ob neuer user
    $ip = getenv('REMOTE_ADDR');
    $now = time();
    $query = "SELECT ip FROM logs WHERE ip=".$ip."AND ".$now." - unix_timestamp(timestamp) < 3600";
    $result = MYSQL_QUERY($query,$conn);
    if (!$result) {
      //neuer eintrag in log-datenbank
    }

    gruss aus berlin, volker

    1. hi,

      die tabelle kann ich nicht erweitern - habe darauf keinen einfluss.
      kann sie nur auslesen ...

      son mist ...

      trotzdem danke für deinen vorschlag.

      martin