vierailijastatistiikka graafisesti

piisami 09.01.05 15:04

Esittää "vierailijastatistiikan keräimen" tallentamaa tietoa graafisesti valitulta aikajaksolta.

 Tekstiversio  Arvo: 5 (5 ääntä)  Äänestä: +  -
<?php
/*
show_stats.php v.1.0 - vierailijastatistiikka graafisesti - päivitetty 9.1.2005

Esittää tekstitiedostoihin tallennettua dataa graafisesti kuukauden tai viikon mukaan.

Hakee tiedostonimä muodossa:
STATSDIR/VUOSI_month_KUUKAUSINRO_stats.txt      (esim. stats/2005_month_01_stats.txt)
STATSDIR/VUOSI_week_VIIKKONRO_stats.txt         (esim. stats/2005_week_1_stats.txt)

Rivi luettavassa tiedostossa pitäisi olla kustakin käyttäjästä muotoa:
SELAIN|IP|HOST|REFEER|URL|VAAKARESOLUUTIO x PYSTYRESOLUUTIO|AIKALEIMA|
Esim.
Mozilla|82.181.58.233|cs.htv.fi|http://www.yle.fi/|http://www.mureakuha.com/|1280 x 1024|2005-01-09 10:42:37|

Tällaisen tiedon kerääjästä on esimerkki Mureakuha.comin
PHP-skripteissä nimellä "vierailijastatistiikan keräin".

Graafisen esityksen lähtökohtana Mikrobitin 9/2004 artikkeli kävijälaskurista.
(http://www.mikrobitti.fi/nettijatkot/2004/09/kavijalaskuri/)

Pura skin1.zip (http://www.mikrobitti.fi/nettijatkot/2004/09/kavijalaskuri/skin1.zip)
palvelimelle hakemistoon "skin1/", josta skripti hakee tyylisivun ja tarvittavat
kuvat palkkien piirtämiseen. Noita muokkaamalla saa helposti mieleisensä ulkoasun.
*/

?>

<html>
<head>
<title>Vierailijastatistiikka graafisesti</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" href="./skin1/tyyli.css" type="text/css">
</head>
<body bgcolor="#FFDDAA">

<?php

$statsdir = "stats/"; // aseta tähän statistiikan hakemisto, sama kuin kerääjässä stats.php

// --- asetetaan statistiikan tiedosto lomakkeen tietojen mukaan
if (isset($_POST['etsikuukausi'])) {
        $statsfile = $statsdir.$vuosi."_month_".$kuukausi."_stats.txt";
        $arrayTiedosto = @file($statsfile);
        }
if (isset($_POST['etsiviikko'])) {
        $statsfile = $statsdir.$vuosi."_week_".$viikko."_stats.txt";
        $arrayTiedosto = @file($statsfile);
        }

if (isset($arrayTiedosto) AND file_exists($statsfile)) {
        $kokonaismaara=count($arrayTiedosto);      // lasketaan kävijöiden kokonaismäärä
        for($i=0;$i<count($arrayTiedosto);$i++)  // järjestetään tiedoston sisältö oikeisiin array-muuttujiin
        {
                $valiaikainen = explode("|", $arrayTiedosto[$i]);

                $selain[$i]=$valiaikainen[0];
                $ip[$i]=$valiaikainen[1];
                $host[$i]=$valiaikainen[2];
                $referer[$i]=$valiaikainen[3];
                $url[$i]=$valiaikainen[4];
                $resoluutio[$i]=$valiaikainen[5];
                $aikaleima[$i]=$valiaikainen[6];
                $tunti[$i] = substr($aikaleima[$i],11,2);       
                if ($referer[$i] == "") $referer[$i] = "Suoraan sivulle/ei tunnistettu";
                if ($resoluutio[$i] == "") $resoluutio[$i] = "Ei tunnistettu";
        }

        // --- Lasketaan yksilöllisten osumien määrä ja tallennetaan tiedot muuttujiin
        $kaikki_selaimet=(array_count_values($selain));
        $kaikki_ipt=(array_count_values($ip));
        $kaikki_hostit=(array_count_values($host));
        $kaikki_refererit=(array_count_values($referer));
        $kaikki_urlit=(array_count_values($url));
        $kaikki_resoluutiot=(array_count_values($resoluutio));
        $kaikki_tunnit=(array_count_values($tunti));
        $eri_ipt=(count($kaikki_ipt));
        $eri_hostit=(count($kaikki_hostit));
}

// --- muuttujia ulkoasun säätämiseen
$taulukko_vari="#0099FF";
$taulukko_taustavari="#99CCCC";
$border=0;
$cellspacing=1;
$cellpadding=5;
$kerroin=3; // miten pitkiä kuvaajia piirretään 1=100px, 3=300px, jne.

$viiva="<hr noshade width=\"50%\" align=\"left\">";
$loppupala="</table><br>";

// --- tulostetaan otsikko
echo("<div class=\"otsikko\">Kävijälaskuri osoitteessa $HTTP_HOST$PHP_SELF</DIV><hr noshade width=\"100%\" size=\"10\"><br>");

?>

<!-- tulostetaan html-lomake, josta voi valita aikajakson -->

<form action="<?php echo $PHP_SELF;?>" method="post">
        <select name="vuosi">
                <option>2005</option><option>2006</option><option>2007</option><option>2008</option>
                <option>2009</option><option>2010</option>
        </select>
        <select name="kuukausi">
                <option>1</option><option>2</option><option>3</option><option>4</option><option>5</option>
                <option>6</option><option>7</option><option>8</option><option>9</option><option>10</option>
                <option>11</option><option>12</option>
        </select>
        <input type="submit" value="Etsi kuukausi" name="etsikuukausi"/>
        <select name="viikko">
        <option>1</option><option>2</option><option>3</option><option>4</option><option>5</option><option>6</option><option>7</option>
        <option>8</option><option>9</option><option>10</option><option>11</option><option>12</option><option>13</option><option>14</option>
        <option>15</option><option>16</option><option>17</option><option>18</option><option>19</option><option>20</option><option>21</option>
        <option>22</option><option>23</option><option>24</option><option>25</option><option>26</option><option>27</option><option>28</option>
        <option>29</option><option>30</option><option>31</option><option>32</option><option>33</option><option>34</option><option>35</option>
        <option>36</option><option>37</option><option>38</option><option>39</option><option>40</option><option>41</option><option>42</option>
        <option>43</option><option>44</option><option>45</option><option>46</option><option>47</option><option>48</option><option>49</option>
        <option>50</option><option>51</option><option>52</option><option>53</option>
        </select>
        <input type="submit" value="Etsi viikko" name="etsiviikko"/>
</form>

<?php
if (!isset($arrayTiedosto)) die("<div class=\"leipa\">Valitse haluamasi kuukausi tai viikko.");
if (!file_exists($statsfile)) {
        echo ("<div class=\"leipa\">Ajankohdalle ei löydy statistiikkatiedostoa ($statsfile).");
}
else { // pää-else alkaa

// --- haetaan aikajakso lomakkeelta muuttujiin ja tulostetaan aikajakso sivulle
$vuosi = $_POST['vuosi'];
$kuukausi = $_POST['kuukausi'];
$viikko = $_POST['viikko'];
if (isset($_POST['etsikuukausi'])) {
        echo("<div class=\"otsikko\">Kuukauden tilastot $kuukausi/$vuosi");
}
if (isset($_POST['etsiviikko'])) {
        echo("<div class=\"otsikko\">Tilastot Viikko $viikko/$vuosi");
}

// --- tulostetaan kokonaismäärä

echo("<div class=\"otsikko\"><br>Osumia yhteensä: $kokonaismaara. Eri IP-osoitteita: $eri_ipt. Eri host-nimiä: $eri_hostit.</div><br>");

// _______________________________________________________________________________________________________


// --- tulostetaan eri selaimet ja niiden määrä

echo("<div class=\"otsikko\">Selaimet:</div>"); // tulostetaan otsikko
echo($viiva); // tulostetaan vaakaviiva

// --- luodaan taulukko tuloksia varten:
echo("
<table  border=\"$border\" cellspacing=\"$cellspacing\" cellpadding=\"$cellpadding\">
  <tr bgcolor=\"$taulukko_vari\">
    <td colspan=\"2\"><span class=\"taulukko_otsikko\">Selain:</span></td>\n
    <td align=\"center\"><span class=\"taulukko_otsikko\">#</span></td>\n
    <td align=\"center\"><span class=\"taulukko_otsikko\">%</span></td>\n

  </tr>
  "
);
arsort($kaikki_selaimet); // järjestää arrayn esiintymiskertojen mukaan

// --- while-silmukka, jonka aikana tulostetaan yksi taulukon rivi jokaista selainta kohden
while (list($selaimen_nimi, $maara) = each($kaikki_selaimet)) {
   $prosentti=(($maara/$kokonaismaara)*100);                               
   $prosentti=round($prosentti,2);
   $leveys=$prosentti*$kerroin;
   $leveys=round($leveys);
   
   echo ("
   <tr bgcolor=\"$taulukko_taustavari\">\n
       <td>$selaimen_nimi</td>\n
      <td>
       <img src=\"./skin1/alku.gif\"><img src=\"./skin1/vali.gif\" width=\"$leveys\" height=\"11\"><img src=\"./skin1/loppu.gif\">
          </td>\n
          <td>$maara</td>\n
          <td>$prosentti %</td>\n
     </tr>\n
    "
);
}
echo($loppupala);

// _______________________________________________________________________________________________________

// --- Tulostetaan eri IP:t

echo("<div class=\"otsikko\">Ip-osoitteet:</div>");
echo($viiva);
echo("
<table  border=\"$border\" cellspacing=\"1\" cellpadding=\"$cellpadding\">
  <tr bgcolor=\"$taulukko_vari\">
    <td colspan=\"2\"><span class=\"taulukko_otsikko\">IP-osoite:</span></td>
    <td align=\"center\"><span class=\"taulukko_otsikko\">#</span></td>\n
    <td align=\"center\"><span class=\"taulukko_otsikko\">%</span></td>\n
  </tr>
  "
);
arsort($kaikki_ipt); // järjestää arrayn esiintymiskertojen mukaan

while (list($IPosoite, $maara) = each($kaikki_ipt)) {
   $prosentti=(($maara/$kokonaismaara)*100);                               
   $prosentti=round($prosentti,2);
   $leveys=$prosentti*$kerroin;
   $leveys=round($leveys);
   
   echo ("
   <tr bgcolor=\"$taulukko_taustavari\">
       <td>$IPosoite</td>
      <td>
       <img src=\"./skin1/alku.gif\"><img src=\"./skin1/vali.gif\" width=\"$leveys\" height=\"11\"><img src=\"./skin1/loppu.gif\">
          </td>\n
          <td>$maara</td>\n
          <td>$prosentti %</td>\n
     </tr>\n
    "
);

}
echo($loppupala);

// _______________________________________________________________________________________________________

// --- Tulostetaan eri hostit
echo("<div class=\"otsikko\">Host-osoitteet:</div>");
echo($viiva);
echo("
<table  border=\"$border\" cellspacing=\"$cellspacing\" cellpadding=\"$cellpadding\">
  <tr bgcolor=\"$taulukko_vari\">
    <td colspan=\"2\"><span class=\"taulukko_otsikko\">Host-osoite:</span></td>
    <td align=\"center\"><span class=\"taulukko_otsikko\">#</span></td>\n
    <td align=\"center\"><span class=\"taulukko_otsikko\">%</span></td>\n
  </tr>
  "
);
arsort($kaikki_hostit); // järjestää arrayn esiintymiskertojen mukaan

while (list($HostOsoite, $maara) = each($kaikki_hostit)) {
   $prosentti=(($maara/$kokonaismaara)*100);                               
   $prosentti=round($prosentti,2);
   $leveys=$prosentti*$kerroin;
   $leveys=round($leveys);
   
   echo ("
   <tr bgcolor=\"$taulukko_taustavari\">
       <td>$HostOsoite</td>
      <td>
       <img src=\"./skin1/alku.gif\"><img src=\"./skin1/vali.gif\" width=\"$leveys\" height=\"11\"><img src=\"./skin1/loppu.gif\">
          </td>\n
          <td>$maara</td>\n
          <td>$prosentti %</td>\n
     </tr>\n
    "
);
}
echo($loppupala);

// _______________________________________________________________________________________________________

// --- Tulostetaan eri refererit
echo("<div class=\"otsikko\">Referer-osoitteet:</div>");
echo($viiva);
echo("
<table  border=\"$border\" cellspacing=\"$cellspacing\" cellpadding=\"$cellpadding\">
  <tr bgcolor=\"$taulukko_vari\">
    <td colspan=\"2\"><span class=\"taulukko_otsikko\">Referer-osoite:</span></td>
    <td align=\"center\"><span class=\"taulukko_otsikko\">#</span></td>\n
    <td align=\"center\"><span class=\"taulukko_otsikko\">%</span></td>\n
  </tr>
  "
);
arsort($kaikki_refererit); // järjestää arrayn esiintymiskertojen mukaan

while (list($RefererOsoite, $maara) = each($kaikki_refererit)) {
   $prosentti=(($maara/$kokonaismaara)*100);                               
   $prosentti=round($prosentti,2);
   $leveys=$prosentti*$kerroin;
   $leveys=round($leveys);
   
   echo ("
   <tr bgcolor=\"$taulukko_taustavari\">
       "
);
           if ($RefererOsoite == "Suoraan sivulle/ei tunnistettu") {
                echo ("<td>$RefererOsoite</td>");
                }
           else {
                echo("<td><a href=\"$RefererOsoite\" target=\"_blank\">$RefererOsoite</a></td>");
                }
          echo ("
      <td>
       <img src=\"./skin1/alku.gif\"><img src=\"./skin1/vali.gif\" width=\"$leveys\" height=\"11\"><img src=\"./skin1/loppu.gif\">
          </td>\n
          <td>$maara</td>\n
          <td>$prosentti %</td>\n
     </tr>\n
    "
);

}
echo($loppupala);

// _______________________________________________________________________________________________________

// --- Tulostetaan eri urlit
echo("<div class=\"otsikko\">URL-osoitteet:</div>");
echo($viiva);
echo("
<table  border=\"$border\" cellspacing=\"$cellspacing\" cellpadding=\"$cellpadding\">
  <tr bgcolor=\"$taulukko_vari\">
    <td colspan=\"2\"><span class=\"taulukko_otsikko\">URL-osoite:</span></td>
    <td align=\"center\"><span class=\"taulukko_otsikko\">#</span></td>\n
    <td align=\"center\"><span class=\"taulukko_otsikko\">%</span></td>\n
  </tr>
  "
);
arsort($kaikki_urlit); // järjestää arrayn esiintymiskertojen mukaan

while (list($urlOsoite, $maara) = each($kaikki_urlit)) {
   $prosentti=(($maara/$kokonaismaara)*100);                               
   $prosentti=round($prosentti,2);
   $leveys=$prosentti*$kerroin;
   $leveys=round($leveys);
   
   echo ("
   <tr bgcolor=\"$taulukko_taustavari\">
       <td><a href=\"$urlOsoite\" target=\"_blank\">$urlOsoite</a></td>
      <td>
       <img src=\"./skin1/alku.gif\"><img src=\"./skin1/vali.gif\" width=\"$leveys\" height=\"11\"><img src=\"./skin1/loppu.gif\">
          </td>\n
          <td>$maara</td>\n
          <td>$prosentti %</td>\n
     </tr>\n
    "
);
}
echo($loppupala);

// _______________________________________________________________________________________________________

// --- Tulostetaan eri resoluutiot
echo("<div class=\"otsikko\">Resoluutiot:</div>");
echo($viiva);
echo("
<table  border=\"$border\" cellspacing=\"$cellspacing\" cellpadding=\"$cellpadding\">
  <tr bgcolor=\"$taulukko_vari\">
    <td colspan=\"2\"><span class=\"taulukko_otsikko\">Resoluutio:</span></td>
    <td align=\"center\"><span class=\"taulukko_otsikko\">#</span></td>\n
    <td align=\"center\"><span class=\"taulukko_otsikko\">%</span></td>\n
  </tr>
  "
);
arsort($kaikki_resoluutiot); // järjestää arrayn esiintymiskertojen mukaan

while (list($reso, $maara) = each($kaikki_resoluutiot)) {
   $prosentti=(($maara/$kokonaismaara)*100);                               
   $prosentti=round($prosentti,2);
   $leveys=$prosentti*$kerroin;
   $leveys=round($leveys);
   
   echo ("
   <tr bgcolor=\"$taulukko_taustavari\">
       <td>$reso</td>
      <td>
       <img src=\"./skin1/alku.gif\"><img src=\"./skin1/vali.gif\" width=\"$leveys\" height=\"11\"><img src=\"./skin1/loppu.gif\">
          </td>\n
          <td>$maara</td>\n
          <td>$prosentti %</td>\n
     </tr>\n
    "
);
}
echo($loppupala);

// _______________________________________________________________________________________________________

// --- Tulostetaan aikajakauma
echo("<div class=\"otsikko\">Aikajakauma tunneittain:</div>");
echo($viiva);
echo("
<table  border=\"$border\" cellspacing=\"$cellspacing\" cellpadding=\"$cellpadding\">
  <tr bgcolor=\"$taulukko_vari\">
    <td colspan=\"2\"><span class=\"taulukko_otsikko\">Tunti:</span></td>
    <td align=\"center\"><span class=\"taulukko_otsikko\">#</span></td>\n
    <td align=\"center\"><span class=\"taulukko_otsikko\">%</span></td>\n
  </tr>
  "
);
ksort($kaikki_tunnit); // järjestää arrayn tuntien mukaan 00, 01, 02...

while (list($jakaumaTunnit, $maara) = each($kaikki_tunnit)) {
   $prosentti=(($maara/$kokonaismaara)*100);                               
   $prosentti=round($prosentti,2);
   $leveys=$prosentti*$kerroin;
   $leveys=round($leveys);
   
   echo ("
   <tr bgcolor=\"$taulukko_taustavari\">
       <td>$jakaumaTunnit</td>
      <td>
       <img src=\"./skin1/alku.gif\"><img src=\"./skin1/vali.gif\" width=\"$leveys\" height=\"11\"><img src=\"./skin1/loppu.gif\">
          </td>\n
          <td>$maara</td>\n
          <td>$prosentti %</td>\n
     </tr>\n
    "
);
}
echo($loppupala);

} // pää-elsen loppusulku

?>

</body>
</html>

Ceez 19:33 9.1.05 
Laita jonnekkin esimerkki jos jaksat.
editoitu: 00:43 10.1.05
piisami 21:12 9.1.05 
Juu, esimerkki löytyy osoitteesta http://www.piuha.org/show_stats.php (ja sieltä esim. 2005 ja etsi viikko 1).
DJ-Dew 19:35 10.1.05 
Ei tallenna tietoja käyttäjästä?? En ainakaan löytänyt kohtaa jossa kirjoitettaisiin tiedostoon kävijän statisitiikka....
T.M. 23:19 10.1.05 
Mjoo, tarkasteleppas noiden host / ip listojen yhdennäköisyyttä ;)
Elikkäs eri IP ei voi saada samanlaista hostia kuin jokin toinen IP... Korjatkaa jos olen väärässä.
piisami 23:42 10.1.05 
T.M.: Jep, oikeassa olet. Eipä tosiaan ole mieltä pitää noita omina listoinaan, vaan taidan yhdistää ne. Host-nimien osasta toiseksi viimeisen pisteen jälkeen (dnainternet.fi, htv.fi, inet.fi) voisi pitää sitten omaa listaansa. Tai tehdä mahdollisesti graafit maatunnuksien mukaan. Jatkan joskus kun ehdin :)

DJ-Dew: Aivan, kätevintä minusta on pitää kävijätietojen esittäjä erillään keräimestä. Erillinen pieni keräin toimii kävijälle huomaamattomasti (@include). Esimerkki tähän sopivasta keräimestä siis on PHP-skripteissä nimellä "vierailijastatistiikan keräin".
Himbe 22:30 11.1.05 
Mut täytyy sanoa, että ihan hieno härpäke. Ei huonoimmasta päästä.
editoitu: 00:41 9.3.05
NxV 00:37 9.3.05 
Innostuin kokeilemaan tätä koodiyhdistelmää, eli siis tuota kerääjää ja tätä statistiikannäyttäjää. Ihmettelin miksi graafinen tilasto ei toiminut vaikka valitsin oikean kuukauden, jolta tilastoa oli. Meni suhteellisen pitkä tovi tajuta, että koodi oli tallentanut kuukauden statsit tiedostoon "2005_month_3_stats.txt", kun taas tämä websivulla toimiva graafinen käyttäjätilasto -koodipätkä haki tiedostoa "2005_month_03_stats.txt". Eli siis erona tuo nolla kolmosen edessä.

Yksinkertainen korjata, mutta varsinkin silloin kun ei ole terävimmillään voi kestää huomata tuo pikkuero, ehdin tutkiskella itse koodia jo monet kerrat ja kokeilin ties mitä. Päätinpä sitte tänne kirjoittaa, jos joku ajautuu saman "ongelman" eteen. :)

Ja korjaushan käy yksinkertaisesti eli poistamalla tästä koodinpätkästä nollat kuukausia vastaavien lukujen edestä:

<select name="kuukausi">
<option>01</option><option>02</option><option>03</option><option>04</option><option>05</option>
<option>06</option><option>07</option><option>08</option><option>09</option><option>10</option>
<option>11</option><option>12</option>
</select>
piisami 13:00 15.4.05 
Kiitos NxV, korjasin. Hyvä että joku ihan kokeilee toimintaa :) Itsekin testailin, mutta vain viikottaisella statistiikalla.