[ 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.
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";
?>
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 |
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.
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.
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.
© anders enges, 2003