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:
`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 "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:
//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:
$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:
{
return $_SERVER["REMOTE_ADDR"];
}
Visszaadja a felhasználó ip címét.
{
$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.
{
$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.
{
$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.
{
$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.
{
$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:
$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
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.
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…
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
*/