Continua il nostro viaggio all’interno del potente linguaggio lato server. Oggi ci occuperemo di un’interessante feature, ovvero la manipolazione dei files di testo.
Le funzioni che invocheremo sono: fopen, fwrite, fread, e fclose. Si tratta di funzioni che -perlappunto- hanno la capacità di aprire, leggere, scrivere e chiudere i file di testo.
Un breve excursus prima di passare alla pratica.
Iniziamo dalla funzione fopen.
I due parametri di cui necessita sono PATH e MODE; il primo indica il percorso del file, il secondo la modalità con cui trattare quest’ultimo. 8 opzioni ne differenziano il comportamento, interessando il posizionamento del puntatore (all’inizio o alla fine del file), la modalità (sola lettura, sola scrittura o entrambe), la possibilità di creare o sovrascrivere il file (se vi va di approfondire, questo è il link alla guida ufficiale).
Il risultato della funzione fopen fornisce un parametro (l‘handle) fondamentale alle funzioni fwrite e fclose.
Per quanto attiene alla funzione fwrite, c’è poco da dire: essa prende come argomento l’handle, e il contenuto da immettere nel file;
fread ha invece una sintassi più misteriosa: per funzionare ha bisogno del nome del file e della dimensione alla quale interrompere la lettura, e quindi la useremo unitamente alla funzione filesize (funzione ad hoc per estrapolare la dimensione di un file);
fclose, sempre in coda agli script che coinvolgono anche le altre funzioni di cui abbiamo appena parlato, ha come argomento l’handle e…credo immaginiate cosa faccia.
Ecco un esempio di utilizzo delle 4 funzioni.
/**data e IP verranno concatenate all'interno della variabile $contenuto */ $data =(date("d-m-y")); $contenuto=$data." - IP [<b>".getenv("REMOTE_ADDR")."</b>]\n"."<br>";#qua va il testo da scrivere nel documento; $nomefile="listaaccessi.log";#il nome del file che andremo a creare (importante per la funzione fread); $res=fopen("$nomefile","a+");#il file da aprire e la relativa modalità; if(!$res)die("errore apertura file");#un controllo sull'handle: in caso di problemi lo script terminerà restituendo un messaggio d'errore;
/**lettura: in realtà non basterebbe il solo nome, ma il path completo del file*/
$dati_letti=fread($res,filesize($nomefile));#salvo il risultato dell'operazione di lettura su una variabile;
/**stampa a video dei risultati*/
echo "<b>INIZIO DEL CONTENUTO</b><BR>".$dati_letti."<BR><b>FINE DEL CONTENUTO</b>"; echo('<BR><center>processo completato</center>');#un messaggio per indicare che l'esecuzione è avvenuta; fwrite($res,$contenuto);#scrivi sul file indicato nell'handle il contenuto della var $contenuto; fclose($res);#chiusura del file ?>
[/spoiler]
Questo file si comporta esattamente come un classico file “diario”.
Abbiamo scelto di scrivere in esso, di volta in volta, data di connessione e IP di ciascun avventore.
Otteniamo la data tramite la funzione date(d-m-y) – tra parentesi abbiamo indicato la formattazione italiana;
l’indirizzo IP è invece ricavato interrogando la variabile globale REMOTE_ADDR, contenuta all’interno dell’array $_SERVER.
A fine stringa, sono presenti un ritorno del carrello (\n), per avere un file più ordinato, ma anche un <br> (facilmente sostituibile con una funzione), che consente di mandare a capo anche nella visualizzazione su browser.
Per la funzione fopen, si è scelta la modalità r+, che consente di aprire il file in lettura e scrittura, aggiungendo di volta in volta i dati in testa ad esso; questa opzione comporta la creazione del file, se non presente al momento dell’esecuzione.
Volendo, le fasi di lettura e scrittura del file possono essere separate (nell’esempio coesistono per questioni di praticità).
In ogni caso, l’ordine di apparizione (lettura-scrittura) deve rimanere questo, pena la mancata visualizzazione dei contenuti (su di ciò non ho indagato).
Un eventuale passaggio successivo potrebbe essere l’integrazione con un form o un controllo sul file creato da parte di un altro script, che potrebbe estrarre le occorrenze in base alla data, quindi i visitatori unici (magari ne riparleremo).
Spero che abbiate gradito lo spunto e che possa servirvi per eventuali progetti futuri.
Alla prossima!