NiklassonMedlem sedan nov. 2000823 inlägg
Hej alla! ;)
Jag har skrivit ett statistikscript i PHP, men det är vissa saker jag undrar. För skall jag väl berätta att jag loggar scriptet med en img-tagg, eftersom inte hela webbplatsen bygger på PHP ännu.
Problem 1: Därför jag jag som ni säkert förstår vissa problem med vissa variablar. Till exempel $HTTP_REFERER - den loggar ju filen som anropat scriptet, alltså aldrig någon annan sida än mina egna.. :(
Enda sättet för mig att lösa detta är väl att på något sätt använda javascript, men det vet jag inte hur man gör. Eller måste jag vänta tills jag har hela sidan i PHP och då instället för en img-tagg använda include() ?
Problem 2: Detta är lite mer akut. Jag har en databas full med information, men vet inte hur jag skall koda för att visa statistiken i webben. Jag har lyckats genom att klippa och klistra ur ett liknande script att få fram besökare per datum, men jag har inte en aning hur det fungerar.. :e
Postar koden här nedan, så kanske någon kan hjälpa mig att tolka eller rentav skriva något enklare..
##################################################
# Besökare per dag
$timme = date("H") +1;
$minuter = 59 - date("i");
$sekunder = 60 - date("s");
$start_tid = strtotime("-$timme hours $minuter minutes $sekunder seconds");
$query = mysql_query("SELECT count(*) FROM _$manad"."_$ar WHERE tid >= $start_tid") or die (mysql_error());
$array1[] = date("Y-m-d",$start_tid).','.$array2[] = mysql_result($query,0);
$första = date("d") -1;
for ($i=0;$i<$första;$i++)
{
$ny = ($start_tid - ((60*60)*24));
$query = mysql_query("SELECT count(*) FROM _$manad"."_$ar WHERE tid >= $ny AND tid <= $start_tid") or die (mysql_error());
$array1[] = date("Y-m-d",$ny).','.$array2[] = mysql_result($query,0);
$start_tid = $ny;
}
rsort($array2);
$p1=$array2['0'];
unset($array2);
echo "<table align=\"center\" border=\"0\" cellspacing=\"1\" cellpadding=\"0\" width=\"350\">
<tr>
<td colspan=\"3\" class=\"Rubrik12Font\"><b>Besökare per dag</b></td>
</tr>
<tr>
<td colspan=\"3\" height=\"8\"></td>
</tr>\n";
foreach($array1 as $value)
{
$colour = ($i++&1)?c94622:B1BEC9;
$value = explode(",",$value);
$p3 = ($value['1']/$p1)*100;
$manadstotal = $manadstotal + $value['1'];
echo "<tr>
<td width=\"20%\">".$value['0']."</td>
<td width=\"12%\" align=\"right\"><b>".$value['1']."</b></td>
<td width=\"68%\">
<table border=\"0\" cellspacing=\"1\" cellpadding=\"0\" width=\"$p3%\">
<tr>
<td height=\"8\" bgcolor=\"#$colour\"></td>
</tr>
</table>
</td>
</tr>\n";
}
echo "</table>\n";
?>
<p>
<table align="center" border="0" cellpadding="0" cellspacing="1" width="350">
<tr>
<td colspan="2"><b>Statistik</b></td>
</tr>
<tr>
<td>Totalt:</td>
<td><b><?=$manadstotal?></b></td>
</tr>
</table>
<?
##################################################
?>
Om det behövs info om databasen är det bara att maila eller svara här - jag vill ha igång detta ordentligt nu.. :)
Tack på förhand! Hoppas det finns någon som vill hjälpa till...
------------------
http://www.niklasson.net/
sgtpepperMedlem sedan apr. 20005 524 inlägg
Problem 1.
Du skulle ju kunna, med hjälp av JavaScript, skicka med referer som en query-sträng till ditt PHP-script. Använd document.referrer för att få ut referer i JavaScript.
Problem 2.
Att läsa ett stort script är både tråkigt, ostimulerande och trist ;). Det vore roligare och mer relevant om du postade databasstrukturen och info om vad du vill visa så skall vi nog kunna fixa något.
------------------
"To iterate is human, to recurse, divine" - L. Peter Deutch
NiklassonMedlem sedan nov. 2000823 inlägg
Tack för ditt snabba svar.. :)
Använd document.referrer för att få ut referer i JavaScript
Det är precis detta jag inte kan.. ;)
Det skapas en ny tabell varje månad:
mysql_query("CREATE TABLE _$manad"."_$ar (id int(255) NOT NULL auto_increment PRIMARY KEY, browser varchar(255), referer varchar(255), sprak varchar(255), tid int(15), ip varchar(20))") or die(mysql_error());
Så här loggas besökaren:
mysql_query("INSERT INTO _$manad"."_$ar (browser, referer, sprak, tid, ip) VALUES ('$HTTP_USER_AGENT', '$HTTP_REFERER', '$HTTP_ACCEPT_LANGUAGE', '$tid', '$REMOTE_ADDR')") or die(mysql_error());
Variablarna $manad och $ar baseras på aktuell månad samt år. De andra variablarna förstår du säkert att de existerar.. ;)
Hoppas du har nån vettig lösning...
------------------
http://www.niklasson.net/
sgtpepperMedlem sedan apr. 20005 524 inlägg
För att skicka med REFERER via JavaScript kan du göra ungefär så här:
<html>
<head>
[b]
<script>
function logImage()
{
document.write("<img src='bild.php?referer=" + document.referer + "'>");
}
</script>
[/b]
</head>
<body>
[b]script>logImage();</script>[/b]
</body>
</html>
Hmmm.. Varför skapa en ny tabell varje månad, det är en något oortodox lösning för att uttrycka sig milt :).
Det bästa är att skapa en statistiktabell med en datumkolumn, på så sätt kan du göra vilka typer av utsökningar som helst; antal besökare idag, denna månad, de tre senaste månaderna, varje söndag detta år etc. etc.
Kolumnen tid som du har i din tabell, vad lagras där? Är det bara klockslaget eller är det ett TIMESTAMP (eller vad det nu heter i mySQL)?
Vad är det du vill plocka ut ur statistikdatabasen, vilka typer av listningar?
------------------
"To iterate is human, to recurse, divine" - L. Peter Deutch
[Redigerat av sgtpepper den 08 sep 2001]
NiklassonMedlem sedan nov. 2000823 inlägg
Visst, jag är inte noga med att ha en tabell per månad. Det var bara en kul grej som jag körde med.
$tid = time();
Vad är det du vill plocka ut ur statistikdatabasen, vilka typer av listningar?
Allt som bara går. Även information som jag inte tänkt på att logga - ju mer desto bättre... ;)
------------------
http://www.niklasson.net/
sgtpepperMedlem sedan apr. 20005 524 inlägg
Allt som bara går. Även information som jag inte tänkt på att logga - ju mer desto bättre...
Ok, det hela hänger ju på att skriva SQL-satser som plockar ut den data som du vill ha.
Eftersom det går att kombinera informationen på en driljard sätt (något överdrivet :)) så vore det bra om du specade det som du vill visa på din statistiksida, t.ex:
* Samtliga antal besök sedan start
* Antal besök detta år
* Antal besök denna månad
* Mest använda webbläsare
* Flest besökare kom från..
osv.
Det är lite svårt att täcka in alla olika fall med ett script eftersom du kanske vill lista samtliga användare under april som använde IE 4.0 och som kom från www.webforum.nu mellan 12:00 och 14:00 på dagen :e. Du måste som sagt specificera vad du vill plocka ut för info.
När du definerat typen av statistik som du vill visa så kan vi börja mecka ihop SQL.
------------------
"To iterate is human, to recurse, divine" - L. Peter Deutch
NiklassonMedlem sedan nov. 2000823 inlägg
ok. Detta är väl ungefär vad jag tänkt mig.
Man skulle kunna väla startdag samt slutdag, och på detta sättet få fram statistik över en speciell period.
1. Antal besök per datum, veckodag, samt timme. Även snitt per dag vore kul.
2. De bästa 30 referers
3. Topp10 språk ($HTTP_ACCEPT_LANGUAGE)
4. Topp10 OS ($HTTP_USER_AGENT)
5. Topp 10 hosts ($HTTP_USER_AGENT)
6. Topp 10 Browsers
Allt utöver detta är naturligtvis bonus och kul. Tanken är att i framtiden även erbjuda andra att använda det gratis, så det vore extra kul att kunna visa ännu mer info.
Idag har jag en cookie som varar tills browsern stängs ner, men man kunde kanske löst loggfunktionen annorlunda, så man kunde få statistik på varje enskild undersida också eller nåt. (Man kan ju kanske köra procent)
Hmm, nåt annat kommer jag inte på just nu.. :e
Det kändes som en hel del och känns som om jag kanske förväntar mig för mycket av dig, men i så fall får du naturligtvis säga ifrån.. ;)
------------------
http://www.niklasson.net/
LarsGMedlem sedan dec. 200012 465 inlägg
Grunden för att få ut statistik på ett enkelt sätt är att du har allt i en tabell. (I alla fall så länge du använder Mysql och deras begränsade SQL.)
De SQL-frågor du behöver ställa blir oftast i form av group by
- Antal besök per dag
select count(*),year(from_unixtime(tid)),month(from_unixtime(tid)),dayofmonth(from_unixtime(tid))
from stats
where tid between '$startdate' and '$enddate'
group by year(from_unixtime(tid)),month(from_unixtime(tid)),dayofmonth(from_unixtime(tid))
De andra varianterna får du genom att ändra uttrycken i group by. Det finns en hel del funktioner för att plocka ut delar av datum
http://www.mysql.com/doc/D/a/Date_and_time_functions.html
snitt per dag
select (count(*)+0.0) / (count(distinct to_days(from_unixtime(tid)) + 0.0)
from stats
where from_unixtime(tid) between '$startdate' and '$enddate'
group by year(from_unixtime(tid)),dayofyear(from_unixtime(tid))
top 30 referer
select referer ,
count(*) as antal
from stats
group by referer
order by 2 desc limit 30
top 10 language
select sprak,
count(*) as antal
from stats
group by sprak
order by 2 desc limit 10
osv
Det är nog bättre att använda en datum/tid datatyp för att lagra tid än integer
------------------
essentitia preter non sans multiplicandum
sgtpepperMedlem sedan apr. 20005 524 inlägg
Ah, LarsG hann före mig med SQL-koden, bra, då slapp jag :e
så man kunde få statistik på varje enskild undersida också eller nåt
Du kan lägga till en kolumn i databasen som lagrar URLen till den sida som loggas och där lägga värdet i HTTP_REFERER som du får fram i statistikscriptet, innehållet kommer vara adressen till den sida som innehöll "bilden". På så sätt kan du även visa statistik för enskilda sidor likväl som för hela sajten.
------------------
"To iterate is human, to recurse, divine" - L. Peter Deutch
NiklassonMedlem sedan nov. 2000823 inlägg
Hej igen! nu har jag testat lite kod och det gick kyfsat på referers. Jag har ännu inte loggat infot med javascript, men det tänker jag fixa så fort jag hinner.
En fråga dock: Hur filtrerar jag så att adresser som bara skiljs åt med en foreslash visas som samma referer. Tex http://www.niklasson.net och http://www.niklasson.net/ - även http://niklasson.net och http://niklasson.net/ ?
Angående Topp browsers: Det fungerar ju precis som ovanstående, men det står ju för IE så här: (ex 5.01) Mozilla/4.0 (compatible; MSIE 5.01; Windows 98)
Hur kan jag fixa så att det istället står tex. "Internet Explorer 5.01" eller "Netscape 4.71" och att jag sedan i en annan tabell kan köra en liknande query där jag får fram alla de olika OS: Tex. Windows 98, ME, 2000, 95 o.s.v.
Koden med antal besök per dag fattar jag inte över huvud taget. Det är ju bara en SQL-fråga och jag vet inte hur jag skall koda slingan heller. Det hade underlättat att få lite hjälp med det.. ;)
LarsG:
Det är nog bättre att använda en datum/tid datatyp för att lagra tid än integer
Vad menar du här? Om man vill ha fram YYYY-MM-DD så är det väl bara att konvertera det med date("Y-m-d",$tid) :q
Om ni fortfarande orkar hjälpa mig så vore det bra, eftersom jag redan lärt mig mycket och törstar efter mer.. :e
------------------
http://www.niklasson.net/
LarsGMedlem sedan dec. 200012 465 inlägg
Det är enklast om du ordnar till adresserna innan du stoppar in dom i databasen. Man kan ju skriva något med ereg_replace. (Jag kan inte sådant.)
referer kan ju se ut lite hur som helst. Du får nog lägga in så att du känner igen vissa strängar (det går också bra med ereg) och sedan plockar ut bitar med substr.
Beräkningen av snittbesökare blev lite fel
select (count(*)+0.0) / (count(distinct to_days(from_unixtime(tid)) + 0.0) as avg_visits
from stats
where from_unixtime(tid) between '$startdate' and '$enddate'
ger snittet under en viss period. Om du vill ha totalt så är det bara att ta bort villkoret.
Om du vill ha per veckodag
select (count(*)+0.0) / (count(distinct to_days(from_unixtime(tid)) + 0.0) as avg_visits,weekday(from_unixtime(tid))
from stats
where from_unixtime(tid) between '$startdate' and '$enddate'
group by weekday(from_unixtime(tid))
$query = "select (count(*)+0.0) / (count(distinct to_days(from_unixtime(tid)) + 0.0) as avg_visits
from stats
where from_unixtime(tid) between '$startdate' and '$enddate'";
$result = mysql_query($query);
while ($line = mysql_fetch_array($result)) {
echo $line["avg_visits");
}
Jo, det är klart att det går bra att lagra tiden i en integer, men då får du ingen kontroll på att du lagrar giltiga datum. Om du använder datum så slipper du konverteringen from_unixtime i sql-frågorna.
------------------
essentitia preter non sans multiplicandum