PHP/Programmazione/File

Indice del libro

PHP mette a disposizione numerose funzioni per leggere e/o modificare i file presenti sul server.
Esiste inoltre la possibilità di effettuare l'upload dei file dell'utente sul server stesso.

Aprire e chiudere i file

modifica

Per prima cosa, quando lavoriamo con un file, dobbiamo aprirlo usando la funzione fopen la cui sintassi è:

fopen(nomefile, modalità);

dove nomefile è l'indirizzo del file sul server oppure in Internet e modalità è una stringa che specifica il modo con cui si apre il file. La funzione restituisce un puntatore univoco al file aperto che servirà successivamente per eseguire le funzioni legate alla lettura e alla scrittura del file.
La modalità può essere:

Modalità Descrizione
r Apre il file in modalità di sola lettura
r+ Apre il file in modalità di lettura e scrittura
w Apre il file in modalità di sola scrittura cancellando il contenuto esistente. Se il file non esiste, PHP tenta di crearlo.
w+ Apre il file in modalità di scrittura e lettura cancellando il contenuto esistente. Se il file non esiste, PHP tenta di crearlo.
a Apre il file in modalità di sola scrittura posizionando il puntatore alla fine del file per l'inserimento. Se il file non esiste, PHP tenta di crearlo.
a+ Apre il file in modalità di scrittura e lettura posizionando il puntatore alla fine del file per l'inserimento. Se il file non esiste, PHP tenta di crearlo.

Ad esempio:

$fp = fopen('/var/www/contatore.txt','w+');
$fp2 = fopen('./contatore.txt','w+');
$fp3 = fopen('http://esempio.it/file.txt','r');

Per indicare la directory corrente, si usa un punto (.). Per salire di un livello nella gerarchia, se ne usano due (..). Ad esempio:

$fp = fopen('./contatore.txt','w+');

Se il server è su sistem Windows, che usa le barre retroverse, sarà necessario commutarle:

$fp = fopen('C:\\data\\file.txt');

Per chiudere un file già aperto usiamo semplicemente la funzione

fclose(puntatore);

Leggere e scrivere un file

modifica

Per leggere un file si usa la funzione fread la cui sintassi è:

fread(handle, lunghezza)

e legge lunghezza byte dal file aperto identificato dal puntatore handle; dopodiché, sposta il puntatore del file di lunghezza byte in avanti.


Ad esempio:

$fp = fopen("file.txt", "r");
$contenuto = fread($fp, 10);
$cont2= fread($fp, 40);

Con questo breve spezzone, $contenuto conterrà i primi dieci byte del file e $cont2 i byte dall'undicesimo al cinquantesimo.,

Un'altra funzione utile è fgets, che funziona come fread, con la differenza che interrompe la lettura dei dati anche quando incontra un carattere EOF (fine del file) o EOL (fine della riga); questo è utile nell'ambito della lettura di stream input/output.

Per scrivere su un file aperto in modalità di scrittura è possibile usare la funzione fwrite la cui sintassi è:

fwrite(handle, stringa, n);

e scrive sul file aperto e identificato da handle i primi n byte di stringa. Se stringa è minore di n byte, viene scritto il suo contenuto per intero. La funzione restituisce -1 in caso di errore.

Creare un contatore visite

modifica

Viste queste due semplici funzioni, possiamo ora creare un semplice contatore di visite nel nostro sito. Per evitare che il conteggio aumenti ad ogni reload della pagina, useremo delle variabili di sessione per verificare così se l'utente stava già visitando il sito prima di caricare la pagina.

session_start();
if ($_SESSION['entrato'] == false) {
 //incrementa le visite se è la prima volta che l'utente accede al sito in questa sessione
 $_SESSION['entrato'] = true;
 $fp = fopen("contatore.txt", "r+");

 if (!$fp) {
  //se il file non è stato aperto correttamente
   echo "Errore nell'apertura del file";
   exit; //esce dallo script PHP
 }

 $visite = (int) fread($fp, 10);
 $visite++;
 echo "Questo sito ha avuto $visite visite!";
 fwrite($fp, $visite);
 fclose($fp);
}

Altre funzioni

modifica

Per la lettura dei file esiste anche la funzione file la cui sintassi è:

file(nomefile)

e restituisce l'intero contenuto del file nomefile in un array in cui ciascun elemento è una riga contenente anche il carattere di ritorno a capo. Ad esempio:

$cont = implode("", file("file.txt"));

unisce tutte le righe restituendo quindi l'intero contenuto del file.
Per eliminare i caratteri di ritorno a capo è possibile usare la funzione trim che restituisce la stringa passata come argomento eliminando gli spazi bianchi agli estremi.
Per leggere un file e metterlo in una stringa basta fare

$contenuto=file_get_contents("nomedelfile");

Per contare le righe di un file si usa:

$righe=count(file("miofile"));

Può risultare inoltre utile la funzione stat la cui sintassi è:

stat(nome)

e restituisce un array associativo contenente alcune informazione sul file nome. Tra le chiavi dell'array vi sono:

Chiave Descrizione
Dev Numero del dispositivo
uid e gid ID dell'utente e del gruppo proprietario
size Dimensioni in byte
atime e mtime Data dell'ultimo accesso e dell'ultima modifica

basename(file) restituisce invece il nome del file passato come argomento:

echo basename('/home/gianni/documento.odt'); //restituisce documento.odt

Caricare file sul server

modifica

PHP mette anche a disposizione, se configurato correttamente, la possibilità di caricare sul server dei file forniti dall'utente. Questo è possibile usando un form HTML che abbia come metodo POST, enctype="multipart/form-data" e che abbia tra i suoi campi un input con type="file". Prendiamo ad esempio questo spezzone di codice:

<form method="post" enctype="multipart/form-data" action="caricafile.php">
Selezionare il file da caricare: <input type="file" name="file1" />
<input type="submit" value="carica" />

Nel file di destinazione avremo a destinazione un array $_FILES che conterrà le informazioni sui file caricati per ora in una directory temporanea sul server:

echo "Nome temporaneo del file sul server, assegnato da PHP: ".$_FILES['file1']['tmp_name']; //per esempio /tmp/php-234
echo "<br/>Nome del file sul disco rigido dell'utente: ".$_FILES['file1']['name']; //ad esempio C:\image.png
echo "<br/>Dimensione del file: ".$_FILES['file1']['size']; //ad esempio 2000
echo "<br/>Tipo di file (se fornito dal browser): ".$_FILES['file1']['type']; //per esempio, image/png
echo "<br/>Errore(tipo di errore): ".$_FILES['file1']['error']; //errore 1,2,3,4 utile per la gestione

Si noti che il percorso del file sul server viene assegnato temporaneamente da PHP in una directory impostata nel file di configurazione di PHP.

Per poi copiare definitivamente il file sul server (quello temporaneo viene poi eliminato da PHP alla fine della sessione), usiamo la funzione move_uploaded_file:

$source = $_FILES['file1']['name'];
$dest = basename($_FILES['file1']['tmp_name']);
move_uploaded_file($source, "archivio/".$dest); //salva il file in una cartella apposita