Lezioni di PHP - Lezione 2 - Lavorare con i file: apertura, scrittura e lettura.
Nella lezione precedente abbiamo creato la struttura base per il nostro guestbook, blog o chat. Ora dobbiamo solo aggiungere funzionalità. In questa lezione registreremo i nostri messaggi in file e leggeremo i messaggi da file.
In PHP esistono molte funzioni per lavorare con i file; ne analizzeremo solo alcune, poiché nella maggior parte dei casi il tuo sito salverà i dati in un database (ne sono certo) e non in file. Tuttavia, vedremo alcune di queste funzioni per capire il principio di base. Lavoreremo con i database più avanti.
Se non hai i file creati nella lezione precedente, torna indietro e scaricali.
Andiamo al modulo per aggiungere un messaggio:
/index.php?admin=1
Da questo modulo aggiungeremo i nostri messaggi. Per elaborare questi dati, dobbiamo verificare nella pagina index.php (dove vengono inviati i dati dal modulo) se esistono valori nella variabile $_POST. Il controllo è molto semplice:
if($_POST){ }
Semplice, vero? Ora all’interno delle parentesi graffe dobbiamo elaborare l’array $_POST. Non scriveremo il codice di elaborazione direttamente lì, ma lo sposteremo nella nostra classe e chiameremo l’elaborazione tramite un metodo dell’oggetto. Nel file index.php chiamiamo il metodo:
if($_POST){ $obj->write($_POST); }
E nel file simpleCMS.php definiamo il metodo write():
public function write($p) { // metodo per scrivere un messaggio }
Perché lo facciamo? Per ridurre il codice nel file index.php. Questo file serve solo per la gestione, mentre l’elaborazione e la visualizzazione dei dati devono essere eseguite da un altro file, ad esempio dalla classe simpleCMS. Questa separazione aumenta l’efficienza del codice e lo rende più chiaro: chiunque guardi il tuo progetto capirà subito dove si trovano le varie parti. Inoltre, sarà più facile anche per te orientarti nel codice quando tutto è organizzato in modo logico.
Iniziamo con qualcosa di semplice: stampiamo l’array $_POST ricevuto dal modulo. Inserisci questo codice:
public function write($p) { // metodo per scrivere un messaggio print_r($p); }
Come puoi vedere, usiamo la variabile locale $p, anche se in realtà stiamo passando la variabile superglobale $_POST. Non la utilizziamo direttamente perché in futuro potremmo voler scrivere un messaggio non da un modulo, ma da un file XML o da un’altra fonte. Usare una variabile locale ci permette di rendere questo metodo universale e riutilizzabile.
Ora compiliamo il modulo e inviamolo. Otterremo un array simile a questo:
Array ( [title] => Ivan [bodytext] => Ciao, mondo! )
Se hai scritto altri dati, il tuo array sarà diverso. Abbiamo stampato l’array per vedere quali chiavi possiamo usare: $p['title'] e $p['bodytext']. Ora che sappiamo quali dati abbiamo, dobbiamo solo scriverli in un file. Iniziamo.
Scrivere su file in PHP
Prima di poter scrivere su un file, dobbiamo “aprirlo in modalità scrittura”. Aprire un file significa collegarlo a una variabile PHP. Tutto il lavoro sui file in PHP si basa sulle variabili di tipo resource. Vediamo un esempio:
public function write($p) { // metodo per scrivere un messaggio $message = fopen("messages/file.txt","w"); print_r($message); }
Ho creato un file file.txt nella cartella messages. Ora, se compiliamo il modulo e lo inviamo, otterremo:
Resource id #4
“Resource” è il tipo della variabile $message, e 4 è l’ID univoco della risorsa tra le altre. Ora, ogni operazione sulla variabile $message influenzerà direttamente il file. Scriveremo nel file riga per riga, in modo da poter leggere successivamente ogni riga nello stesso modo:
public function write($p) { // metodo per scrivere un messaggio $message = fopen("messages/file.txt","w"); fputs ($message, $p['title']. "\r\n"); fputs ($message, $p['bodytext']); }
I simboli \r\n tra virgolette doppie (non funzionano sempre tra singole) indicano un ritorno a capo. Il file file.txt conterrà quindi:
Ivan
Ciao, mondo!
Dopo aver completato tutte le operazioni sul file, dobbiamo chiuderlo per liberare memoria.
public function write($p) { // metodo per scrivere un messaggio $message = fopen("messages/file.txt","w"); // apriamo il file fputs ($message, $p['title']. "\r\n"); fputs ($message, $p['bodytext']); fclose ($message); // chiudiamo il file }
Avrai notato che ogni volta che riscriviamo il file, il suo contenuto viene sovrascritto. Questo dipende dal parametro della funzione fopen(). Possiamo anche aprire un file in modalità “append” (aggiunta) o solo in lettura, ad esempio:
$message = fopen("messages/file.txt","r"); // apriamo il file solo per lettura
- r – apertura solo per lettura.
- r+ – apertura per lettura e scrittura.
- w – crea un nuovo file vuoto (se esiste già, viene cancellato).
- w+ – come r+, ma cancella il contenuto esistente.
- a – apre un file esistente in modalità scrittura, posizionandosi alla fine del file.
- a+ – apre il file per lettura e scrittura, senza cancellarne il contenuto.
Come spiegato, se apriamo un file con il parametro w, viene creato un nuovo file con il nome indicato nel primo parametro. Creiamo quindi un nome di file basato sull’ora corrente, ottenuta con la funzione time().
La funzione time() restituisce il numero di secondi trascorsi dal 1° gennaio 1970.
Il codice sarà quindi:
public function write($p) { // metodo per scrivere un messaggio $message = fopen('messages/'.time(),"w"); // apriamo il file fputs ($message, $p['title']. "\r\n"); fputs ($message, $p['bodytext']. "\r\n"); fputs ($message, time()); fclose ($message); // chiudiamo il file }
Ogni secondo la funzione time() restituirà un numero crescente, quindi i nomi dei file saranno sempre diversi. Prova ad aggiungere nuovi messaggi e vedrai nuovi file apparire nella cartella messages. Ora passiamo alla lettura dei file e alla visualizzazione dei messaggi.
Lettura di file in PHP
Per leggere da un file, dobbiamo aprirlo in modalità lettura usando il parametro r nella funzione fopen(). Tutti i nostri file si trovano nella cartella messages; per leggerli tutti useremo un ciclo while finché ci sono file disponibili.
Per aprire una directory useremo la funzione opendir():
if (is_dir('messages')) { // controlliamo se la cartella esiste if ($dh = opendir('messages')) { // apriamo la cartella per la lettura while (($file = readdir($dh)) !== false) { // leggiamo finché ci sono file // eseguiamo le operazioni necessarie } closedir($dh); // chiudiamo la directory } }
I nomi dei file vengono ottenuti tramite la funzione readdir() e salvati nella variabile $file. Dopo la lettura chiudiamo la cartella per liberare memoria.
Ora che possiamo leggere i file, modifichiamo il metodo display_public():
public function display_public() { // metodo per visualizzare i messaggi $content = ''; if (is_dir('messages')) { // controlliamo la cartella if ($dh = opendir('messages')) { // apriamo la cartella while (($file = readdir($dh)) !== false) { // finché ci sono file if(substr($file, -4) == '.txt'){ // prendiamo solo i file .txt $filename = 'messages/' . $file; // nome completo del file $message = fopen($filename, 'r'); // apriamo il file $title = fgets($message); // leggiamo la prima riga $body = fgets($message); // leggiamo la seconda riga $time = fgets($message); // leggiamo la terza riga print '<div class="post">'; // contenitore del messaggio print '<span class="time">' . date('d-m-Y', $time) . '</span><h2>' . $title . '</h2>'; print '<p>' . $body . '</p>'; print '</div>'; fclose($message); // chiudiamo il file } } closedir($dh); // chiudiamo la directory } } $content .= '<p><a href="/index.php?admin=1">Aggiungi messaggio</a></p>'; return $content; }
Ho commentato ogni riga, quindi se qualcosa non è chiaro scrivimi nei commenti e lo spiegherò.
Probabilmente non ti servirà leggere file riga per riga nella pratica, ma queste lezioni sono molto utili per capire come funzionano le funzioni PHP, i file e le directory.
Qui sotto trovi il codice sorgente del sito intermedio.