Repository 32bit  Forum
Repository 64bit  Wiki

visite sito

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
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 della regola 5 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 0: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: mar ago 30, 2005 23:00
Desktop: xfce
Distribuzione: SalixOS

Re: visite sito

Messaggioda SIV » lun ago 17, 2009 3: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: 918
Iscritto il: mer apr 25, 2007 13:07
Località: Bari (Provincia)

Re: visite sito

Messaggioda raffaele181188 » lun ago 17, 2009 8: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 20: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 9: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 20: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 10: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: mar ago 30, 2005 23:00
Desktop: xfce
Distribuzione: SalixOS

Re: visite sito

Messaggioda conraid » lun ago 17, 2009 10: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: 11987
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: visite sito

Messaggioda raffaele181188 » lun ago 17, 2009 11: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 20: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 11: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
Linux Registered User #454438
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: 6149
Iscritto il: gio nov 03, 2005 14: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 11: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
Linux Registered User #454438
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: 6149
Iscritto il: gio nov 03, 2005 14: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 12: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: 4417
Iscritto il: mar lug 27, 2004 23:00
Località: Reggio Calabria
Nome Cognome: Nino
Slackware: current 64bit
Kernel: 3.14.5
Desktop: KDE 4.10.5

Re: visite sito

Messaggioda conraid » lun ago 17, 2009 13: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: 11987
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: visite sito

Messaggioda raffaele181188 » lun ago 17, 2009 13: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 20: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 23:01

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

:thumbright:
Avatar utente
submax82
Staff
Staff
 
Messaggi: 3202
Iscritto il: mar ago 30, 2005 23:00
Desktop: xfce
Distribuzione: SalixOS

Re: visite sito

Messaggioda submax82 » lun ago 17, 2009 23: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: mar ago 30, 2005 23:00
Desktop: xfce
Distribuzione: SalixOS

Re: visite sito

Messaggioda submax82 » mar ago 18, 2009 21: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: mar ago 30, 2005 23:00
Desktop: xfce
Distribuzione: SalixOS


Torna a Programmazione

Chi c’è in linea

Visitano il forum: TurnitinBot [Bot] e 3 ospiti