Kataloger
Filer
Filmanipulation
Läsning
Skrivning
HTML
1.14.4 Läsning
Här tar jag upp de vanligaste metoderna för läsning
av filer.
file
Den enklaste metoden att läsa en fil är file funktionen.
Den öppnar en fil och returnerar en array med ett element per rad.
Vill vi inte ha en array kan man enkelt konvertera till text med implode.
Se exemplet nedan:
<?php
# läs in innehållet i en fil till en array
# fortsätt inte programmet om filen inte gick att öppna
$innehållet = file ( "lista.txt" )
Or Die("Kunde inte öppna filen");
# loopa genom arrayen
foreach( $innehållet as $rad )
{
echo $rad . "<br />";
}
# visa bara andra raden
if ( count ( $innehållet ) > 2 )
echo $innehållet[1] . "<br />";
echo "<br />Alternativ lösning:<br />";
# en annan möjlighet är att skapa en textvariabel av
# arrayen. Jag sätter här <br /> mellan varje element i
# arrayen när jag skapar filen
$somText = implode ( $innehållet, "<br>");
echo $somText;
?>
Listning 1.14.4.1 - samples/s132.php
Rad 1
Rad 2
Rad 3
Och så äntligen sista raden Rad 2
Alternativ lösning: Rad 1
Rad 2
Rad 3
Och så äntligen sista raden Resultat av listning 1.14.4.1
Om allow_url_fopen = On finns i
php.ini så fungerar även detta:
<?php
# fungerar inte på min arbetsdator för jag har inte internet
# därav @ tecknet
$innehållet = @ file ( "http://www.bet.puv.fi/anders.enges/phpkurs/lista.txt" ) ;
# om sidan kräver lösenord så gör man så här:
# loopa genom arrayen
# gick det inte att öppna filen kommer vi ite att få en array
# utan bara FALSE
if ( $innehållet )
{
foreach( $innehållet as $rad )
{
echo $rad . "<br />";
}
}
?>
Listning 1.14.4.2 - samples/s133.php
Resultat av listning 1.14.4.2
Detta går även med FTP. Om HTTP eller FTP kräver användarnamn
och lösenord så kan man skriva:
http://username:password@www.domain.com och för FTP
ftp://username:password@www.domain.com/pubs/filen.txt
D.v.s man anger
användarnamn:löserord@ före
den egentliga pathen
fopen
Öppnar en fil och returnerar en filpekare som kan användas
för vidare hantering. Första parametern är filnamnet
(eller en URL - se föregående exempel). Den andra parametern
anger hur den skall öppnas. Alternativen är:
Alternativ |
Betydelse |
r |
Endast läsning |
rb |
Endast läsning - binärt data (inte bara
text) |
w |
Endast skrivning |
wb |
Endast skrivning - binärt data |
a |
"Append" - skrivning till slutet av filen.
Finns inte filen så skapas den. |
r+ |
Skrivning och läsning |
r+b |
Skrivning och läsning - binärt data |
w+ |
Skrivning och läsning. Finns inte filen så
skapas den. Finns det tidigare innehåll i filen så ersätts
detta |
w+b |
Som ovan men binärt data |
a+ |
Läsning och skrivning. Skrivning sker i slutet
av filen. Finns inte filen så skapas den. |
a+b |
Som ovan men binärt data |
Skrivning till en fil förutsätter att man har rättigheter
til detta. Se chmod
<?php
# öppna filen för läsning
$filen = fopen ( "lista.txt", "r" );
# gick det?
if ( $filen )
{
# loopa så länge som vi inte kommit till feof (End of File)
while( ! feof ( $filen ) )
{
# läs en rad
$raden = fgets ( $filen, 255 );
# skriv ut raden
echo $raden . "<br />";
}
}
else
{
echo "Det sket sig!";
}
# stäng filen
fclose ( $filen );
?>
Listning 1.14.4.3 - samples/s134.php
Rad 1
Rad 2
Rad 3
Och så äntligen sista raden
Resultat av listning 1.14.4.3
flose
Stänger en fil som öppnats med fopen eller fsockopen. Se
ovanstående exempel
fgets, fgetc,
fgetss
För att läsa från en fil som öppnats med fopen
eller fsockopen (samt popen - men jag tar inte upp denna funktion i
detta material) kan man använda några olika metoder:
<?php
# öppna filen för läsning
$filen = fopen ( "lista.txt", "r" );
# gick det?
if ( $filen )
{
# loopa så länge som vi inte kommit till feof (End of File)
echo "<br />Med fgets<br />";
while( ! feof ( $filen ) )
{
# läs en rad med text
# fgets står för File GET String
# andra parametern säger hur många tecken den skall läsa
# hittar den ett radslut så läser den mindre
$raden = fgets ( $filen, 255 );
# skriv ut raden
echo $raden . "<br />";
}
# jag visar det inte här men fgetss (två s i slutet)
# fungerar som fgets men den strippar bort alla html taggar
# fgetss har en tredje valbar parameter med vars hjälp
# man kan säga att den skall ignorera vissa tags
# fgetss ( $filen, 255, "<a>")
# gör då att den läser en rad men tar bort alla tags
# utom <a> taggen
# måste gå tillbaka till börkan av filen
rewind ( $filen );
echo "<br />Med fgetc<br />";
while( ! feof ( $filen ) )
{
# läs en tecken åt gången
# fgets står för File GET Character
$tecknet = fgetc ( $filen );
# skriv ut tecknet med ett mellanslag efter
echo $tecknet . " ";
}
}
else
{
echo "Det sket sig!";
}
# stäng filen
fclose ( $filen );
?>
Listning 1.14.4.4 - samples/s135.php
Med fgets Rad 1
Rad 2
Rad 3
Och så äntligen sista raden
Med fgetc R a d 1
R a d 2
R a d 3
O c h s å ä n t l i g e n s i s t a r a d e n
Resultat av listning 1.14.4.4
fgetcsv
fgetscv sungerar som fgets, men används för CSV (Comma Separated
Values) filer. Resultatet sätts in i en array. Se exemplet nedan:
<?php
# öppna filen för läsning
$filen = fopen ( "lista_med_komma.txt", "r" );
# gick det?
if ( $filen )
{
# loopa så länge som vi inte kommit till feof (End of File)
echo "Så här ser filen ut<br />";
while( ! feof ( $filen ) )
{
# läs en rad
$raden = fgets ( $filen, 255 );
# skriv ut raden
echo $raden . "<br />";
}
rewind ( $filen );
echo '<table border="1">';
while( ! feof ( $filen ) )
{
# läs en rad. Antagatt komma används för att
# separera de enskilda delarna
$raden = fgetcsv ( $filen, 255 , "," );
# skriv ut radens enkilda delar i en tabell
echo "<tr><td>";
echo $raden[0] ;
echo "</td><td>";
echo $raden[1] ;
echo "</td><td>";
echo $raden[2] ;
echo "</td></tr>";
}
echo "</table>";
}
else
{
echo "Det sket sig!";
}
# stäng filen
fclose ( $filen );
?>
Listning 1.14.4.5 - samples/s136.php
Så här ser filen ut Produkt,pris,antal
Dator, 899, 1
Skrivare,123,3 Produkt | pris | antal | Dator | 899 | 1 | Skrivare | 123 | 3 |
Resultat av listning 1.14.4.5
fread
fread fungerar som fgets, men klarar av binärt data. Se exemplet
nedan:
<?php
# öppna filen för läsning
# en GIF bild är inte strängdata utan binärt data
$filen = fopen ( "./images/box.gif", "r" );
# gick det?
if ( $filen )
{
# läs in de första 2000 byten
$data = fread ( $filen, 2000 );
# visa filens innehåll som hex koder
for ( $i = 0; $i < strlen( $data ); $i++)
echo dechex( ord( $data[ $i ] ) ) . " ";
}
else
{
echo "Det sket sig!";
}
# stäng filen
fclose ( $filen );
?>
Listning 1.14.4.6 - samples/s137.php
47 49 46 38 39 61 e 0 e 0 80 0 0 99 99 99 ff ff ff 21 f9 4 5 14 0 1 0 2c 0 0 0 0 e 0 e 0 0 2 1a 8c 8f a9 cb ed 7 a2 9c 8 30 b 6f d5 79 61 f3 25 61 b8 75 ca c8 81 d3 6a 14 0 3b Resultat av listning 1.14.4.6
|