Repository 32bit  Forum
Repository 64bit  Wiki

visite sito

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza dell'ultima regola porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

visite sito

Messaggioda submax82 » lun ago 17, 2009 1:35

avete idea di che possibile bug ci sia in questo codice che uso per contare le visite del mio sito?

Codice: Seleziona tutto
<?php
session_start();
$database_txt = "visite.txt";
if( (file_exists("$database_txt")) == false )
{
  touch("$database_txt");
  chmod("$database_txt", 0664);
  $db_file = @fopen("$database_txt","w");
  @fwrite($db_file, 1);
  @fclose($db_file);
}
if(!$_SESSION["views"])
{
$tot = file("$database_txt");
$tot[0]++;
$db_file = @fopen("$database_txt", "w");
@fputs($db_file , $tot[0]);
@fclose($db_file);
$_SESSION["views"] = 1;
}
?>


funziona bene ma è già 2 volte che mi capita che riparte da 1... poi le riaggiusto io e funziona, anche se non ricordo mai il numero esatto... quindi metto sempre meno, è una cosa antipatica ma non capisco il problema, ammesso che ci sia :-k
Avatar utente
submax82
Staff
Staff
 
Messaggi: 3202
Iscritto il: mer ago 31, 2005 0:00
Desktop: xfce
Distribuzione: SalixOS

Re: visite sito

Messaggioda SIV » lun ago 17, 2009 4:22

Non è che qualche volta per qualche x motivo, il file del database non viene trovato, la condizione diventa "false" ed il file viene ricreato ?
Avatar utente
SIV
Linux 2.6
Linux 2.6
 
Messaggi: 911
Iscritto il: mer apr 25, 2007 14:07
Località: Bari (Provincia)
Distribuzione: ArchLinux

Re: visite sito

Messaggioda raffaele181188 » lun ago 17, 2009 9:33

Beh, tutto è possibile, però visto che la cosa si ripete :D
SubMax, ora non ho PHP sottomano per fare alcune prove, comunque può darsi anche che il problema sia quel $tot[0]++, visto che si tratta di una stringa e magari può contenere uno spazio o una newline. A parte questo, ci sono delle cose "strane" in quel codice
  • $database_txt è sempre usato tra apici doppi... perchè?
  • touch() serve per fare altro: per creare un file si usa fopen($nomeFile, 'w')
  • $tot[0], come ti dicevo, è una stringa, quindi andrebbe come minimo dato a trim()
Comunque effettivamente è strano, appena posso faccio una prova
Avatar utente
raffaele181188
Packager
Packager
 
Messaggi: 789
Iscritto il: ven set 07, 2007 21:40
Località: DearSkin (FG)
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu

Re: visite sito

Messaggioda raffaele181188 » lun ago 17, 2009 10:52

UPDATE
Ho fatto un test e boh... funziona tutto in locale (ripetuto diecimila volte). Ho usato il tuo codice cambiando solo una riga in questo modo per adattarlo al test:
Codice: Seleziona tutto
if(!isset($_SESSION["views"]))
Avatar utente
raffaele181188
Packager
Packager
 
Messaggi: 789
Iscritto il: ven set 07, 2007 21:40
Località: DearSkin (FG)
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu

Re: visite sito

Messaggioda submax82 » lun ago 17, 2009 11:02

in php sono alle prime armi, sto imparando quindi... booo ... mi affido a voi :oops:
Avatar utente
submax82
Staff
Staff
 
Messaggi: 3202
Iscritto il: mer ago 31, 2005 0:00
Desktop: xfce
Distribuzione: SalixOS

Re: visite sito

Messaggioda conraid » lun ago 17, 2009 11:39

Ognuno ha i propri metodi e abitudini, però, a parte il discorso delle sessioni, io farei così

Codice: Seleziona tutto
$database_txt = 'visite.txt';
if(file_exists($database_txt)) {
   $tot = file_get_contents($database_txt);
} else {
   $tot = 1;
}
file_put_contents($database_txt , $tot);


non ha senso il codice di creazione del file, tanto se non esiste viene creato automaticamente

imho mai usare @, nemmeno in produzione
Avatar utente
conraid
Staff
Staff
 
Messaggi: 11904
Iscritto il: gio lug 14, 2005 0:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: visite sito

Messaggioda raffaele181188 » lun ago 17, 2009 12:15

Per risolvere il tuo errore non so che dirti, puoi provare a tenere un log separatamente perchè mi pare che nonostante tutto non ci siano errori

Offtopic: Ovviamente sul codice sono d'accordo con Conraid, solo che è sempre pericoloso dare consigli perchè non tutti la prendono bene :D
La @, invece, io la userei sempre: l'eventuale warning che viene fuori è troppo troppo dettagliato per mostrarlo al mondo (e poi può scombussolare l'output a livelli inimmaginabili). Quindi o la chiocciola oppure ci si accerta di tappare la bocca a PHP
Avatar utente
raffaele181188
Packager
Packager
 
Messaggi: 789
Iscritto il: ven set 07, 2007 21:40
Località: DearSkin (FG)
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu

Re: visite sito

Messaggioda targzeta » lun ago 17, 2009 12:53

Anche secondo me l'errore è sull'incremento della variabile. Guarda questo piccolo codice inserito nel file casa.php:
Codice: Seleziona tutto
<?php
  $tot = file_get_contents('visite.txt');
  $tot++;

  if ( $tot == 1 )
      echo 'ops ';

  file_put_contents('visite.txt', $tot);
?>

Ora guarda cosa può succedere:
Codice: Seleziona tutto
$> echo 1 > visite.txt
$> php casa.php
ops
La variabile non è stata incrementata ed è rimasta 1, eppure:
Codice: Seleziona tutto
$> cat -e visite.txt
1$
$> file visite.txt
visite.txt: ASCII text

Mentre con questo codice:
Codice: Seleziona tutto
<?php
  $tot = trim(file_get_contents('visite.txt'));
  $tot++;

  if ( $tot == 1 )
      echo 'ops ';

  file_put_contents('visite.txt', $tot);
?>

Abbiamo un esecuzione corretta:
Codice: Seleziona tutto
$> echo 1 > visite.txt
$> php casa.php
$> cat -e visite.txt
2
$> file visite.txt
visite.txt: very short file (no magic)

Come vedi quando prelevi da un file una stringa che sai essere un numero è meglio ripulirla sempre da eventuali spazi o caratteri speciali.

Quindi io userei il codice di conraid aggiungendo una trim() e incrementando la variabile, conraid se ne è dimenticato :).

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 5928
Iscritto il: gio nov 03, 2005 15:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: visite sito

Messaggioda targzeta » lun ago 17, 2009 12:59

conraid ha scritto:...imho mai usare @, nemmeno in produzione

Secondo me dipende. Se non controlli il valore di ritorno della funzione allora togliere la @ aiuta molto, però se controlli il valore di ritorno puoi usare la @ per tradurre l'errore in un qualcosa di più leggibile.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 5928
Iscritto il: gio nov 03, 2005 15:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: visite sito

Messaggioda aschenaz » lun ago 17, 2009 13:48

Io uso questo codice scritto diversi anni fa e va tuttora bene:
Codice: Seleziona tutto
function counter() {
      $counterfile=getcwd().DIRECTORY_SEPARATOR."var/cnt.log";
      if(!file_exists($counterfile)) {
         $cmake=fopen($counterfile,"w");
         chmod($counterfile,0777);
         fputs($cmake,"0");
         fclose($cmake);
      }
      if(!isset($_SESSION["counter"])) {
         $cfop=fopen($counterfile,"r+");
         $acc=fgets($cfop,10);
         $acc++;
         fseek($cfop,0);
         fputs($cfop,$acc);
         fclose($cfop);
         $_SESSION["counter"]=$acc;
      } else $acc=$_SESSION["counter"];
      return $acc;
   }
echo counter(); // dove serve

Uniche avvertenze: dare i permessi in scrittura alla directory (che io ho
chiamato var); avviare le sessioni, se non già fatto.
pensieriemotivi.aschenaz.eu - music-blog
Avatar utente
aschenaz
Staff
Staff
 
Messaggi: 4279
Iscritto il: mer lug 28, 2004 0:00
Località: Reggio Calabria
Nome Cognome: Antonino Branca
Slackware: current 64bit
Kernel: 3.9.5
Desktop: KDE 4.10.4

Re: visite sito

Messaggioda conraid » lun ago 17, 2009 14:31

spina ha scritto:Quindi io userei il codice di conraid aggiungendo una trim() e incrementando la variabile, conraid se ne è dimenticato :).


ehm... premetto che di programmazione capisco il giusto e qui siete tutti migliori di me, e soprattutto sbaglierò qualcosa, ma non me ne sono scordato. Quello era un codice di esempio, senza controllo errori (come dici tu vanno controllati, io odio @ perché tra sviluppo e produzione devi modificare tutto, invece se li gestisci puoi lavorare a livelli di una variabile iniziale, anche semplicemente mettendo di non mostrare errori) e senza tante cose, del resto trim lo uso sempre "pulire" le stringhe, ma...
se devo essere sincero in quel caso particolare farei così

Codice: Seleziona tutto
$database_txt = 'visite.txt';
if(file_exists($database_txt)) {
   (int)$tot = file_get_contents($database_txt)+1;
} else {
   $tot = 1;
}
file_put_contents($database_txt , $tot);


lo so che il casting in php è visto di cattivo occhio, ma così sai che è un intero
naturalmente manca sempre la gestione degli errori, in questo caso anche un gettype, non si sa mai cosa possa succedere
Avatar utente
conraid
Staff
Staff
 
Messaggi: 11904
Iscritto il: gio lug 14, 2005 0:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: visite sito

Messaggioda raffaele181188 » lun ago 17, 2009 14:55

Conraid, se il cast non piace c'è sempre intval() che fa esattamente la stessissima cosa ma è una funzione ;)
Il discorso della @ per me va affrontato così: gli errori sono preziosissimi, quindi mettere a tacere una funzione in quel modo può essere addirittura controproducente perchè ti impedisce il debug. Però non si può mostrare a chiunque
Codice: Seleziona tutto
Php[E_WARNING] in /var/www/htdocs/sito1/path/to/file.php at line 13: Errore trallallà

perchè è proprio un pugno in faccia alla sicurezza
L'ideale è sempre agire a monte settando opportunamente il comportamento di PHP con gli errori. Tuttavia in uno scriptino del genere mi pare che la @ sia più che sufficiente

Offtopic: @aschenaz
La chiamata a getcwd() è rischiosa: se lo script viene incluso il risultato è imprevedibile. Meglio dirname(__FILE__)
Dopo tanti anni, potresti anche aggiornare lo script facendogli usare un db vero in modo da poter avere statistiche più utili a disposizione :D Per esempio, un contatore di questo tipo non è in grado di riferire nè quali documenti sono stati richiesti nè quando sono avvenute le richieste.. Tiene traccia solo del numero globale di utenti che hanno visitato il sito, ma è un'indicazione sostanzialmente inutile se non è riferita a qualche indice temporale
Avatar utente
raffaele181188
Packager
Packager
 
Messaggi: 789
Iscritto il: ven set 07, 2007 21:40
Località: DearSkin (FG)
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu

Re: visite sito

Messaggioda submax82 » mar ago 18, 2009 0:01

grazie a tutti, rileggo tutto bene dopo... =D>

:thumbright:
Avatar utente
submax82
Staff
Staff
 
Messaggi: 3202
Iscritto il: mer ago 31, 2005 0:00
Desktop: xfce
Distribuzione: SalixOS

Re: visite sito

Messaggioda submax82 » mar ago 18, 2009 0:48

grazie ai vostri consigli ho modificato il codice ed ecco il risultato:

Codice: Seleziona tutto
<?php
session_start();
$database_txt = 'db_views.txt';
if(!$_SESSION["views"])
{
   if(file_exists($database_txt))
      $tot = intval(trim(file_get_contents($database_txt)));
   else
      $tot = 0;
   $tot++;
   //file_put_contents required PHP5
   $db_file = @fopen($database_txt, "w");
   @chmod($database_txt, 0664);
   @fseek($db_file, 0);
   @fputs($db_file, $tot);
   @fclose($db_file);
   $_SESSION["views"] = $tot;
}
?>


sembra funzionare bene... grazie a TUTTI :thumbright: :love4: :notworthy:
Avatar utente
submax82
Staff
Staff
 
Messaggi: 3202
Iscritto il: mer ago 31, 2005 0:00
Desktop: xfce
Distribuzione: SalixOS

Re: visite sito

Messaggioda submax82 » mar ago 18, 2009 22:39

qualcuno si ricorda se il numero di visite ripristinato del mio sito è esatto? tanto per essere sicuri di non aver fatto cavolate :lol:
Avatar utente
submax82
Staff
Staff
 
Messaggi: 3202
Iscritto il: mer ago 31, 2005 0:00
Desktop: xfce
Distribuzione: SalixOS


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Google [Bot] e 1 ospite

cron