Kereső
Kategóriák
Hasznos linkek
Hírdetés
Proba

Grafikus látogató számláló (php + mysql)

A most következő segédletben egy látogató számlálót mutatok be. A számláló grafikus módon jeleníti meg az eredményt, tudja az osszes eddigi látogatást mérni, valamint az éppen online felhasználók számát. Az adatok tárolására mysql adatbázist használ. Most is úgy oldottam meg a feladatot, hogy ha valakinek nem érhető el mysql, az könnyedén átírhatja txt, vagy xml alapúra.

Szükség lesz egy adatbázisra, egy táblával:

CREATE TABLE IF NOT EXISTS `counter` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ip` varchar(255) COLLATE latin2_hungarian_ci NOT NULL,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
)

Ha ez megvan, nyiss egy üres dokumentumot, legyen a neve index.php

<?php include "config.php";?>
<?php include "functions.php";?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Grafikus számláló</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
</head>
<body>
<?php include ("counter.php");?>
</body>
</html>

Ez egy próba oldal, itt látható a script működés közben. Ha te a saját oldaladba szeretnéd betenni, akkor include-olnod kell a counter.php-t, és a config.php-t.  A config.php így néz ki:

<?php
//Ido korlat uj latogato jegyzesehez
$time_limit = 60*30; //fel ora

//Ido korlat jelen levo felhasznalokhoz
$now_limit = 60*5;   //5 perc

//Mysql
$db_host = "localhost";
$db_user = "root";
$db_pass = "";
$db_name = "segedletek_demok";

$conn = mysql_connect($db_host,$db_user,$db_pass);
mysql_select_db($db_name);
mysql_query("SET NAMES LATIN2");

A counter.php végzi magát a munkát:

<?php
$ip_address = getip();

if(is_new_user($ip_address,$time_limit,$conn))
{
    add_new_user($ip_address,$conn);
}
else
{
    update_user($ip_address,$conn);
}

$all_visits     =   get_all_visits($conn);
$actual_visits  =   get_actual_visits($now_limit,$conn);

echo "Összes látogató: ".print_number($all_visits,5)."<br />";
echo "Online látogató: ".print_number($actual_visits,0);

Az itt felhasznált függvények a functions.php-ben vannak definiálva. Logikailag úgy néz ki, hogy az is_new_user() fgv igazat ad vissza, ha nem visszatérő látogatóról van szó az időkorláton belül. Ekkor beszúrjuk az adatbázisba az új látogatót. Ha az adott ip-ről már volt bejegyzés az időkorláton belül, akkor frissítjük annak a dátumát az aktuálisra. Aztán nem marad más, mint lekérdezni, és kiíratni a látogatók számát. A functions.php függvényei:

function getip()
{
    return $_SERVER["REMOTE_ADDR"];
}

Visszaadja a felhasználó ip címét.

function add_new_user($ip, $conn)
{
    $sql = "INSERT INTO counter (`ip`,`date`) VALUES('{$ip}',NOW())";
    $query = mysql_query($sql,$conn);
}

Beszúr az adatbázisba egy új sort  az aktuális látogatóval.

function update_user($ip,$conn)
{
    $sql    =  "SELECT
                   id
                FROM
                    counter
                WHERE(
                    `ip` = '{$ip}')
                ORDER BY
                    `date` DESC
                LIMIT 0,1"
;
    $row    =   mysql_fetch_array(mysql_query($sql,$conn));
    $id     =   $row['id'];

    $sql    =   "UPDATE counter SET `date` = NOW() WHERE (`id` = '{$id}')";
    $query  =   mysql_query($sql);
}

Frissíti az adott ip-ről történt bejegyzés dátumát.

function is_new_user($ip, $time_limit,$conn)
{
    $sql = "SELECT
                `ip`, `date`
            FROM
                `counter`
            WHERE(
                `date` > NOW() - INTERVAL {$time_limit} SECOND AND
                `ip` = '{$ip}')"
;

    $query = mysql_query($sql,$conn);
    return (mysql_num_rows($query) == 0);
}

Ez a függvény lekérdezi az adatbázisból azokat a sorokat, ahol az adott ip-ről már volt látogatás az időkereten belül. Ha volt ilyen, akkor hamissal tér vissza, ha nem talál ilyet, akkor igazzal.

function get_all_visits($conn)
{
    $sql            =   "SELECT COUNT(`id`) AS num FROM counter";
    $row            =   mysql_fetch_array(mysql_query($sql));
    $visit_number   =   $row['num'];

    return $visit_number;
}
function get_actual_visits($now_limit,$conn)
{
    $sql    =   "SELECT COUNT(`id`) AS num FROM counter
                    WHERE (`date` > NOW() - INTERVAL {$now_limit} SECOND)"
;

    $row    =   mysql_fetch_array(mysql_query($sql));

    $actual_number = $row['num'];

    return $actual_number;
}

Ez a két függvény lekérdezi az aktuális valamint az összes látogatót.

function print_number($number,$leading_zeros)
{
    $return    =   "";
    $number    =   sprintf("%0{$leading_zeros}s",$number);

    for ($i = 0; $i<strlen($number);$i++)
    {
        $return .= "<img src='image.php?number={$number[$i]}' alt='{$number[$i]}' />";
    }
    return $return;
}

Ez a függvény, ami grafikus formájúra alakítja a számokat. Én itt egy image.php nevű fájt használtam, ami dinamikusan generálja a képeket. Ha neked ez nem tetszik, megteheted, hogy letöltesz 10 képet (számok 0-9ig), és azokra hivatkozol, vagy átírod az image.php tartalmát. Az image.php így néz ki:

<?php
$num = intval($_GET['number']);

//20*20-as kep
$im = imagecreate(20, 20);

// Hatter, es text
$bg_color   = imagecolorallocate($im, 170, 170, 170);
$text_color = imagecolorallocate($im, 255, 0, 0);

// Write the string at the top left
imagestring($im, 10, 6, 2, $num, $text_color);

// Output the image
header('Content-type: image/png');

imagepng($im);
imagedestroy($im);

Megjeleníti a $_GET['number'] paraméterben kapott számot. Fontos, hogy a $_GET['number'] egy 0-9ig terjedő szám legyen.

Ezzel kész is van a grafikus látogató számláló. Természetesen ez is bővíthető, fejleszthető, de ezt már rád bízom :) Sok sikert!

 

requiem

  • gyuri szerint:

    Szia nagyon szépen köszönöm ezt a szuper kódot.De nekem pont a txt -re lenne szükségem ahogy mondtad könnyen de én nem tudom megcsinálni sajna.

  • szabofe szerint:

    A Bejegyzések ‘MYSQL’ kategóriában található leírások mindegyike teszik, mindegyiket kipróbáltam.
    A “Grafikus látogató számláló (php + mysql)” leírás alapján 10 perc alatt elkészült(fájlok létrehozása copy/paste) teszt jól működik.
    Egy javaslat: Az ismertetőben fel kellene hívni a figyelmet, hogy a “valid_email($email)” függvény a következők miatt
    filter_var -> (PHP 5 >= 5.2.0)
    esetleg free-szolgáltatónál nem fog működni -> pl:ultraweb
    GRATULA…

  • szabofe szerint:

    Egy kiegészítő javaslat az “image.php”-hez:
    function create_szamfajl($num)
    {
    if ($num == ‘.’)
    $im = imagecreate(10, 30);
    else
    $im = imagecreate(20, 30);
    // Átlátszó háttér
    $opacity_hatter = imagecolorallocatealpha ($im, 255, 255, 255, 127);
    imagefill($im, 0, 0, $opacity_hatter);
    // fekete-text és szürke-árnyék
    $text_color = imagecolorallocate($im, 0×0, 0×0, 0×0);
    $shadow_color = imagecolorallocate($im, 0×85, 0×85, 0×85);;
    $font_size = 22;
    // font-fájl
    $font_file = ‘font/FLbrsa1.ttf’;
    //pozició számolás
    $_bx = imageftbbox($font_size, 0 , $font_file, $num);
    $W = abs($_bx[2]-$_bx[0]);
    $H = abs($_bx[5]-$_bx[3]);
    $top_px = (imagesx($im)-$W)/2;
    $top_py = $font_size+4;
    //szöveg és árnyék rajzolás
    imagefttext($im, $font_size, 0, $top_px, $top_py, $text_color, $font_file, $num);
    imagefttext($im, $font_size, 0, $top_px-1, $top_py-1, $shadow_color, $font_file, $num);
    //kép mentése fájlba
    imagepng($im ,’images/’.$num.’.png’);
    imagedestroy($im);
    }
    /* És meghívás */
    //lokális kép-fájlt létrehozó függvény elérésének biztosítása
    include “image.php”;
    function print_number($tartalom,$number,$leading_zeros)
    {
    $return = “”;
    $number = sprintf(“%0{$leading_zeros}s”,$number);
    $number_lenght = strlen($number);
    //csoportosítási pont-kép létrehozás
    create_szamfajl(‘.’);
    echo $tartalom;
    $hezag = 1;
    for ($i = 0; $i<$number_lenght;$i++)
    { /* Lokális szám-fájl létrehozás */
    create_szamfajl($number[$i]);
    /* Megjelenítés a létrehozott lokális szám-fájlból hármasával csoportosítva */
    if ($hezag == $number_lenght-3 || $hezag == $number_lenght-6 || $hezag == $number_lenght-9 || $hezag == $number_lenght-12)
    echo '’;
    else
    echo ”;
    $hezag += 1;
    }
    }
    /* és a “print_number($tartalom,$number,$leading_zeros)” meghívása */
    echo print_number(“Összes látogató száma: “,$all_visits,3).”";
    echo print_number(“Aktuális látogatók száma: “,$actual_visits,0);
    /*
    Aki kipróbálja ne felejtse az “images” könyvtárat létrehozni és a font-fájlt is feltölteni a szerverre!
    Sok sikert a próbához
    szabofe
    */

Szólj hozzá

{"error":["Invalid domain (web.segedletek.hu) for this app"]}