In aceasta pagina e prezentata o clasa PHP care poate fi folosita pentru inregistrare, contorizare si afisare numar de accesari fisiere, precum si data ultimei accesari pentru fiecare.
Poate fi utilizata in special pentru contorizare descarcari (contor downloads). Datele sunt salvate in tabel MySQL.
Aceasta clasa, denumita CountAccess se conecteaza la baza de date MySQL folosind extensia PHP mysqli. Are trei metode si Constructor:
<?php
// - Clasa CountAccess ( www.marplo.net )
// inregistreaza si contorizeaza numarul de accesari
class CountAccess {
// defineste proprietati pentru numele tabelului si a coloanelor
public $tb_name = 'access';
public $tb_cols = array('urlf'=>'urlf', 'nrac'=>'nrac', 'dt'=>'dt');
// proprietate pt. retinerea conexiunii la MySQL
protected $conn;
// Constructor
public function __construct($server, $user, $pass, $db) {
// creaza conexiunea la MySQL (o retine in proprietatea $conn)
$this->conn = new mysqli($server, $user, $pass, $db);
if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit; }
// verifica daca in $db exista tabelul din $tb_name
// daca nu exista, apeleaza metoda setTable() ca sa creeze tabelul
$Tables_in_db = 'Tables_in_'.$db;
if($result=$this->conn->query("SHOW TABLES IN $db WHERE `$Tables_in_db` = '$this->tb_name'")) {
if(mysqli_num_rows($result)<=0) {
$this->setTable();
$result->close();
}
}
}
// metoda pt. crearea tabelului
private function setTable() {
// sql query pt. CREATE TABLE
$sql = "CREATE TABLE `$this->tb_name` (
`". $this->tb_cols['urlf']. "` VARCHAR(88) PRIMARY KEY NOT NULL,
`". $this->tb_cols['nrac']. "` INT(8) UNSIGNED DEFAULT 1,
`". $this->tb_cols['dt']. "` TIMESTAMP
) CHARACTER SET utf8 COLLATE utf8_general_ci";
// executa $sql pt. a crea tabelul, in caz de esec returneaza eroarea
if (!$this->conn->query($sql) === TRUE) {
echo 'Eroare creare tabel: '. $this->conn->error;
}
}
// metoda pt. insert / update contor si data a valorii din $urlf
public function setAccess($urlf) {
$urlf = $this->conn->real_escape_string($urlf); // filtrare caractere speciale pentru a fi utilizate in interogare SQL
// sql query pt. INSERT / UPDATE
$sql = "INSERT INTO `". $this->tb_name. "` (`". $this->tb_cols['urlf']. "`) VALUES ('$urlf') ON DUPLICATE KEY UPDATE `". $this->tb_cols['nrac']. "`=`". $this->tb_cols['nrac']. "`+1";
// transmite $sql query la serverul MySQL, in caz de esec returneaza eroarea
if (!$this->conn->query($sql) === TRUE) {
echo 'Eroare: '. $this->conn->error;
}
}
// metoda pt. select numar de accesari si data ultimei accesari a valorii din $urlf
public function getAccess($urlf) {
$urlf = $this->conn->real_escape_string($urlf); // filtrare caractere speciale pentru a fi utilizate in interogare SQL
// sql query pt. SELECT
$sql = "SELECT `". $this->tb_cols['nrac']. "`, DATE_FORMAT(`". $this->tb_cols['dt']. "`, '%d-%m-%Y %H:%i') AS dt FROM `". $this->tb_name. "` WHERE `". $this->tb_cols['urlf']. "`='$urlf' LIMIT 1";
// efectueaza interogarea si retine rezultatul
$result = $this->conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
// adauga numar de accesari si data intr-0 variabila pt. return
while($row = $result->fetch_assoc()) {
$re = 'Accesari: '. $row['nrac']. ', ultima in: <i>'. $row['dt']. '</i>';
}
}
else { $re = 'Accesari: 0, ultima in: 0'; }
// inchide $result, pentru a elibera memoria
$result->close();
return $re; // returneaza sirul din $re
}
}
/* Utilizare clasa CountAccess */
// datele pt. conectare la baza de date mysql (adresa_server, utilizator, parola si nume_baza_date)
$server = 'localhost';
$user = 'utilizator';
$pass = 'parola';
$db = 'nume_baza_date';
// creaza conexiunea MySQL si o instanta de obiect la clasa CountAccess
$objCA = new CountAccess($server, $user, $pass, $db);
// daca exista $_GET['urlf']
if (isset($_GET['urlf'])) {
$urlf = trim(strip_tags($_GET['urlf'])); // sterge tag-uri si spatii exterioare
// apeleaza metoda setAccess() pt. insert / update numar accesari
$objCA->setAccess($urlf);
// Redirectioneaza browser-ul la adresa din $urlf
header("Location: " . $urlf); exit;
}
?>
<?php
// include fisierul cu clasa CountAccess
include('class.CountAccess.php');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Contor Downloads</title>
</head>
<body>
<h3>Download</h3>
<!-- Link-urile de Download, prin fisierul class.CountAccess.php -->
<a href="class.CountAccess.php?urlf=download/test.zip" title="Download test">Download Test</a> -
<?php echo $objCA->getAccess('download/test.zip'); ?>
<br />
<a href="class.CountAccess.php?urlf=Smile.zip" title="Download Smile">Download Smile</a> -
<?php echo $objCA->getAccess('Smile.zip'); ?>
</body>
</html>
Acest cod va afisa ceva similar cu:
<?php
// include fisierul cu clasa CountAccess
include('class.CountAccess.php');
$name = 'o_valoare_de_tip_sir';
$objCA->setAccess($name); // insert / update numar accesari pentru $name
echo $objCA->getAccess($name); // afiseaza numarul de accesari si data
?>