18
Tags:
php
Skrevet af
Bruger #2345
@ 04.09.2003
Simpel statistik med PHP & MySQL
Indledning
Denne artikel handler om hvordan du kan lave en simpel statistik, der tæller hits på de sider du ønsker.
Funktionen
Statistikken kommer til at fungere således:
Når en bruger kommer ind på en af dine sider, bliver der indsat en række i din MySQL database med oplysninger om følgende: id, dato, tid og ip.Ud fra databasen kan dataene så sorteres og opstilles kategorisk.
Oprette MySQL tabellen
Først oprettes MySQL tabellen hvori dataene skal gemmes.
CREATE TABLE web_stat (
id varchar(200) NOT NULL default '',
dato date NOT NULL default '0000-00-00',
uge int(2) NOT NULL default '0',
tid time NOT NULL default '00:00:00',
ip varchar(200) NOT NULL default ''
) TYPE=MyISAM;
Så til PHP scriptet
Scriptet laves som en PHP funktion, på den måde skal der kun skrives en linie på hver af de sider der skal laves statistik over.
Den første fil skal være en .inc fil. Opret en fil med navnet
funktioner.inc og indsæt nedenstående script.
function web_stat($name){
include("mysql.inc"); //henter brugernavn og connecter til mysql
$dato = date("Y-m-d"); //Sætter $dato til idag
$tid = date("H:i:s"); //Sætter $tid til den aktuelle tid
$uge = date("W"); //Sætter ugenr.
$ip = $_SERVER['REMOTE_ADDR']; //henter brugerens IP
mysql_query("INSERT INTO web_stat VALUES ('$name','$dato','$uge','$tid','$ip')") or die(mysql_error());
mysql_close();
}
Herefter kan følgende kodestump indsættes på de sider der ønskes statistik over.
include("funktioner.inc");
web_stat("navn"); // navn, er navnet på siden.
Tip: I stedet for at indsætte et navn, kan der indsættes $PHP_SELF så kan den samme kodestump bruges på alle siderne!!
Hente og sortere data
Opret en fil med navnet
statistik.phpDenne fil skal sortere de data der ligger i tabellen
web_statHerunder er et script der viser hits i en given periode.
<?
include("mysql.inc");
//Hvis datoen ikke er sat, bliver den sat fra første hit på siden til idag.
if($dato_fra=="" OR $dato_til==""){
$resultat = mysql_query("SELECT dato FROM web_stat ORDER BY dato LIMIT 0,1");
while ($raekke = mysql_fetch_array($resultat)) {
extract($raekke);
}
$fd = explode("-",$dato);
$dato_fra = "$fd[2]-$fd[1]-$fd[0]";
$dato_til = date("d-m-Y");
}
//Slut
//Form til at indtaste ny periode
echo "<form name='konto' method='post' enctype='multipart/form-data' action='$PHPSELF'>
<table>
<tr>
<td colspan='2'><H4>Perionde: <input type='text' name='dato_fra' size='8' value='$dato_fra'>
<input type='text' name='dato_til' size='8' value='$dato_til'>
<input type='submit' name='indsæt' value='Vis'></td>
</tr>
</form>
//Slut
<tr>
<td colspan='2'><H4> </td>
</tr>
<tr>
<td><H3>Side:</td>
<td><H3>Hits i perioden:</td>
</tr>";
// Vender datoer
$fd = explode("-",$dato_fra);
$dato_fra = "$fd[2]-$fd[1]-$fd[0]";
$fd1 = explode("-",$dato_til);
$dato_til = "$fd1[2]-$fd1[1]-$fd1[0]";
//Slut
//Henter de sider der har været hits på.
$resultat = mysql_query("select distinct id from web_stat Order BY id") or die(mysql_error());
while ($raekke = mysql_fetch_array($resultat)) {
extract($raekke);
//Slut
//Tæller hvor mange hits der har været på hver side
$query = mysql_query("SELECT COUNT(id) AS hits FROM web_stat WHERE id = '$id' AND dato >= '$dato_fra' and dato <= '$dato_til'");
$row = mysql_fetch_assoc($query);
$hits = $row['hits'];
//Slut
//Skriver Hits´ne til browseren.
echo "
<td><H4>$id</td>
<td align='center'><H4>$hits</td>
</tr>";
}
echo "</table>";
mysql_close(); //lukker MySQL forbindelsen
?>
Den sidste kode kan godt se lidt uoverskuelig ud, men prøv at kopiere indholdet. Så kan koden jo rettes som man ønsker det.
Konklution
Her er vist en simpel statistik, den kan naturligvis udbygges således at man kan se hits over en given tid, hvilke ip adresser der er mest aktive osv.
For de mere hardcore kan der også laves grafer over hits pr. dag, mm.
MVH
Groyk.dk
Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.
Del også gerne artiklen med dine Facebook venner:
Kommentarer (18)
Ja, det virker jo fint nok. Tabellen bliver bare rimelig hurtig pænt lang !
Det er lidt en sikkerheds-risiko at kalde sine filer med mysql oplysninger for *.inc
Det kan du til dels have ret i, såfremt man bruger endelsen *.inc skal man placere disse filer i et ikke offentligt bibliotek.
Der mangler nok nogle lidt mere avancerede statestikker - fx unikke besøg (der bliver du nok nødt til både at have ip og host). Det kræver nemlig nogle lidt mere avancerede MySQL-forespørgsler, men man får til gengæld en mere detaljeret statestik...
istedet for at kalde filerne *.inc bør de kaldes *.inc.php eller inc.*.php...
Ellers, en fin artikkel der...
God artikel... Den beskriver hvordan du kan gøre det og giver ideer til fremtidige ting
God artikel
Lærte noget
Tak !
Hvor finder jeg "mysql.inc"
Hvor finder jeg "mysql.inc"
mysql.inc skal du selv oprette den skal lave forbindelse til din database.
Mht. mysql.inc så burde du nok have fortalt i artiklen, at den skulle man selv oprette med sin mysql-info. Man må aldrig tro for godt om dem der læser sådan nogle artikler
. Men ellers ser artiklen fin ud, dog lidt for simpel til at blive rigtig brugbar.
det virker ikke
snøft
Er der nogle der kan komme med et eksempler på mysql.inc
Prøvede med den her
<?
$dbhost = "host";
$database = "datatbase";
$dbuser = "bruger";
$dbpass = "kode";
?>
<?
mysql_connect($dbhost,$dbuser,$dbpass);
mysql_select_db($database);
?>
Men det virker ikke!!! Hjælp
Hej
Hvordan laver man så scriptet også virker i "safe mode"?
Ellers et super script!
Hej
Hvordan laver man så scriptet også virker i "safe mode"?
Ellers et super script!
Forslag til sikkerhed:
ret filnavnet .inc til .php , og tilføj "<?php" i toppen og "?>" i bunden. Det gør nemlig at brugere ikke kan se indholdet af filen. Kan også være det retter problemet med safe mode.
Lover ikke noget, har ikke testet endnu, men skal selv til at lege med lidt statistik.
Kan ikke få det til at virke
Måske du skulle overveje lidt sikkerhed. Da man uden videre kan indsætte tilfældig kode i $ip, og da du ikke har brug for en ip på 200 tegn så er det en god ide at begrænse den.
Du skal være
logget ind for at skrive en kommentar.