Avatar billede bigtime Nybegynder
24. oktober 2008 - 19:44 Der er 29 kommentarer og
2 løsninger

Besøgstæller men hvordan

Jeg har omkring 20 sider som jeg er ved at lave en admin til og der skal self. bruges besøgstæller så jeg kan se i admin hvor mange besøgne siderne har dagligt hver i sær og hvor mange besøgne der har været i alt på hver side.
men mit spørgsmå er så hvordan er den bedste måde at lave det på.
jeg regner med den skal tælle ip'er.
Avatar billede majbom Novice
24. oktober 2008 - 19:52 #1
jeg bruger det her:

<?php

require_once("funcs.php");

class Counter{
    var $first_visit_date=0;
   
    //CONSTRUCTOR
    function Counter(){
        $first_visit = query("SELECT time FROM counter ORDER BY time ASC LIMIT 1");
        $first_visit = mysql_fetch_array($first_visit);
        $this->first_visit_date = strftime("%d/%m-%Y", strtotime($first_visit['time']));
    }

    function doCount(){
        $ip = $_SERVER['REMOTE_ADDR'];
        $user_agent = $_SERVER["HTTP_USER_AGENT"];
        $host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
        $besoegt_idag = query("SELECT COUNT(*) AS antal FROM counter WHERE ip='$ip' AND date_add(time,interval 24 HOUR) > NOW() ORDER BY id DESC LIMIT 0,1");
        if (!mysql_result($besoegt_idag,0)) {
            query("INSERT INTO counter (time, ip, user_agent, host) VALUES (NOW(),'$ip','$user_agent', '$host')");
        }
    }

    function getTotal(){
        return mysql_result(query("SELECT COUNT(*) AS antal FROM counter"),0);
    }

    function getToday(){
        return mysql_result(query("SELECT COUNT(*) AS antal FROM counter WHERE TO_DAYS(time)=TO_DAYS(NOW()) ORDER BY id DESC"),0);
    }

    function getLast24Hours(){
        return mysql_result(query("SELECT COUNT(*) AS antal FROM counter WHERE date_add(time,interval 24 HOUR) > NOW() ORDER BY id DESC"),0);
    }

    function getFirstVisit(){
        return $this->first_visit_date;
    }

    function getPastYear(){
        return mysql_result(query("SELECT COUNT(*) AS antal FROM counter WHERE DATE_ADD(time, INTERVAL 365 DAY) > NOW() ORDER BY id DESC"),0);
    }

    function getTotalThisYear(){
        return mysql_result(query("SELECT COUNT(*) AS antal FROM counter WHERE YEAR(time)=YEAR(NOW()) ORDER BY id DESC"),0);
    }
}
?>

men det er så kun til en hel side, men det kan jo udvides, hvis det er noget du har styr på.
der mangler lige et par linjer der udelukker bots osv. det gør jeg et andet sted...
Avatar billede moddi100 Seniormester
24. oktober 2008 - 20:29 #2
splazz -> Hvordan tester du så om det er en bot? Og hvad gør $first_visit godt for??
Avatar billede majbom Novice
24. oktober 2008 - 20:43 #3
$first_visit_date er den dag det første besøg har fundet sted, så du kan skrive "antal besøg siden ($first_visit_date)" :)
Avatar billede moddi100 Seniormester
24. oktober 2008 - 20:44 #4
Self, burde jeg have sagt mig selv. :D
Avatar billede majbom Novice
24. oktober 2008 - 20:48 #5
$arr_excl = array('msnbot', 'spyder');

foreach($arr_excl AS excl){
  if(strpos($_SERVER['REMOTE_HOST'], $excl) !== false)
  {
      $match = true;
  }
}

så kan du, hvis $match == true, lade være med at gemme i databasen...
Avatar billede moddi100 Seniormester
24. oktober 2008 - 20:50 #6
For at údvide den til også at dække sider kunne den jo ændres til følgende:

function doCount(){
  $ip = $_SERVER['REMOTE_ADDR'];
  $user_agent = $_SERVER["HTTP_USER_AGENT"];
  $host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
  $side = $_SERVER['PHP_SELF'];
  $besoegt_idag = query("SELECT COUNT(*) AS antal FROM counter WHERE ip='$ip' AND date_add(time,interval 24 HOUR) > NOW() ORDER BY id DESC LIMIT 0,1");
  if (!mysql_result($besoegt_idag,0)) {
      query("INSERT INTO counter (time, ip, user_agent, host, side) VALUES (NOW(),'$ip','$user_agent', '$host', '$side')");
  }
}
Avatar billede majbom Novice
24. oktober 2008 - 21:16 #7
så skal:

$besoegt_idag = query("SELECT COUNT(*) AS antal FROM counter WHERE ip='$ip' AND date_add(time,interval 24 HOUR) > NOW() ORDER BY id DESC LIMIT 0,1");

også lige ændres til:

$besoegt_idag = query("SELECT COUNT(*) AS antal FROM counter WHERE ip='$ip' AND date_add(time,interval 24 HOUR) > NOW() AND side='$side' ORDER BY id DESC LIMIT 0,1");
Avatar billede majbom Novice
24. oktober 2008 - 21:18 #8
men der skal jo så også tilføjes noget når du henter antallene ud med besøgende på de enkelte sider
Avatar billede moddi100 Seniormester
24. oktober 2008 - 21:23 #9
Det ville jeg nok lave lidt alá dette:

function getToday($side){
  return mysql_result(query("SELECT COUNT(*) AS antal FROM counter WHERE TO_DAYS(time)=TO_DAYS(NOW()) AND side='$side' ORDER BY id DESC"),0);
}

function getTotalToday(){
  return mysql_result(query("SELECT COUNT(*) AS antal FROM counter WHERE TO_DAYS(time)=TO_DAYS(NOW()) ORDER BY id DESC"),0);
}

getToday() returnerer så antallet af hits på en specifik side mens
getTotalToday() returnerer det samlede antal hits fra alle sider på en dag.
Det er så bare at gøre det samme med resten af funktionerne, alt efter hvilke data du ønsker.
Avatar billede majbom Novice
24. oktober 2008 - 21:34 #10
gettotaltoday skal nok have en group by ip, så den kun tæller den enkelte ip-adresse én gang, selvom den har besøgt flere sider
Avatar billede moddi100 Seniormester
24. oktober 2008 - 21:37 #11
det kommer an på hvad han ønsker med den. Ønsker han at se unikke så ja, men er det bare hits, skal den være som den er.
Avatar billede majbom Novice
24. oktober 2008 - 21:51 #12
ja det er rigtigt, man kunne også benytte begge options :)
Avatar billede bigtime Nybegynder
24. oktober 2008 - 21:58 #13
hmm sjovt nok har jeg prøvet lidt af det nu men kan ikke få den til at komme med noget i dben.
men den kommer heller ikke med fejl.

ud over det skal query ikke rettes til mysql_query
Avatar billede moddi100 Seniormester
24. oktober 2008 - 22:00 #14
jo i dit tilfælde skal det. Men jeg tror splazz har lavet sin egen funktion i filen funcs.php der netop hedder query().

Og du har oprettet forbindelse til databasen?
Avatar billede majbom Novice
24. oktober 2008 - 22:00 #15
jo, jeg har en funktion i min "funcs.php" der hedder query, som connecter og disconnecter, så jeg slipper for at skrive så meget kode ved de enkelte kald :)

så du skal lige connecte til din db og så bruge mysql_query() or die(mysql_error());
Avatar billede moddi100 Seniormester
24. oktober 2008 - 22:12 #16
Har jeg tilfældigvis også :D
Avatar billede bigtime Nybegynder
24. oktober 2008 - 23:11 #17
hmm kan det passe at        $ip = $_SERVER["REMOTE_ADDR"]; ikke kan fange min ip ?
Avatar billede bigtime Nybegynder
25. oktober 2008 - 00:05 #18
sidder lige og brygger noget nyt sammen men hvor ligger fejlen i det her       


mysql_connect($mysql_host, $mysql_user, $mysql_pw);
        mysql_select_db($mysql_db);
       
$ip = $GLOBALS['REMOTE_ADDR'];


function checkip()
    {
        $ip = $GLOBALS['REMOTE_ADDR'];
        $tis = mysql_query("SELECT count(*) FROM counter WHERE ip='$ip'");
        if(mysql_num_rows($tis) == '0') {
        mysql_query("INSERT INTO counter ('ip') VALUES ('$ip')") or die(mysql_error());
    }
}
?>
Avatar billede majbom Novice
25. oktober 2008 - 07:06 #19
hvor definerer du $GLOBALS['REMOTE_ADDR']?

du kunne evt. sætte en "or die(mysql_error());" efter mysql_connect og select_db
Avatar billede moddi100 Seniormester
25. oktober 2008 - 10:10 #20
synes det lyder underligt at $_SERVER["REMOTE_ADDR"] ikke fanger noget. Prøv at skriv
echo $ip;

og så ville jeg nok putte
mysql_connect($mysql_host, $mysql_user, $mysql_pw);
mysql_select_db($mysql_db);

ind i construktoren, så når der laves en ny class (Counter), opretter den automatisk forbindelse:

function Counter(){ 
    mysql_connect($mysql_host, $mysql_user, $mysql_pw) or die(mysql_error());
    mysql_select_db($mysql_db) or die(mysql_error()); // Prøv lige dette for at tjekke forbindelsen
}
Avatar billede moddi100 Seniormester
25. oktober 2008 - 10:12 #21
Du kan også lige prøve at se om $_SERVER["X_FORWARDED_FOR"] fanger. Har siddet på en server hvor den skulle bruges.
Avatar billede bigtime Nybegynder
25. oktober 2008 - 23:59 #22
har fået den til at funger med $_SERVER["REMOTE_ADDR"] det var lige en lille fejl jeg havde siden den ikke kunne :D

Jeg tror næsten jeg har fået svar på mit spørgsmål :D
jeg laver en selv med lidt brug fra koden øverst.
har bare et lille spørgsmål til angåne med at indsætte det i dben fra andre domæner
hvis jeg bruger denne her kode virker det fint på det domænenavn jeg har dben i men laver jeg en include fil på en af mine andre sider så smider den det ikke i den db som den skal i ?
alle siderne ligger på samme server og har samme ip


        mysql_connect($mysql_host, $mysql_user, $mysql_pw);
        mysql_select_db($mysql_db);


    $ip = $_SERVER['REMOTE_ADDR'];
    $side = $_SERVER['HTTP_HOST'];
    $sex = mysql_query("SELECT * FROM counter WHERE ip='$ip'") or die(mysql_error());
if(mysql_num_rows($sex) == '0') {
mysql_query("INSERT INTO counter (ip,side) VALUES ('$ip','$side')") or die(mysql_error());
}
Avatar billede majbom Novice
26. oktober 2008 - 06:03 #23
hvis jeg bruger denne her kode virker det fint på det domænenavn jeg har dben i men laver jeg en include fil på en af mine andre sider så smider den det ikke i den db som den skal i ?

ikke forstået...

har du flere domæner, eller hvad er det du mener?
Avatar billede bigtime Nybegynder
26. oktober 2008 - 09:01 #24
okay altså hvis jeg laver dben og koden på domæne 1 så virker det.
men laver jeg en include counter.php på domæne 2 (altså counter.php ligger stadig på domæne 1 ) så kan jeg ikke få den til at smide det i databasen på domæne 1 fra domæne 2.

er det nemmere at forstå nu ?
Avatar billede moddi100 Seniormester
26. oktober 2008 - 09:04 #25
Hvis det ligger på samme server, burde der ikke være nogen problemer.
Er $mysql_host sat til localhost??
Avatar billede bigtime Nybegynder
26. oktober 2008 - 09:05 #26
ja de ligger på samme server.
ja den er sat til localhost
Avatar billede moddi100 Seniormester
26. oktober 2008 - 09:12 #27
bruger du en absolut sti? (http://domæne1.dk/counter.php)
Avatar billede bigtime Nybegynder
26. oktober 2008 - 09:14 #28
jeg bruger <? include("http://domæne1.dk/counter.php"); ?>
Avatar billede bigtime Nybegynder
26. oktober 2008 - 09:21 #29
så fik det til at virke.
glemte at smide forbindlsen ind på domæne 2 til domæne 1
Avatar billede majbom Novice
26. oktober 2008 - 09:50 #30
hehe, godt nok.
Avatar billede moddi100 Seniormester
26. oktober 2008 - 10:03 #31
Et svar hvis du synes jeg bør have point :D
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