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";
?>
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";
?>
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.
|