Salve ragazzi,
scrivo perchè ho un problema con un codice PHP che ho fatto parecchi mesi fa ed è venuto il momento di cambiarlo.
Sostanzialmente si tratta di un doppio contatore visite di una pagina php: un contatore generale (visite totali) che funziona perfettamente ed un contatore giornagliero delle visite che si dovrebbe resettare ogni giorno e registrare le visite in un file che contiene quelle dell'ultimo mese.
-Contatore totale OK
-Contatore giornagliero OK
-Elenco mensile VA COME GLI GIRA
Infatti ci sono volte che funziona per mesi registrando correttamente le visite giornagliere, poi capita qualche volta (con cadenza irregolare) che si sballa tutto l'elenco con la perdita di tutti i dati nella tabella....
La struttura del codice è la seguente:
-main.php
Pagina principale di cui si vuole contare le visite. Ad ogni accesso va ad aprire un file TXT dove risiede il numero delle visite totali e lo incrementa.
La pagina inoltre deve creare un file dati (es. risultato.dat) la cui data di creazione fa riferimento all'ultimo accesso alla pagina main.php
-contatoregiorno.php
E' la parte di codice inclusa nella pagina che serve per incrementare il contatore giornagliero. Al passare della mezzanotte si deve fare in modo che il contatore venga azzerato e registrato il valore in tabella.
Per fare ciò prima controllo la data dell'ultimo file creato (risultato.dat) quindi se risale al giorno corrente (numero del giorno) allora vado semplicemente ad incrementare il contatore. Altrimenti significa che si è passati la mezzanotte e registro il valore nella tabella (file TXT) e azzero il contatore.
Codice PHP:
<?php
setlocale(LC_TIME,"it_IT");
//
$dataimm=strftime ("%d", filemtime("registro.foi"));
$oracorrente=date("d");
if ($dataimm == $oracorrente)//è ancora nello stesso giorno quindi aumenta il contatore
{
//aggiorna solo il valore della prima variabile incrementandolo di uno
$lines1 = file("registro.foi");
$lines1[0]=$lines1[0]+1;
$fp=fopen("registro.foi","w");
for ($i=0;$i<32;$i++)
{
if ($i<1)
{ // è il primo
fwrite($fp,$lines1[0] . "\n");
}
else {
fwrite($fp,$lines1[$i]);
}
}
fclose($fp);
//per inserire il numero di visite di oggi in un file separato
$fp=fopen("oggi.foi","w");
fwrite($fp,$lines1[0]);
fclose($fp);
}
else //cambia la data e quindi aggiorna contatore, sposta la lista e crea il nuovo grafico
{
//� un nuovo giorno, quindi scrive i nuovi valori (1) e risistema l'array
$lines1 = file("registro.foi");
//sposta avanti
$i=0;
while ($i<32) {// perch� il 31esimo numero non va pi� riscritto!
if ($i<1)
{ // � il primo i=0
$nuovoarr[0]= 1;//oggi � la prima visita
$nuovoarr[1]= $lines1[0];
$i=$i+1;
}
else {//qui passa solo dopo che i=1
$a=$i+1;
$nuovoarr[$a]= $lines1[$i];
$i=$i+1;
}
}//fine while
//scrive l'array FINO QUI PERFETTO nel nuovo file
$fp=fopen("registro.foi","w");
for ($i=0;$i<32;$i++)
{
if ($i<1)
{ // � il primo
fwrite($fp,$nuovoarr[0] . "\n");
}
else {
fwrite($fp,$nuovoarr[$i]);
}
}
fclose($fp);
?>
Chiedo lumi su come posso semplificare la cosa e renderla funzionante SEMPRE non quando gli gira....il problema attuale io lo imputo a chiamate contemporanee al file php e quindi contemporanee scritture/letture dei registri giornalieri...