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

2.5 Radering i filer

[ Utskriftsversion av denna uppgift ]

 

OBS! DENNA KOD ÄR FÖR TILLFÄLLET UTAN AUTENTICERING AV ANVÄNDAREN. DETTA BETYDER ATT OM NI VILL PROVA DEN PÅ VERKLIGT DATA SKALL NI SE TILL ATT ÄVEN STUDERA SIDAN OM AUTENTICERING (aut.php)

Jag sätter bara ut detta eftersom en studerande var så desperat att få koden för raderingar i filer (och han vet hur man autenticerar med .htaccess med Apache)

 

OBS! Senare i denna uppgift kommer ni att ha möjlighet att radera hela min guestbook.txt. Klicka här för att skapa den på nytt om så behövs.

 

Raderingar

Vi behöver troligtvis kunna radera i filen. Detta projekt börjar på samma sätt som gästboken, och koden nedan är direkt tagen från gästboksexemplet tidigare, men med två modifieringar som är markerade med fetstil. Se till att du skapar en ny fil för detta php-program, vi börjar inte komplicera gästboken ytterligare. Denna uppgift förutsätter att du har en guestbook.txt fil...

 

<?php
    $innehållet
= file ( "guestbook.txt" ) Or Die("Kunde inte öppna filen");

    
# sortera i omvänd ordning
    
arsort($innehållet);

    echo
"<table border=\"1\">\n";

    
# ändrad rad nedan
    
foreach( $innehållet as $index=>$rad)
    {
        
$fälten = explode( "|", $rad );
        
$datum =  $fälten[ 0 ];
        
$vem = $fälten[ 1 ];
        
$elpost = $fälten[ 2 ];
        
$ärende = $fälten[ 3 ];
        
$texten = $fälten[ 4 ];

        
# plocka ut de olika delarna av datumet och plocka
        # ihop dem igen i rätt ordning
        
$datum = substr($datum, 8, 2) . "." .
                     (int)
substr($datum, 5, 2) . "." .
                     (int)
substr($datum, 0, 4) . " " .
                     
substr($datum, 11);

        
# ny rad nedan
        
echo "<tr><td>Rad nr " . $index . " i filen</td></tr>\n";
        
echo "<tr><td>" . $datum . "</td></tr>\n";
        echo
"<tr><td>" . $vem . "</td></tr>\n";
        echo
"<tr><td><a href=\"mailto:" . $elpost . "\">";
        echo
$elpost . "</a></td></tr>\n";
        echo
"<tr><td>" . $ärende . "</td></tr>\n";
        echo
"<tr><td>" . $texten . "</td></tr>\n";
    }
    echo
"</table>\n";
?>
Listning 2.5.1 - samples/guestbook5.php

Rad nr 1 i filen
02.9.2003 12:23
Ms Y
mry@where.com
test
testar bara
Rad nr 0 i filen
02.9.2003 12:23
Mr X
mrx@some.com
Hej...
...på dej
Resultat av listning 2.5.1

Observera att $index säger vilken rad det är i filen, och att även om vi sorterar filen i minnet så är $index ändå korrekt. Detta kan vi dra nytta av.

Modifiera programmet ytterligare

Vi behöver plocka ihop klickbara länkar - en per rad i filen.

 

<?php
    $innehållet
= file ( "guestbook.txt" ) Or Die("Kunde inte öppna filen");
     
    
# sortera i omvänd ordning
    
arsort($innehållet);
     
    echo
"<table border=\"1\">\n";     
    foreach(
$innehållet as $index=>$rad)
    {
        
$fälten = explode( "|", $rad );
        
$datum =  $fälten[ 0 ];
        
$vem = $fälten[ 1 ];
        
$elpost = $fälten[ 2 ];
        
$ärende = $fälten[ 3 ];
        
$texten = $fälten[ 4 ];
         
        
# plocka ut de olika delarna av datumet och plocka
        # ihop dem igen i rätt ordning
        
$datum = substr($datum, 8, 2) . "." .
                     (int)
substr($datum, 5, 2) . "." .
                     (int)
substr($datum, 0, 4) . " " .
                     
substr($datum, 11);         
                    
        
# ändrad rad nedan
        
echo "<tr><td><a href=\"" .
            
$_SERVER[ "PHP_SELF" ] .
            
"?rad=" .
            
$index .
            
"\">Rad nr " .
            
$index .
            
" i filen - Klicka för radering</a></td></tr>\n";

        
echo "<tr><td>" . $datum . "</td></tr>\n";
        echo
"<tr><td>" . $vem . "</td></tr>\n";
        echo
"<tr><td><a href=\"mailto:" . $elpost . "\">";
        echo
$elpost . "</a></td></tr>\n";
        echo
"<tr><td>" . $ärende . "</td></tr>\n";
        echo
"<tr><td>" . $texten . "</td></tr>\n";         
    }
    echo
"</table>\n";
?>
Listning 2.5.2 - samples/guestbook6.php
[Visa i separat fönster]

Ovanstående kod behöver säkert förklaras ytterligare.

$_SERVER[ "PHP_SELF" ] är en inbyggd variabel som säger vad nuvarande fil har för namn. Om ni kallade programfilen för radera.php kommer således $_SERVER["PHP_SELF"] att innehålla "radera.php"

(I praktiken kan man faktiskt lämna bort filnamnet helt och bara köra "?rad=.." direkt för att åberopa samma fil...)

 

Det vi börjar plocka ihop är då:

<tr><td><a href="radera.php?rad=1">Rad nr 1 i filen...</a></td></tr>

där kursivt markerar sådant som plockas in från php variabler

 

Om ni provar klicka på den länken som då skapats ser ni att ni får fram samma fil, men med ?rad=1 i slutet av URL. Detta värde går då att fånga upp och göra någonting av.

Själva raderingen

Det är rätt krävande att radera en rad ur en fil. Mycket enklare blir det om vi läser in filen i minnet, plockar bort en rad, och därefter sparar tillbaka allt tillbaka till filen. Det är den metoden som kommer att användas i denna uppgift. Desutom har vi ju redan koden som läser in hela filen in i minnet, så det blir bara att fortsätta därifrån. Vi har även skrivit till filer i tidigare uppgift, så det enda riktigt nya blir att plocka bort en rad ur en array. Till detta behöver vi array_splice och lite kreativitet.

 

<?php
    $innehållet
= file ( "guestbook.txt" ) Or Die("Kunde inte öppna filen");
    
    

    # kontrollera om det fanns rad= i url
    
if (isset ( $_REQUEST[ "rad" ] ) )
    {
        
# filen är ju redan öppnad och finns färdigt i
        # en array med namnet $innehållet
        # tag bort en rad ur arrayen - vilken rad framgår
        # ju ur $_REQUEST[ "rad" ]
        
array_splice( $innehållet, $_REQUEST[ "rad" ], 1);
        
        
# nu är en rad bortplockad ur arrayen - spara den
        # till filen på nytt
        # observera att vi inte skall lägga till i filen
        # utan skriva om den helt - därför "w"
        
$filen = fopen ( "guestbook.txt", "w" );  
      
        if (
$filen )   
        {  
            
# lås filen så att andra kan läsa men inte skriva
            
flock( $filen, 1 );  
            
# skriv hela arrayen till filen
            
foreach( $innehållet as $rad)
            {
                
fputs ( $filen, $rad );  
            }
            
# tag bort låsningen
            
flock( $filen, 3 );   
            
# stäng filen
            
fclose ( $filen );
            
            
# öppna filen på nytt
            
$innehållet = file ( "guestbook.txt" )
                Or Die(
"Kunde inte öppna filen");
        }  
    }
    

    # sortera i omvänd ordning
    
arsort($innehållet);
     
    echo
"<table border=\"1\">\n";     
    foreach(
$innehållet as $index=>$rad)
    {
        
$fälten = explode( "|", $rad );
        
$datum =  $fälten[ 0 ];
        
$vem = $fälten[ 1 ];
        
$elpost = $fälten[ 2 ];
        
$ärende = $fälten[ 3 ];
        
$texten = $fälten[ 4 ];
         
        
# plocka ut de olika delarna av datumet och plocka
        # ihop dem igen i rätt ordning
        
$datum = substr($datum, 8, 2) . "." .
                     (int)
substr($datum, 5, 2) . "." .
                     (int)
substr($datum, 0, 4) . " " .
                     
substr($datum, 11);         
                    
        
        echo
"<tr><td><a href=\"" .
            
$_SERVER[ "PHP_SELF" ] . "?rad=" .
            
$index .
            
"\">Rad nr " .
            
$index .
            
" i filen - Klicka för radering</a></td></tr>\n";
        echo
"<tr><td>" . $datum . "</td></tr>\n";
        echo
"<tr><td>" . $vem . "</td></tr>\n";
        echo
"<tr><td><a href=\"mailto:" . $elpost . "\">";
        echo
$elpost . "</a></td></tr>\n";
        echo
"<tr><td>" . $ärende . "</td></tr>\n";
        echo
"<tr><td>" . $texten . "</td></tr>\n";         
    }
    echo
"</table>\n";
?>
Listning 2.5.3 - samples/guestbook7.php
[Visa i separat fönster]

Se mer om array_splice i array-splice *

Tag dessutom gärna en titt på array *

 

OBS! I ovanstående exemepel har ni möjlighet att radera hela min guestbook.txt. Klicka här för att skapa den på nytt om så behövs.

   UppgifterUppgift 4