La gestione dell’Input / output su file di testo in PHP
Argomenti
- Introduzione – La gestione file in PHP
- Il problema
- Lo script PHP
- Esecuzione dello script
- Considerazioni finali
- Video della Lezione – #8
Introduzione – La gestione file in PHP
Nella lezione precedente è stato realizzato una pagina web dinamica PHP e HTML 5 che caricava i dati da un file di testo in formato csv (un file di testo con i dati separati da un carattere speciale detto “separatore”). Questi dati letti dal file mediante lo script PHP sono poi visualizzati in una tabella html gestita mediante un ciclo while.
In PHP per leggere un file di testo è utilizzata la funzione fopen che prevede almeno due argomenti: il primo è il nome del file compreso di percorso url ove il file è memorizzato, il secondo argomento è un flag che indica la modalità di apertura del file “r” è lettura, “w” è scrittura e “a” è aggiunta. Esistono anche delle modalità combinate “w+” ad esempio lettura e scrittura.
Il percorso del file nel nostro esempio è staot omesso in quanto il file è locato nella cartella del web server ove è locato lo script PHP. In questo modo è indicato il percorso relativo e per motivi di sicurezza i file di dati dovrebbero essere accessibili solo all’interno della cartella di esecuzione degli script e non visibili direttamente all’esterno mediane un url. Inoltre il web server per operare con i file deve essere configurato (e in genere è già impostato) per permettere l’apertura dei file remoti. Inoltre è impostato un limite al caricamento dei files in termini didi byte per motivi di sicurezza. Tutte queste opzioni sono locate nel file “php.ini” che nella cartella del web server reale è accessibile mediante pannello hosting dello specifico servizio sotto scritto,
In questa lezione è creato un Form html con il PHP per caricare anche i dati in un controllo “<select>” mediante pre-esecuzione di un’operazione PHP al caricamento della pagina. In seguito l’utente invia i dati e questi dati sono scritti in un altro file di testo sempre in formato csv. Questa volta il file è aperto in scrittura ed è utilizzata l’istruzione fputs che prevede due argomenti l’identificativo logico del file e il buffer (variabile stringa) da scrivere.
Il problema
Per risolvere la seconda parte è stata adoperata una funzio9ne in PHP che è invocata solo quanto i dati sono inviati con il metodo “POST”. Questa funzione non ha parametri e non prevede valori restituiti in quanto deve compiere una scrittura nel file.
Il codice della funzione è:
function scrivi() {
$n=htmlspecialchars($_POST['nome']);
$c=htmlspecialchars($_POST['cognome']);
$ct=htmlspecialchars($_POST['city']);
echo "<br>".$ct."<br>";
$fp=fopen("reg.txt","a");
if (!$fp)
{
die("<h2>Non trovo il file nome e/o percorso errato !</h2>");
}
$riga=$n.",".$c.",".$ct."\n";
fputs($fp,$riga);
echo "<h3>Dati scritti con successo !</h3>";
fclose($fp);
}
La funzione è molto semplice apre il file riceve le variabili $n, $ct, $c dai campi del Form html e rispetto al programma PHP il super vettore $_POST è una variabile globale visibile in tutte le parti di programma PHP e quindi anche nel sotto programma. I dati sono pulti con la funzione ”htmlspecialchars” e sono organizzati dopo l’apertura del file in un buffer di nome “riga e sono poi scritti mediante l’istruzione “fputs”. In seguito dopo la stampa del messaggio il file è chiuso.
Lo script PHP
Lo script PHP a questo punto lo script completo in PHP compreso dell’HTML e CSS è sotto riportato:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Ciclo While e Do While</title>
</head>
<style>
table{
width: 50%;
border-collapse: collapse;
margin: 20px auto;
font-family: Arial, Helvetica, sans-serif;
}
th, td
{
border: 1px solid #ddd;
padding: 8px;
text-align: center;
}
th
{
background-color: #f4f4f4;
}
tr:nth-child(event)
{
background-color: #f9f9f9;
}
h1
{
text-align:center;
color: beige;
padding: 0.2em;
font-size: 1.4em;
}
</style>
<body>
<h1>Dati Anagrafici</h1>
<table border="1" name="tabella">
<?php
function scrivi()
{
$n=htmlspecialchars($_POST['nome']);
$c=htmlspecialchars($_POST['cognome']);
$ct=htmlspecialchars($_POST['city']);
echo "<br>".$ct."<br>";
$fp=fopen("reg.txt","a");
if (!$fp)
{
die("<h2>Non trovo il file nome e/o percorso errato !</h2>");
}
$riga=$n.",".$c.",".$ct."\n";
fputs($fp,$riga);
echo "<h3>Dati scritti con successo !</h3>";
fclose($fp);
}
if ($_SERVER['REQUEST_METHOD']=='POST')
{
scrivi();
}
echo "<form name="."'ins'"." method="."'POST'".">";
$fp=fopen("dati.txt","r");
echo "<tr><td>Nome:</td>"."<td><input type="."'text'"." name="."'nome'"." id="."'nome'"."
alue="."'digita il tuo nome'"."></td></td></tf>";
echo "<tr><td>Cognome:</td>"."<td><input type="."'text'"." name="."'cognome'"."
d="."'cognome'"." value="."'digita il tuo cognome'"."></td></td></tr>";
echo "<tr><td>Città:</td>";
if (!$fp)
{
die("<h2>Non trovo il file nome e/o percorso errato !</h2>");
}
echo "<td><select id="."city'"." name="."'city'".">";
while (!feof($fp))
{
$riga=fgets($fp);
$riga=trim($riga);
echo "<option value="."'$riga'".">"."'$riga'"."</option>";
}
echo "</td></tr>";
echo "<tr><td><input type="."'Submit'"." name="."'invia'"." id="."'invia'"." value="."'Registra dati'"."></td/";
echo "<tr><td><input type="."'Reset'"." name="."'cancella'"." id="."'cancella'"." value="."'Cancella dati'"."></td/";
echo "</td></tr></table></form>";
fclose($fp);
?>
</body>
</html>
La seconda parte del codice PHP richiama la creazione del form html mediante l’apertura del file di dati che contiene in questo caso riga per riga i nomi di alcune città che sono poi visualizzate nel controllo <select> di html come potenziali opzioni di scelta. Il programma PHP ha un esecuzione sincrona e asincrona. Nella parte sincrona viene creata al caricamento della pagina html il form html con il caricamento dati nella casella dio testo. Nella parte asincrona quando l’utente invia il form con il metodo POST è invocata la scrittura del dati nel file dati indicato nella funzione “scrivi”.
Esecuzione dello script
L’esecuzione dello script ha come effetto la visualizzazione della pagina web mostrata in figura.

è mostrata la pagina al caricamento l’utente inserisce dati come mostrato in figura;

All’invio del modulo html il codice PHP memorizza i dati inseriti nel form nel file CSV con la risposta mostrata nella figura sotto:

è stampato un messaggio e il nome della città scelta a scopo di test.
Il contenuto del file CSV è mostrato in figura.

Considerazioni finali
Il file CSV come è mostrato nella figura sopra è separato da “,”. E’ opportuno scegliere in modo accurato il separatore che di solito è una virgola o un punto e virgola. Questo dipende dai dati contenuti nel file. Tale file è scritto ovviamente sulla cartella del web server ove risiede lo script che deve possedere i permessi di scrittura.