Avatar billede discotk Nybegynder
24. december 2009 - 14:10 Der er 9 kommentarer og
1 løsning

Statistik - unique ip pr dag

Glædelig jul eksperter!

Jeg er igang med at lave et lille statistik system og skal hente noget bestem fra min tabel "counter". Mit tabel ser således ud:

+----+-------------+---------+------------+
| id |    ip      | page_id |    date    |
+----+-------------+---------+------------+
| 1  | 192.168.1.1 |    52  | 24-12-2009 |
| 2  | 192.168.1.1 |    47  | 24-12-2009 |
| 3  | 192.168.1.1 |    1  | 23-12-2009 |
| 4  | 192.168.1.1 |    1  | 24-12-2009 |
| 5  | 192.168.1.2 |    47  | 24-12-2009 |
| 6  | 192.168.1.2 |    47  | 23-12-2009 |
| 7  | 192.168.1.3 |    52  | 23-12-2009 |
+----+-------------+---------+------------+

ip      =  besøgers ip
page_id =  besøgt side
date    =  besøgsdato

Hvordan får jeg den til at tælle, så det ser således ud når jeg skriver det ud via php?

3 forskellige ip'er var der ialt den 23-12-2009
2 forskellige ip'er var der ialt den 24-12-2009

5 besøg i alt

Dvs. den skal kun tælle den samme IP (f.eks 192.168.1.1) en gang med mindre der står en anden dato.

Har prøvet med...

"SELECT ip, date, COUNT(*) FROM counter GROUP BY ip, date"

...men så skriver den hvor mange gange de forskellige iper har været på per dag, hvilket jeg ikke ønsker.

Sikker bare mig der ikke kan den rigtige kombination :) Håber i kan hjælpe!

På forhånd tak.
24. december 2009 - 14:28 #1
SELECT date, COUNT(*) AS antal FROM counter GROUP BY date;

Giver, med ovenstaaende data, dette resultat:

date  antal 
2009-12-23 3
2009-12-24 4
Avatar billede discotk Nybegynder
24. december 2009 - 15:09 #2
ja, men så tæller den også den samme ip flere gange pr dag... hvis ip 192.168.1.1 har været inde to gange på en dag, skal den kun tælle for den ene gang.

Dvs.
Eks. 1
192.168.1.1 // 24-12-2009
192.168.1.1 // 24-12-2009
24-12-2009 = 1

Eks. 2
192.168.1.1 // 24-12-2009
192.168.1.1 // 24-12-2009
192.168.1.2 // 24-12-2009
24-12-2009 = 2

Eks. 3
192.168.1.1 // 24-12-2009
192.168.1.1 // 24-12-2009
192.168.1.2 // 24-12-2009
192.168.1.1 // 23-12-2009
192.168.1.1 // 23-12-2009
192.168.1.2 // 23-12-2009
192.168.1.3 // 23-12-2009
24-12-2009 = 2
23-12-2009 = 3
24. december 2009 - 18:13 #3
Det maa du undskylde, jeg havde for travlt med at komme ud ad doeren for de sidste juleindkoeb.  Mens kalkunen steger har jeg kikket igen.  Denne her select giver de resultater du efterlyser:

SELECT date, COUNT( DISTINCT ip )
FROM counter
GROUP BY date
Avatar billede discotk Nybegynder
26. december 2009 - 11:23 #4
Super, tak skal du have :)
Avatar billede discotk Nybegynder
26. december 2009 - 12:03 #5
okay, et lille tillægs spørgsmål... hvordan får jeg dem så ud så der står:

f.eks 5 besøg ialt

Der må den gerne tælle ip adressen flere gange, men kun en gang per dag :)

Eks.

192.168.1.1 // 24-12-2009
192.168.1.1 // 24-12-2009
192.168.1.1 // 24-12-2009
192.168.1.1 // 23-12-2009
192.168.1.2 // 24-12-2009
= 3 besøg ialt
26. december 2009 - 12:37 #6
Det skal jeg lige vaere sikker paa at jeg forstaar.

Dit oprindelige indlaeg var, saa vidt jeg forstod, hvordan man skriver en query der taeller unikke ips per dag.  Queryen i #3 goer det.  For eksempel de data du viser dit oprindelige indlaeg giver i mysql foelgende resultat:

date  COUNT( DISTINCT ip ) 
2009-12-23 3
2009-12-24 2

Saa spoerger du hvordan du skriver det ud i php.  Der har jeg tre "modspoergsmaal:"

(a)  Hvad skal den noejagtige udskrevne tekst vaere? 

(1)  Dit oprindelige indlaeg tyder paa at den udskrevne tekst, med de data du viser, skal vaere denne:

"3 forskellige ip'er var der ialt den 23-12-2009
2 forskellige ip'er var der ialt den 24-12-2009

5 besoeg i alt"

(2) hvorimod #5 kunne forstaas saaledes at den udskrevne tekst skal indeholde en liste af ip'er.

(b)  Jeg gaar ud fra at besoegene automatisk og loebende registreres i databasen.  Hvornaar og hvor vil du saa have din statistik tekst skrevet ud?  Har du for eksempel en hjemmeside med en knop saa naar du trykker paa knoppen vil du have statistikken skrevet ud?

(c)  Har du allerede skrevet noget php kode?  Saa lad mig se det.
Avatar billede discotk Nybegynder
26. december 2009 - 13:16 #7
Det var helt fint det, som du svarede på mit spørgsmål... nu vil jeg bare gøre sådan at jeg laver en "sum" på de forskellige iper der har været per dag... Her har du koden:

<?php
/* HENTER DE FORNØDNE INFORMATIONER */
require_once('Connections/cms.php');
$ip = $_SERVER['REMOTE_ADDR'];
$page = $row_rsRead['id'];
$date = date('d-m-Y');
$lastmonth =  date("d") . "-" . (date("m")-1) . "-" . date("Y");

/* FINDER DEN RETTE PLACERING */
mysql_select_db($database_cms, $cms);
$viewer_check_query = "SELECT * FROM counter WHERE ip = '$ip' AND page = '$page' AND date='$date'";
$viewer_check_result = mysql_query($viewer_check_query);
$viewer_check_numrows = mysql_num_rows($viewer_check_result);

/* SKRIVER TIL DATABASEN */
    if($viewer_check_numrows == 0){
        $viewer_new_query = "INSERT INTO counter (ip, page, date) VALUES
        ('$ip', '$page', '$date')";
        $viewer_new_result = mysql_query($viewer_new_query);
    }

/* UNIK IP PER DAG */
$visitor_query = "SELECT date, COUNT( DISTINCT ip ) AS antal FROM counter GROUP BY date";
$visitor_result = mysql_query($visitor_query) or die(mysql_error());
while($row_visitor = mysql_fetch_array($visitor_result)){
    echo "There were " . $row_visitor['antal'] . " ips on date " . $row_visitor['date'];
    echo "<br />";
}
echo "<br />";

/* UNIK IP TOTAL */
$visitorTotalUnique_query = "SELECT date, COUNT( DISTINCT ip ) AS antal FROM counter";
$visitorTotalUnique_result = mysql_query($visitorTotalUnique_query) or die(mysql_error());
$row_visitorTotalUnique = mysql_fetch_array($visitorTotalUnique_result);
    echo "There have been " . $row_visitorTotalUnique['antal'] . " unique ips in total";
    echo "<br />";
   
echo "<br />";

/* UNIK IP PER DAG TOTAL
En eller anden kode her, der skriver noget med:
There have been XXX unique ips different days.

- tænkte på noget SUM() eller noget array_sum(), men kan ikke helt hitte ude af den... der er sikkert en smartere måde :D */

?>
Avatar billede discotk Nybegynder
26. december 2009 - 13:41 #8
Så som beskrevet i #5:

Så er det databasen der ser sådan ud:
192.168.1.1 // 24-12-2009  =1 // samme kombination
192.168.1.1 // 24-12-2009  =1 // samme kombination
192.168.1.1 // 24-12-2009  =1 // samme kombination
192.168.1.1 // 23-12-2009  =2 // her er en forskellig kombination
192.168.1.2 // 24-12-2009  =3 // her er en forskellig kombination
= 3

Imens frontsiden skal skrive det her:

There have been 3 unique ips different days.
Avatar billede discotk Nybegynder
26. december 2009 - 13:42 #9
okay... har jeg ret i at det bare skal være sådan her?

SELECT date, COUNT( DISTINCT ip, date ) AS antal FROM counter
26. december 2009 - 14:30 #10
Jeg formaaede ikke at formulere mine spoergsmaal saa du forstod dem.  Sorry. Du fortalte mig derfor ikke hvad noejagtigt du vil have skrevet ud, saa jeg gaetter stadig.  Jeg gaetter paa at med de data i tabellen som du viser i dit oprindelige indlaeg saa vil du have det foelgen de skrevet ud, hverken mere eller mindre:

There were 3 ips on date 2009-12-23
There were 2 ips on date 2009-12-24
5 besoeg ialt.

Det behoever du kun en enkel query for.  Du laver en variabel og giver den vaerdien 0.  Saa hver gang du henter ud hvor mange unikke besog der var paa en dag laegger du tallet til den variable, og til sidst skriver du den variable ud som total.  Jeg har lavet en side http://christianjorgensen.be/discotk.php der goer det (jeg har kaldt database tabellen discotk og bruger min egen mysql connection.)  Her er koden:

<?
$link = mysql_connect ('christianjorgensen.be.mysql', 'christianjoygen', 'dnyBKKbe') or die(mysql_erorr());
mysql_select_db('christianjoygen') or die('Could not select database');

$visitor_query = "SELECT date, COUNT( DISTINCT ip ) AS antal FROM discotk GROUP BY date";
$visitor_result = mysql_query($visitor_query) or die(mysql_error());
$count = 0;
while($row_visitor = mysql_fetch_array($visitor_result))
{
    $count += $row_visitor['antal'];
    echo "There were " . $row_visitor['antal'] . " ips on date " . $row_visitor['date'];
    echo "<br />";

echo $count . " besoeg ialt.";
mysql_close($link); 
?>

Du sagde heller ikke hvornaar vil du have det skrevet ud?  Hver gang du aabner siden eller naar du trykker paa en knap eller ??
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester