Pagina 1 din 1

problema UPDATE coloana TIMESTAMP

Scris: Vin Noi 25, 2011
de trif
Salut, am si eu o problema, am codul acesta:

Cod: Selectaţi tot

$dt= date("Y-m-d H:i:s ");
class CountAccess {
  // defineste proprietati pentru numele tabelului si a coloanelor
  public $tb_name = 'cantari_ppt';
  public $tb_cols = array('urlf'=>'urlf', 'nrac'=>'nrac', 'dt'=>'dt');
...
$sql = "UPDATE `". $this->tb_name. "`  SET `". $this->tb_cols['nrac']. "`=(`". $this->tb_cols['nrac']. "`+1), `". $this->tb_cols['dt']. "`=('$dt') WHERE `". $this->tb_cols['urlf']. "`='$urlf'";
 
vreau ca sa fac update doar atunci cand ii dau eu sa faca update. pentru ca am avut in urma in bd

Cod: Selectaţi tot

timestamp ---- on update CURRENT_TIMESTAMP ---- CURRENT_TIMESTAMP ---- on update CURRENT_TIMESTAMP
si asta insemana ca atunci cand faceam o modificare la cantare (nu neaparat sa o deschid ci cand ii schimbam numele) mi se schimba data. pe mine ma intereseaza ca numai atunci cand se descarca sa mi se modifice data nu tot timpul. am aici tot codul:

Cod: Selectaţi tot

<?php
// - Clasa CountAccess ( marplo.net )
// inregistreaza si contorizeaza numarul de accesari
  $dt = date("Y-m-d H:i:s ");
class CountAccess {
  // defineste proprietati pentru numele tabelului si a coloanelor
  public $tb_name = 'cantari_ppt';
 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 = "UPDATE `". $this->tb_name. "`  SET `". $this->tb_cols['nrac']. "`=(`". $this->tb_cols['nrac']. "`+1), `". $this->tb_cols['dt']. "`=('$dt') WHERE `". $this->tb_cols['urlf']. "`='$urlf'";    // 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-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 = 'ialexs';
$db = 'cantari_ppt';

// 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;
}

// functia returneaza numarul de accesari si data ultimei accesari
function getUrlAc($urlf) {
  GLOBAL $objCA;

  // apeleaza metoda getAccess() care returneaza un array cu contorul si data inregistrata
  $ar_access = $objCA->getAccess($urlf);

  // returneaza rezultatul
  return 'Accesari: '. $ar_access['nrac']. ' ultima in: <i>'. $ar_access['dt']. '</i>';
}
?>
va uitati sa vedeti cum se modifica ca sa pot face ceea ce vreau eu. va multumesc anticipat. cu stima trif

problema UPDATE coloana TIMESTAMP

Scris: Sâm Noi 26, 2011
de MarPlo
Salut
Daca Update-ul prin care modifiici numele e separat de cel care inregistreaza numarul de descarcari (din codul de mai sus), ca sa nu modifice valoarea din coloana "dt", incearca sa ai instructiunea asta in acel Update:

Cod: Selectaţi tot

"... SET ... `dt`=`dt` ..."
- adica sa se actualizeze cu propria valoare, neschimbata.