Pagina 1 di 1

il campo text del db si decrementa inspiegabilmente

Inviato: 16/11/2014, 20:18
da Albe72
Salve, sono un nuovo iscritto e ringrazio anticipatamente dell'aiuto. Il problema che ho è il seguente.
Sto realizzando un contatore di download. Ogni volta che un visitatore clicca sul link di un file, il contatore del download di quel file si incrementa di una unità. Premendo F5 la pagina web mostra il valore del contatore aggiornato. A un certo punto (ad occhio, intorno ai 170 download) il contatore si decrementa improvvisamente e inspiegabilmente (assumendo un valore intorno ai 130 download). Ho pensato a problemi con le virgolette, a problemi di conversione tra stringhe e numeri, ma non ci capisco niente. Sto impazzendo è dire poco... Fornisco i dati del caso e resto in attesa nel caso servisse altro. Grazie!

Questa è la query che crea la tabella, dalla quale potete vedere i campi: a) link_download è il testo del link usato nel tag <a>; b) filename_download è il nome del file completo (compresa l'estensione) che l'utente vuole scaricare; c) counter_download è il valore del contatore. In un primo momento quest'ultimo campo era di tipo INT(11) ma poi, presentatosi questo problema, l'ho cambiato in TEXT. Nonostante questo il problema persiste.

Codice: Seleziona tutto

$sql = "CREATE TABLE IF NOT EXISTS download (
         id_download INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
         link_download TEXT NOT NULL,
         filename_download TEXT NOT NULL,
         counter_download TEXT NOT NULL
         )";
Questo è il codice del file download.php che contiene la query di SELECT e che passa le variabili al file downloading.php con metodo GET. Forse dovrei usare un altro metodo ma non sono molto ferrato in questo...

Codice: Seleziona tutto

<?php

 @mysql_query("SET NAMES 'utf8';"); //imposta in utf-8 i dati del database una volta importati

 $select = 'SELECT * FROM download ORDER BY id_download ASC';

 $result = @mysql_query($select);
 if (!$result) {
  exit('<p>Errore durante la selezione dei dati!<br />' . 'Error: ' . mysql_error() . '</p>');
 }

 if (@mysql_num_rows($result) > 0) {
  while ($row = @mysql_fetch_array($result)) {
   $id = trim($row['id_download']);
   $link = trim($row['link_download']);
   $filename = trim($row['filename_download']);
   $counter = trim($row['counter_download']);
   $ext = substr ($filename, -4);
   if ($ext == ".pdf") { $format = "PDF"; }
   if ($ext == "epub") { $format = "ePub"; }
   if ($ext == "mobi") { $format = "Mobi"; }
   echo "<p>$link - <a href='downloading.php?id=$id&filename=$filename&counter=$counter' target='_blank'>Download $format</a> ($counter)</p>";
  }
 }
?>      
Questo è il codice del file downloading.php contenente la query di UPDATE. In seguito al verificarsi del problema ho pensato di creare una specie di file di log per salvare i valori assunti dai tre contatori ad ogni download, così da ripristinare in un secondo momento i valori corretti via phpMyAdmin.

Codice: Seleziona tutto

<?php
 
 @mysql_query("SET NAMES 'utf8';"); //imposta in utf-8 i dati del database una volta importati

 $id_download = $_GET['id'];
 $filename_download = $_GET['filename'];
 $counter_download = $_GET['counter'] + 1;
 $path = "download/files/" . $filename_download;

 // Query di aggiornamento.   
 $sql = "UPDATE download SET
        counter_download = '$counter_download'
        WHERE id_download = '$id_download'";

 // Controllo errori.       
 if (@mysql_query($sql)) { echo ""; } else { exit(); }

 $select = 'SELECT filename_download, counter_download FROM download';
       
 $result = @mysql_query($select);
 if (!$result) {
  exit('<p>Errore durante la selezione dei dati!<br />' . 'Error: ' . mysql_error() . '</p>');
 }

 $fp = fopen("download/files/counter_log.txt", "a-");
 $date = date('d M Y, H:i:s', time());

 if (@mysql_num_rows($result) > 0) {
  while ($row = @mysql_fetch_array($result)) {
   $filename = trim($row['filename_download']);
   $counter = trim($row['counter_download']);
   $text = "Data e Ora: $date - File: $filename - Contatore: $counter\r\n";
   fwrite($fp, $text);
  }
 }
 fwrite($fp, "------------------------------------\r\n");
 fclose($fp);
 
 header("Location: $path");
?>

Re: il campo text del db si decrementa inspiegabilmente

Inviato: 16/11/2014, 22:16
da Barrnet
Prima di tutto... perché usi un campo STRING per salvare dei numeri?
Inoltre con il tuo codice posso inviarti una qualunque cifra e stabilirti il nuovo numero di download. se aggiungo all'url "&counter=199" il tuo conteggio dei download andrà a 200, se al posto di un numero metto una stringa il tuo conteggio dei download sarà "stringa1".

Re: il campo text del db si decrementa inspiegabilmente

Inviato: 17/11/2014, 22:32
da Albe72
Grazie della tua risposta, Barnet.

Come dicevo nel primo post, all'inizio il campo era un INT(11). Presentatosi il problema ho provato a cambiarlo in TEXT ma non è servito a niente. Da questa cosa ho capito che il problema non era il tipo di dati del campo.

Grazie della tua preziosa osservazione. Ritieni quindi che il valore del mio campo sia cambiato perché un utente ha volontariamente modificato la query string nell'URL? O potrebbe esservi anche un'altra causa?

P.S.: Ho già detto che forse non dovrei usare un get method ma non ho ben idea di come fare. Suggerimenti?

Re: il campo text del db si decrementa inspiegabilmente

Inviato: 18/11/2014, 0:02
da Barrnet
Lanciare una query per incrementarlo, tutto qui.

Re: il campo text del db si decrementa inspiegabilmente

Inviato: 18/11/2014, 1:03
da Anto
Ciao,
devi usare il metodo POST.