Contoar downloads, nr click-uri

Aici prezentati probleme, intrebari, sau orice subiecte legate de scripturi si tutoriale de pe site.
Avatar utilizator
trif
Mesaje: 500

Contoar downloads, nr click-uri

salut, am si eu o problema, folosesc contorul acela de dw si nr click-uri dar eu nu mai vreau sa dw ci doar sa ma trimita la un link care il am eu in bd. de exemplu: am in bd data asta: google.ro si yahoo.com si eu cand dau click pe una din ele sa imi inregistreze nr click. eu am modificat un pic bd si este asa:

Cod: Selectaţi tot

id ---- titlu ---- descriere ---- url ---- nrac ---- dt
si preiau cu

Cod: Selectaţi tot

<a class="link" href="class.CountAccess.php?url='.$rand['url'].'">'.$rand['titlu'].'<span><b>Descriere:</b><br> '.$rand['descriere'].'<br>  <td> Nr. accesari: <td>'.$rand['nrac'].'</td></span></a>
in class.CountAccess.php am

Cod: Selectaţi tot

<?php
// - Clasa CountAccess ( marplo.net )
// inregistreaza si contorizeaza numarul de accesari
class CountAccess {
  // defineste proprietati pentru numele tabelului si a coloanelor
  public $tb_name = 'motor_de_cautare';
  public $tb_cols = array('url'=>'url', '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['url']. "`  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 $url
	public function setAccess($url) {
    $url = $this->conn->real_escape_string($url);       // filtrare caractere speciale pentru a fi utilizate in interogare SQL
    // sql query pt. INSERT / UPDATE
$sql = "UPDATE `". $this->tb_name. "`  SET `". $this->tb_cols['nrac']. "`=(`". $this->tb_cols['nrac']. "`+1) WHERE `". $this->tb_cols['url']. "`='$url'";
    // 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 $url
	public function getAccess($url) {
    $url = $this->conn->real_escape_string($url);       // 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['url']. "`='$url' 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-un array
      while($row = $result->fetch_assoc()) {
        $re['nrac'] = $row['nrac'];
        $re['dt'] = $row['dt'];
      }
    }
    else {
      $re['nrac'] = 0;
      $re['dt'] = 0;
    }
    // inchide $result, pentru a elibera memoria
    $result->close();
    return $re;          // returneazae Array-ul $re
  }
}
      /* Utilizare clasa CountAccess */
// datele pt. conectare la baza de date mysql (adresa_server, utilizator, parola si nume_baza_date)
$server = 'localhost';
$user = 'root';
$pass = '';
$db = 'motor_de_cautare';
// creaza conexiunea MySQL si o instanta de obiect la clasa CountAccess 
$objCA = new CountAccess($server, $user, $pass, $db);
// daca exista $_GET['url']
if (isset($_GET['url'])) {
  $url = trim(strip_tags($_GET['url']));        // sterge tag-uri si spatii exterioare
  // apeleaza metoda setAccess() pt. insert / update numar accesari
  $objCA->setAccess($url);
  // Redirectioneaza browser-ul la adresa din $url
  header("Location: " . $url); exit;
}
// functia returneaza numarul de accesari si data ultimei accesari
function getUrlAc($url) {
  GLOBAL $objCA;
  // apeleaza metoda getAccess() care returneaza un array cu contorul si data inregistrata
  $ar_access = $objCA->getAccess($url);
  // returneaza rezultatul
  return 'Accesari: '. $ar_access['nrac']. ' ultima in: <i>'. $ar_access['dt']. '</i>';
}
?>
si nu stiu de ce cand dau pe link nu imi creste adica nu imi face nici un update chit ca nu imi da nici o eroare ci nu vrea sa faca nimic. nu stiu ce sa ii fac. te uiti marplo u peste ca sti mai bine cum este gandit clasa si sa imi zici ce trebuie sa fac in situatia asta sau daca sti un alt cod de contorizare doar pt link-uri care te trimit la alta pagini cum este de exemplu:

Cod: Selectaţi tot

google    nr acc: 2
yahoo    nr acc: 0
si tot asa. multumesc anticipat. cu stima trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje: 4343
Salut
Incearca varianta aceasta:

Cod: Selectaţi tot

<?php
// - Clasa CountAccess ( marplo.net )
// inregistreaza si contorizeaza numarul de accesari
class CountAccess {
  // defineste proprietati pentru numele tabelului si a coloanelor
  public $tb_name = 'motor_de_cautare';
  public $tb_cols = array('id'=>'id', 'titlu'=>'titlu', 'url'=>'url', '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; }
   }

  // metoda pt. update contor si data a valorii din $url
   public function setAccess($url) {
    $url = $this->conn->real_escape_string($url);       // filtrare caractere speciale pentru a fi utilizate in interogare SQL
    // sql query pt. UPDATE
$sql = "UPDATE `". $this->tb_name. "` SET `". $this->tb_cols['nrac']. "`=(`". $this->tb_cols['nrac']. "`+1), `". $this->tb_cols['dt']. "`=NOW() WHERE `". $this->tb_cols['url']. "`='$url'";
    // 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 $url
   public function getAccess($url) {
    $url = $this->conn->real_escape_string($url);       // 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['url']. "`='$url' 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-un array
      while($row = $result->fetch_assoc()) {
        $re['nrac'] = $row['nrac'];
        $re['dt'] = $row['dt'];
      }
    }
    else {
      $re['nrac'] = 0;
      $re['dt'] = 0;
    }
    // inchide $result, pentru a elibera memoria
    $result->close();
    return $re;          // returneazae Array-ul $re
  }
}
      /* Utilizare clasa CountAccess */
// datele pt. conectare la baza de date mysql (adresa_server, utilizator, parola si nume_baza_date)
$server = 'localhost';
$user = 'root';
$pass = '';
$db = 'motor_de_cautare';
// creaza conexiunea MySQL si o instanta de obiect la clasa CountAccess
$objCA = new CountAccess($server, $user, $pass, $db);

// pentru test, poate fi sters
$_GET['url'] = isset($_GET['url']) ? $_GET['url'] : urlencode('http://https://marplo.net/index.php');


// daca exista $_GET['url']
if (isset($_GET['url'])) {
  $url = trim(strip_tags(urldecode($_GET['url'])));        // sterge tag-uri si spatii exterioare
  // apeleaza metoda setAccess() pt. insert / update numar accesari
  $objCA->setAccess($url);
  // Redirectioneaza browser-ul la adresa din $url
  //header("Location: " . $url); exit;       // redirect si exit rezulta in neexecutare cod de mai jos
}
// functia returneaza numarul de accesari si data ultimei accesari
function getUrlAc($url) {
  GLOBAL $objCA;
  // apeleaza metoda getAccess() care returneaza un array cu contorul si data inregistrata
  $ar_access = $objCA->getAccess($url);
  // returneaza rezultatul
  return 'Accesari: '. $ar_access['nrac']. ' ultima in: <i>'. $ar_access['dt']. '</i>';
}

echo getUrlAc($url);            // Afiseaza nr. accesari si data
?>
- E testat si functioneaza, dar trebuie adaptat la ce ai.

Precizari:
Cand se adauga o adresa URL in adresa de link, trebuie aplicata functia urlencode() , iar la preluare $url se aplica decodarea cu urldecode() , ar veni asa:

Cod: Selectaţi tot

<a class="link" href="class.CountAccess.php?url='.urlencode($rand['url']).'">'.$rand['titlu'].'<span><b>Descriere:</b><br> '.$rand['descriere'].'<br>  <td> Nr. accesari: <td>'.$rand['nrac'].'</td></span></a>
Daca aplici redirect (cu header() ), se executa codul clasei, face update, dar cand redirectioneaza nu mai e folosita clasa pt. preluare nr. accesari, decat daca o incluzi si in fisierul unde duce redirectul.

trif Mesaje: 500
salut, merge codul foarte bine dar este o mica problema ca eu vreau ca nu sa ma duca la o pagina unde sa imi arate nr de accesari si data accesarii ci eu vreau ca sa mi se duca la pagina la care este link-ul adica daca dau click pe google.ro sa mi se duca pe google.ro dar sa mi se inregistreze ca s-a dat click pe link. am incercat sa tot modific acest cod dar nu m-am prins. ma ajuti te rog frumos si cu asta. multumesc anticipat, cu stima trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje: 4343
Foloseste acel redirect cu header(), e in cod, dar cu 2 slash-uri in fata "//" (dupa $objCA->setAccess($url);), sterge cele doua slash-uri.

trif Mesaje: 500
merge, multumesc frumos, cu stima trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif