La seconda guerra mondiale per licei e scuole medie
PHP: gestione file sequenziale
1. La gestione completa di un file
sequenziale con i vettori in PHP
ricerca, inserimento, modifica,
cancellazione di un record
Ovvero, spiegare i vettori in funzione della gestione di un file sequenziale
3. Lettura di un record
1 Apertura del file (il puntatore si posiziona sul
primo record)
2
Lettura del record corrente
(quello indicato dal
puntatore) e trasferimento in
memoria (variabile
alfanumerica)
3
Spostamento
nel vettore
Adesso i dati sono pronti
4 per elaborazioni
(somme/totalizzazioni) o
output, dipendentemente
dal problema assegnato
4. Lettura del record successivo
2
Lettura del record corrente
(quello indicato dal
puntatore) e trasferimento in
memoria (variabile
alfanumerica)
3
Spostamento
nel vettore
Adesso i dati sono pronti
4 per elaborazioni
(somme/totalizzazioni) o
output, dipendentemente
dal problema assegnato
10. I vettori con PHP
Per creare un vettore si può usare la funzione array().
Ipotizziamo di creare un vettore con i dati anagrafici di una persona
(codice, cognome, nome, età,luogo di nascita).
[...]
$vRecord = array(1,"Floris","Stefano", 42, "Greve
in Chianti");
[...]
per visualizzare il contenuto del vettore potrò usare il comando
echo
[...]
echo $vrecord[1];
[...]
11. I vettori con PHP
Partendo dall'esempio precedente si capisce che
i vettori sono anche un'ottima struttura per
memorizzare i record.
Il vettore è un tipo di variabile che può essere
usata facilmente per conservare i dati di un
record.
Per esempio, si può creare un vettore con il
numero di elementi corrispondente al numero
dei campi del record da ospitare.
12. lettura di un file sequenziale
con PHP
In questo esempio si usa un vettore creato "al volo" per
ospitare i record letti da un file (in questo caso vRecord):
[...]
$nomefile = "clienti.txt"; // assegno nome del file
$f = fopen($nomefile, "r"); // apro il file in lettura
if ($f) {
$record = fgets($f); // leggo primo record
while (!eof($f)) { // ciclo fino a fine file
$vRecord = explode("t",$record); // sposto i campi nel vettore
$record = fgets($f); // Leggo record successivo
}
}
[...]
Manca però ancora un passaggio... infatti in questo
modo ad ogni lettura si scrive sopra vRecord perdendo il
contenuto della lettura precedente.
13. Non esiste alcun modo per...
...sovrascivere (modificando il contenuto di
uno o piu' campi) un record presente in un file
sequenziale anche se si conosce la posizione
1 Apertura file (puntatore Supponiamo di voler
sul primo record) “ringiovanire” Floris Stefano.
2
Lettura del record corrente
(quello indicato dal
puntatore) e trasferimento in
memoria (variabile
alfanumerica)
3
Spostamento
25 nel vettore
4 $vRecord[4] ← 25
14. Tantomeno Non esiste alcun modo per...
...cancellare un record presente
in un file sequenziale anche se si
Apertura file (puntatore conosce la posizione
1
sul primo record)
2
Lettura del record corrente
(quello indicato dal
puntatore) e trasferimento in
memoria (variabile
alfanumerica)
3
Spostamento
nel vettore
Scelgo di cancellare il
4 record con codice 4
15. Modifica e cancellazione di un
record
Queste operazioni si possono fare
in memoria usando vettori (detti
array) e/o matrici.
Vorrebbe dire... collocare in
memoria una struttura dati simile a
quella del file ma piu' flessibile?
Esatto!
16. Con il sistema visto fino ad adesso
il vettore $vRecord, ad ogni nuova
lettura perde il contenuto della
lettura precedente...
… in quanto si sovrascrivono i dati con
quelli del record appena letto. Risolviamo
salvando i dati in una struttura piu'
complessa: un vettore di vettori!.
2
Lettura del record corrente
(quello indicato dal
puntatore) e trasferimento in
memoria (variabile
alfanumerica)
3
Spostamento
nel vettore
4
17. Record dopo record, lettura dopo
lettura...
… il vettore di vettori si riempie degli stessi
dati contenuti nel file sequenziale.
2
Lettura del record corrente
(quello indicato dal
puntatore) e trasferimento in
memoria (variabile
alfanumerica)
3
Spostamento
nel vettore
4
18. Cos'ì facendo otteniamo un
vettore di 6 elementi
ciascuno dei quali contiene
un vettore (che rappresenta il
record con i suoi campi)
19. [...]
$nomefile = "clienti.txt"; // assegno nome del file
$f = fopen($nomefile, "r"); // apro il file in lettura
$n=0; // uso un contatore di rec
if ($f) {
$record = fgets($f); // leggo primo record
$n = $n + 1; // incremento ad ogni lettura
while (!eof($f)) { // ciclo fino a fine file
$vRecord = explode("t",$record); // sposto i campi nel vettore
$vScatola[$n] = $vRecord; // salvo il record
$record = fgets($f); // Leggo record successivo
}
}
[...]
Le modifiche necessarie ad
un ciclo di lettura per salvare
i record in un vettore (qui
chiamato scatola) sono
minime.
20. Per visualizzare i dati presenti in un
vettore si può usare un ciclo for
[...]
// $n rappresenta il numero di elementi in $vScatola
For ($x==1;$x<0$n;$x++) { // ciclo fino a fine vettore
Echo “<TR><TD>”;
Echo “$vScatola[$x][0]”; // visual. campo 0 del rec. $x esimo
Echo “<TD><TD>”;
Echo “$vScatola[$x][1]”; // visual. campo 1 del rec. $x esimo
Echo “<TD><TD>”;
Echo “$vScatola[$x][2]”; // visual. campo 2 del rec. $x esimo
Echo “<TD><TD>”;
Echo “$vScatola[$x][3]”; // visual. campo 3 del rec. $x esimo
Echo “<TD><TR>”;
}
}
[...]
21. Per modificare un campo di
un record di cui conosco la
posizione o il valore di un
campo si può sempre
utilizzare un ciclo for...
22. Per sovrascrivere un file
sequenziale leggendo da un
vettore di vettori si puo'
sempre usare un ciclo for...
23. Per sovrascrivere un file
sequenziale leggendo da un
vettore di vettori (scatola) e
saltare un record che si vuole
eliminare si puo' sempre
usare un ciclo for...
http://www.allwebfree.it/articolo_php_alternativa_database.php
http://www.allwebfree.it/php_txt.php
http://win.itispanetti.it/panettistyle/dispense/I%20file%20in%20PHP.pdf