några sidor på nätet om PHP programmering

Sök efter  
Börja här Uppgifter Testa dig själv Tips Sidokarta mm. Länkar Sök

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
Produktprisantal
Dator 899 1
Skrivare1233
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

   Börja härFilhanteringLäsning