Statistik PHP (gennemsnit/etc)

Tags:    php mysql

<< < 12 > >>
Hej Udviklere.

Jeg har brug for lidt assistance her. Siden jeg konventerede alle mine tidsformater til time() begynder jeg at opleve problemer med mit statistik system - det er jo klart, da det ikke understøtter time(). Det skal lige siges at det er eget programmeret system.

Og jeg er i forvejen ikke så god til det med MySQL så det kunne være der var en haj til det herinde som kunne hjælpe mig.

Anyways, jeg har disse felter:

id
ip
dato (sidste bevægelse af IP - time())
url (sidens url - fuld)
status (online/offline)
hits (sidevisninger af IP)

Jeg kunne godt tænke mig at udregne disse ting, ved hjælp af min database information:

Sidevisninger i alt xxx
Unikke besøg i alt: xxx
Unikke besøg i dag: xxx
Unikke besøg seneste 30 dage: xxx
Unikke besøg seneste 12 mdr.: xxx

Og til sidst en tabel i bunden "statistik log" hvor den hiver hver dag ud der er blevet registeret besøg og efterfølgende skriver dato + besøg antal.

Jeg er klar over dette ikke er en gavebod, men jeg står akut og har brug for hjælp.

På forhånd tak!



12 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 6 karma
Sorter efter stemmer Sorter efter dato
Sidevisninger i alt:
Fold kodeboks ind/udSQL kode 


Unikke i alt:
Fold kodeboks ind/udSQL kode 


Dato grupperingen er jeg ikke så skarp til i hovedet, men det er der måske en anden som kan supplere med :-) Jeg har i øvrigt heller ikke testet de ovenstående da jeg ikke lige gad til at generere data i en DB for det. Men de skulle vist virke :-)



Indlæg senest redigeret d. 17.05.2011 15:13 af Bruger #12245
$t = time();
$today = $t - $t % 86400:
$days30 = $today - 29 * 86400:

mysql_query('SELECT count(1) FROM table WHERE dato >'.$today);
mysql_query('SELECT count(1) FROM table WHERE dato >'.$days30);

Den sidste kræver at du finder ud time for 12mdr siden, og det er ikke et konstant antal dage. Deruover er det uklart om det er fra den 1st for tovlmåneder siden eller der er fra den nuværende dato for tolv måender siden.

PS ifølge wikipedia er unikke baseret på IP ikke særligt præcist.



Indlæg senest redigeret d. 17.05.2011 17:53 af Bruger #5620
Hej Frank.

Tak for dit svar. Jeg savner dog uddbyende information til hvordan jeg skal bruge de querys. Unikke samt sidevisninger er heller ikke det store problem.

Mere det med dato gruppering (unikke i dag/seneste 30 dage/12 mdr), og så statistik log.

Ellers tak for dit svar.



Hvad mener du med at unikke baseret på IP ikke er præcist? Har du nogen kilde?

Hvordan ville jeg kunne bruge overstående mysql_query her f.eks:

Unikke besøg i dag: ' . $row[??] . '



Hvad mener du med at unikke baseret på IP ikke er præcist? Har du nogen kilde?

Hvordan ville jeg kunne bruge overstående mysql_query her f.eks:

Unikke besøg i dag: ' . $row[??] . '


Der kan være flere computere koblet til samme router, og den router har jo kun én IP-adresse ;)
Desuden, så er der jo også bibliotekscomputere osv.



Når ja ja - men altså, så præcist behøver det heller ikke være. Det skal bare være et udgangspunkt. Og in case - et fra eller til er vel ligegyldigt.



$res = mysql_query(---);
list($visits) = mysql_fetch_row($res);




Er det helt forkert at gøre det således?

Fold kodeboks ind/udPHP kode 



Jeg forstod ikke helt hvordan man kunne bruge count(1) - så gjorde det således. Har i nogen kommentarer? Var det ikke meget smart at bruge:

$today = strtotime("yesterday");
$lastmonth = strtotime("last month");
$lastmonth = strtotime("last year");

I stedet for alt det minus, divider og gange? Jeg er jo heller ikke sikker på at min statistik fungere korrekt således - derfor spørger jeg :).



Indlæg senest redigeret d. 18.05.2011 23:23 af Bruger #16320
Jo jeg overvejede faktisk at bruge dem, men der var et eksempel, hvor den lavede fejl med måneder.

Men vil da tro at:
$today = strtotime("yesterday");
skulle være
$today = strtotime("today");

og
$lastmonth = strtotime("last year");
skulle være
$lastyear = strtotime("last year");

og
$getLY = mysql_query("SELECT `id` FROM `cms_statistik` WHERE `dato` > '$lastmonth'") or die(mysql_error());
skulle være
$getLY = mysql_query("SELECT `id` FROM `cms_statistik` WHERE `dato` > '$lastyear'") or die(mysql_error());

Du har iøvrigt nogle steder med ;; det ikke en fejl giver bar ikke mening.

count(1) er bedre at brugt når de bare vil tælle. Når du laver et:
SELECT `id` får du jo et resultat af n rækker. Dette skal jo allokeres og huskes et eller andet det.

Når du laver et SELECT count(1) får du et resultat af n rækker, hvor hver række har antallet af rækker i de enkelte grupper. Er der kun en gruppe, som der er når der ikke er en GROUP BY, er n = 1.

Eksempel tabel:
Fold kodeboks ind/udKode 


Eksempel med select resultater:
Fold kodeboks ind/udKode 


Eksempel med select resultater:
Fold kodeboks ind/udKode 





Indlæg senest redigeret d. 19.05.2011 10:49 af Bruger #5620
Orv ja, Jens - godt set. Havde ikke lagt mærke til ;; og den med lastyear.

Har ændret det til følgende:

Fold kodeboks ind/udPHP kode 


Er det ikke mere rimeligt? Ser ud til at today også virker. Men jeg kan som sagt ikke være sikker på statistikkerne.

Dog synes jeg stadigvæk ikke at kunne forstå hvordan man bruger count(1) - jeg er dog også født "fat-svag" :P Kan du ikke komme med et eksempel på hvordan jeg kunne bruge count(1) i forhold til mit nuværende setup?

Jeg forstår dog forsat bare ikke hvordan jeg skal lave den sidste "besøgs log". Noget tip her?

EDIT:

OK. Jeg har da fundet ud af SQL metoden:

$hentLog = mysql_query("SELECT COUNT(*) AS antal, dato FROM `cms_statistik` GROUP BY dato ORDER BY `dato` DESC") or die(mysql_error());

Men således vil det ikke virke, da en så bare vil hente alle rows, da time() umuligt kan være den samme. Var det i php ville jeg bare gøre således: date('d-m-Y', $time) - men det kan jeg jo ikke gøre i en mysql query. Noget lignende:

$hentLog = mysql_query("SELECT COUNT(*) AS antal, dato FROM `cms_statistik` GROUP BY date('d-m-Y', dato) ORDER BY `dato` DESC") or die(mysql_error());

Hvad ville være den rigtige SQL syntaks her?

EDIT:

Jeg har så prøvet mig frem med denne sql:

$getLog = mysql_query("SELECT COUNT(*) AS antal, dato FROM cms_statistik GROUP BY DAY(dato) ORDER BY dato DESC") or die(mysql_error());

Efter at have læst: http://stackoverflow.com/questions/508791/mysql-query-group-by-day-month-year. Den virker dog ikke. Den gør således:

$row[dato] $row[antal]
19-05-2011 165
12-05-2011 1
12-05-2011 1
29-04-2011 1
17-04-2011 1
26-03-2011 3
14-03-2011 1

Hmmm...



Indlæg senest redigeret d. 19.05.2011 15:25 af Bruger #16320
<< < 12 > >>
t