[ Utskriftsversion av denna uppgift ]
För att utföra denna uppgift behöver du göra följande:
[ Utskriftsversion av dessa uppgifter ]
I sin enklaste form kan ett dataprogram beskrivas på följande sätt:
För att exemplifiera detta i PHP så skall vi göra ett
lite större system: En gästbok
Detta program kommer att byggas upp del för del, och ni kan konstatera
att program inte skrivs uppifrån och neråt, utan att de
istället byggs på inifrån och ut genom att sätta
in tilläggsfunktionalitet i flera steg.
OBS! Ni skall SKRIVA koden som finns. Den är lite svår att bara knycka med Copy/Paste. Om jag märker att ni bara kopierar lägger jag ut allt i pdf-format med bortkopplad copy funktionalitet. Ni kan INTE lära er NÅGONTING genom att bara kopiera...
OBS! Alla filer - såväl program- som datafiler - sätts i er php katalog om inte annat anges. Jag antar även att ni bläddrat genom de övriga sidorna i denna sajt, så att ni har en översikt över PHP...
Vi kommer att skapa ett formbaserat PHP program för en gästbok. Efter viss planering har vi kommit fram till att följande uppgifter behövs:
Dessutom finns det följande saker att beakta:
För att lagra detta skall det användas en vanlig textfil. Det skulle även gå att använda en databas, men för tillfället duger en textfil.
Hur skall då denna fil se ut? Man skulle kunna tänka sig att sätta in de ovanstående uppgifterna på separata rader, men det är enklare att hantera datat om varje enskilt inlägg kommer på en rad i fil. Jämför gärna med databasers post och fält begrepp.
Vi börjar inte med att koda inmatningen, utan istället skapar vi en "fejkad" fil som vi jobbar vidare med.
Skapa en fil med namnet guestbook.txt och skriv in följande rader. Var noga med att slå <enter> efter varja rad - även den sista. Ordet <enter> skrivs inte in utan betyder att du skall trycks på enter tangenten...
2003.09.02 12:23|Mr X|mrx@some.com|Hej...|...på dej<enter>
2003.09.02 12:23|Ms Y|mry@where.com|test|testar bara<enter>
Ovastående är ett exempel på en s.k "delimited file". För att skilja fälten från varandra sätts det in ett valt tecken. Detta skulle kunna vara ett komma (comma separated values - CSV) eller tabulator (tab separated values). Jag har dock valt att sätta "|"- tecknet istället. Dels för att komma mycket väl kan förekomma i ett inlägg och dels för att tabulatorer syns lite dåligt ibland i listningar.
Det finns en praktisk liten funktion i PHP som heter file (se filerna_fil3.php).
Den tar en komplett fil och sätter in resultatet i en array. Eftersom
vi sett till att varje inlägg är en separat rad så är
det praktiskt att kunna öppna filen i ett svep för att sedan
loopa genom den. PHP har en hel del praktiska funktioner för att
loopa genom arrays, t.ex. foreach (se array_cc.php)
För att plocka ut de enskilda delarna av strängen använder
vi explode (se array_str.php samt explode )
Vi kommer nedan att bygga upp listningen steg för steg:
<?php
# öppna filen och sätt allt in i en array med namnet $innehållet
# om det inte fungerar så meddelar vi detta med Die funktionen
$innehållet = file ( "guestbook.txt" ) Or Die("Kunde inte öppna filen");
# loopa genom arrayen
foreach( $innehållet as $rad )
{
# plocka ut de enskilda delarna som separeras av | tecknet
$fälten = explode( "|", $rad );
$datum = $fälten[ 0 ];
$vem = $fälten[ 1 ];
$elpost = $fälten[ 2 ];
$ärende = $fälten[ 3 ];
$texten = $fälten[ 4 ];
# visa bara $vem för tillfället
echo $vem;
}
?>
För att slippa använda arrays så sätter vi in värdena i ett antal variabler med namnen $datum, $vem, $elpost, $ärende och $texten. Det finns en kortare form som gör samma sak och som ser ut så här (se även array_str.php):
<?php
# öppna filen och sätt allt in i en array med namnet $innehållet
# om det inte fungerar så meddelar vi detta med Die funktionen
$innehållet = file ( "guestbook.txt" ) Or Die("Kunde inte öppna filen");
# loopa genom arrayen
foreach( $innehållet as $rad )
{
# plocka ut de enskilda delarna som separeras av | tecknet
list($datum, $vem,$elpost,$ärende,$texten) = explode( "|", $rad );
# visa bara $vem för tillfället
echo $vem;
}
?>
Provkör programmet genom att surfa iväg till http://www.cc.puv.fi/~xxxxx/php/guestbook.php, där xxxxx är ditt användarnamn i nätverket. Tag gärna en titt på den genererade koden genom att ta <Högerklick>, View Source (i IE).
Vi borde nu ha insett följande saker:
Dessutom borde vi ha lagt märke till följande:
<html>
<head>
<title>En gästbok</title>
</head>
<body>
<?php
# öppna filen och sätt allt in i en array med namnet $innehållet
# om det inte fungerar så meddelar vi detta med Die funktionen
$innehållet = file ( "guestbook.txt" ) Or Die("Kunde inte öppna filen");
# loopa genom arrayen
foreach( $innehållet as $rad )
{
# plocka ut de enskilda delarna som separeras av | tecknet
$fälten = explode( "|", $rad );
$datum = $fälten[ 0 ];
$vem = $fälten[ 1 ];
$elpost = $fälten[ 2 ];
$ärende = $fälten[ 3 ];
$texten = $fälten[ 4 ];
# visa bara $vem för tillfället
echo $vem . "<br>\n";
}
?>
</body>
</html>
För att komma vidare måste vi sätta ut mer av de uppgifter som finns i gästboksfilen, samt även formatera dessa. För formateringen kommer det att användas html-tabeller så om du inte är förtrigen med dess så bör du ta en snabb titt på vad <table>, <tr> och <td> har för betydelse i vanlig html.
<html>
<head>
<title>En gästbok</title>
</head>
<body>
<?php
# öppna filen och sätt allt in i en array med namnet $innehållet
# om det inte fungerar så meddelar vi detta med Die funktionen
$innehållet = file ( "guestbook.txt" ) Or Die("Kunde inte öppna filen");
# börja en tabell - detta skall ske före loopen
# sätt in radbyten \n för att ge mer lättläst kod om du
# tittar på source...
# observera änven att man inte kan skriva border="1" eftersom
# "-tecknet skulle avsluta strängen. Man måste skriva \" för att få
# ett " tecken innuti en teckensträng
echo "<table border=\"1\">\n";
# loopa genom arrayen
foreach( $innehållet as $rad )
{
# plocka ut de enskilda delarna som separeras av | tecknet
$fälten = explode( "|", $rad );
$datum = $fälten[ 0 ];
$vem = $fälten[ 1 ];
$elpost = $fälten[ 2 ];
$ärende = $fälten[ 3 ];
$texten = $fälten[ 4 ];
# nedan är nytt/ändrat
# en rad för datum
echo "<tr><td>" . $datum . "</td></tr>\n";
# och fortsätt med resten
echo "<tr><td>" . $vem . "</td></tr>\n";
echo "<tr><td>" . $elpost . "</td></tr>\n";
echo "<tr><td>" . $ärende . "</td></tr>\n";
echo "<tr><td>" . $texten . "</td></tr>\n";
}
# avsluta tabellen - detta skall ske efter loopen
echo "</table>\n";
?>
</body>
</html>
Listningen ser inte så vacker ut men det är ditt problem att få den snyggare. Kom bara ihåg att varje gång du vill få " i en teckensträng så måste du skriva \", t.ex för att få <td colspan="2"> så måste du skriva echo "<td colspan=\"2\">";
Tag en titt på nedanstående kod och ändra i ditt program det som visas som överstruket till det som visas med fetstil. Tag sedan en ordentlig funderare på hur citationstecken mm. egentligen kommer in i den genererade koden...
<html>
<head>
<title>En gästbok</title>
</head>
<body>
<?php
$innehållet = file ( "guestbook.txt" ) Or Die("Kunde inte öppna filen");
echo "<table border=\"1\">\n";
foreach( $innehållet as $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 ];
echo "<tr><td>" . $datum . "</td></tr>\n";
echo "<tr><td>" . $vem . "</td></tr>\n";
echo "<tr><td>" . $elpost . "</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";
?>
</body>
</html>
Datum skrivs inte ut som vi vill ha det i Finland. Som datum är skapat är det dock enkelt att plocka ut de enskilda delarna. Året är alltid de fyra första tecknen, månad börjar alltid vid postion fem och är två tecken osv. För detta kan vi använda php-funktionen substr (se strings_van.php#substr). Vill vi att eventuella 0-utfyllnader skall tas bort kan vi omvandla delsträngen till ett heltal med t.ex. casting (se variabler.php)
Även sorteringen är enkel, eftersom det finns färdiga funktioner för arraysortering i php (se array_sort.php)
Se nedanstående kod:
<html>
<head>
<title>En gästbok</title>
</head>
<body>
<?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 $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>" . $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";
?>
</body>
</html>
Vi sätter in en helt vanlig html-form i vårt program. Observera att formen sätts "utanför" php-koden och att php-koden skall vara oförändrad från tidigare steg. För mer om formar se forms.php. Man kan med fördel använda t.ex. Dreamweaver för att konstruera formen, eftersom denna inte skrivs i PHP.
Du bör framför allt observera name= som används för alla komponenter i formen. Provkör gärna koden nedan genoma att klicka på länken under koden. Skriv in något i textrutorna och klicka sedan på "Skriv" knappen. Tag en titt på hur adressradens URL ändras.
<html>
<head>
<title>En gästbok</title>
</head>
<body>
<form>
<table border="1">
<tr><td>Namn:</td><td>
<input type="text" name="vem">
</td></tr>
<tr><td>Elpost:</td><td>
<input type="text" name="elpost">
</td></tr>
<tr><td>Ärende:</td><td>
<input type="text" name="arende">
</td></tr>
<tr><td>Text:</td>
<td>
<textarea name="texten" rows="5" cols="40"></textarea>
</td></tr>
<tr><td> </td><td>
<input type="submit" name="knapp" value=" Skriv ">
</td></tr>
</table>
</form>
<?php
# all PHP kod som tidigare
# ...
?>
</body>
</html>
För att kunna hantera det data som blev sänt av formen behöver vi göra ett tillägg i php-koden
Se isset.php, _request.php samt datum.php för mer information.
<html>
<head>
<title>En gästbok</title>
</head>
<body>
<form>
<table border="1">
<tr><td>Namn:</td><td>
<input type="text" name="vem">
</td></tr>
<tr><td>Elpost:</td><td>
<input type="text" name="elpost">
</td></tr>
<tr><td>Ärende:</td><td>
<input type="text" name="arende">
</td></tr>
<tr><td>Text:</td>
<td>
<textarea name="texten" rows="5" cols="40"></textarea>
</td></tr>
<tr><td> </td><td>
<input type="submit" name="knapp" value=" Skriv ">
</td></tr>
</table>
</form>
<?php
# kontrollera om det fanns "knapp=" i URL raden
if ( isset( $_REQUEST[ "knapp" ] ) )
{
# tag vem= värdet från URL
$vem = $_REQUEST[ "vem" ];
# tag elpost= värdet från URL
$elpost = $_REQUEST[ "elpost" ];
# tag arende= värdet från URL
# observera att man helst inte skall använda
# åäö i URL sammanhang
# i PHP går det däremot bra med åäö
$ärende = $_REQUEST[ "arende" ];
# tag texten= värdet från URL
$texten = $_REQUEST[ "texten" ];
# tag datum från systemet och formatera detta korrekt
$datum = date("Y.m.d H:i");
# skarva ihop en textsträng som skall kunna skrivas till filen
$allt = $datum . "|" . $vem . "|" . $elpost . "|" .
$ärende . "|" . $texten ;
# för tillfället visar vi den bara på sidan och skriver inte
# till någon fil
echo "Du klickade på Skriv och
följande kommer att sättas i filen<br><pre>";
echo $allt;
echo "<pre>";
}
# all PHP kod som tidigare
# ...
?>
</body>
</html>
Prova programmet genom att skriva in olika saker i formen...
Det finns några problem med koden som den är. Prova genom att skriva in följande i Text: textarean på sidan som finns under denna länk:
Vi ser tydligt att måste beakta två saker i texten för att kunna sätta in detta i vår fil (som skall ha en rad per inlägg i gästboken):
Nedan är koden som beaktar detta. Tag eventuellt en titt på strings_conv.php, strings_van.php, funktioner.php samt syntax.php för mer information om de använda funktionerna.
Eftersom det är flera strängar som behöver beaktas/modifieras är det enklast att skapa en funktion som sköter om detta.
<html>
<head>
<title>En gästbok</title>
</head>
<body>
<form>
<table border="1">
<tr><td>Namn:</td><td>
<input type="text" name="vem">
</td></tr>
<tr><td>Elpost:</td><td>
<input type="text" name="elpost">
</td></tr>
<tr><td>Ärende:</td><td>
<input type="text" name="arende">
</td></tr>
<tr><td>Text:</td>
<td>
<textarea name="texten" rows="5" cols="40"></textarea>
</td></tr>
<tr><td> </td><td>
<input type="submit" name="knapp" value=" Skriv ">
</td></tr>
</table>
</form>
<?php
# funktion som "städar upp" texen så att den skall gå
# att sätta in i filen
function beakta_alla_dumheter( $text )
{
# tag bort alla html tags i texten
$text = strip_tags( $text );
# tag bort alla html tags i texten
$text = strip_tags( $text );
# sätt in <br> tags där det finns <enter> (CRLF)
$text = nl2br( $text );
# Radbyten hanteras lite olika i olika miljöer
# i Unix sätts det in en LF (ascii 13) som i PHP
# betecknas med \n
# medan Windows maskiner sätter in CRLF (ascii 10 + ascii 13)
# som i PHP betecknas med \r\n
# för säkerhets skull tar vi bort bägge
# tag bort eventuella \r ( CR )
$text = str_replace( "\r", "", $text );
# tag bort eventuella \n ( LF )
$text = str_replace( "\n", "", $text );
# byt ut \" till " - jo det skall vara "\\\""
$text = str_replace( "\\\"", "\"", $text );
# tag bort eventuella | tecken
$text = str_replace( "|", "", $text );
# låt funktionen returnera den modifierade texten
return $text;
}
if ( isset( $_REQUEST[ "knapp" ] ) )
{
$vem = $_REQUEST[ "vem" ];
$elpost = $_REQUEST[ "elpost" ];
$ärende = $_REQUEST[ "arende" ];
$texten = $_REQUEST[ "texten" ];
$datum = date("Y.m.d H:i");
$vem = beakta_alla_dumheter( $vem );
$ärende = beakta_alla_dumheter( $ärende );
$elpost = beakta_alla_dumheter( $elpost );
$texten = beakta_alla_dumheter( $texten );
$allt = $datum . "|" . $vem . "|" . $elpost . "|" .
$ärende . "|" . $texten ;
# ändrat lite på echo för att visa tydligare vad som skett
echo "Du klickade på Skriv och
följande kommer att sättas i filen<br>";
echo htmlentities ($allt);
}
# all PHP kod som tidigare
# ...
?>
</body>
</html>
OBS! För tillfället bryr vi oss inte om att det kan lämnas tomt i alla textboxar - valideringen kommer senare...
Det är förhållandevis enkelt att läsa filer. Hela Internet går ju ut på att läsa filer och visa dessa. Att skriva är dock lite mer komplicerat.
Kopiera all kod som fiinns i rutan nedan och sätt in i en ny fil som du kallar filtest.php. Prova detta program genom att surfa till detta program på din hemsideskatalog.
<?php
$teststräng = "en liten teststräng";
# Öppna en fil för skrivning
# skapa den vid behov
$filen = fopen ( "testa.txt", "w+" );
# gick det?
if ( $filen )
{
# lås filen så att andra kan läsa men inte skriva
flock( $filen, 1 );
# skriv till filen
fputs ( $filen, $teststräng );
# tag bort låsningen
flock( $filen, 3 );
# stäng filen
fclose ( $filen );
echo "Har skrivit till filen";
}
else
{
echo "Det sket sig!";
}
?>
Om detta program fungerar är allt frid och fröjd, men troligtvis får du följande resultat istället (... kommer att ersättas av din hemkatalogs path):
Warning: fopen("testa.txt", "w+") - Permission denied in
...\tt2.php on line 5
Det sket sig!
Om du fick ett felmeddelande i stil med ovanstående beror detta på att php-programmet inte har rätt att skriva till denna fil. Gör i så fall följande:
(Bägge operativsystemen kräver således att filen finns för att man skall kunna ändra på dess rättigheter. En bättre idé kan vara att sätta alla filer som skall kunna ändras till en underkatalog, och därefter se till att hela katalogen har modifieringsrättigheter.)
Efter att ha gjort ovanstående ändringar i filskyddet för testa.txt kan du prova filtest.php igen. Förhoppningsvis fungerar det nu.
Du kan även prova följande ändringar. Prova programmet flera gånger genom att klicka på refresh i din browser. Tag sedan en titt på vad filen testa.txt innehåller.
<?php
$teststräng = "en liten teststräng";
# Öppna en fil för skrivning
# skapa den vid behov
$filen = fopen ( "testa.txt", "a");
# gick det?
if ( $filen )
{
# lås filen så att andra kan läsa men inte skriva
flock( $filen, 1 );
# skriv till filen
fputs ( $filen, $teststräng . "\r\n");
# tag bort låsningen
flock( $filen, 3 );
# stäng filen
fclose ( $filen );
echo "Har skrivit till filen";
}
else
{
echo "Det sket sig!";
}
?>
Se till att guestbook.txt har skrivrättigheter satt på samma sätt som du satte skrivrättigheter för filen testa.txt. Vill du veta vad 766 egentligen betyder så ta en titt på sidan filerna_fil.php. Dessutom kan det vara skäl att se hur fopen fungerar på sidan filerna_fil3.php
<html>
<head>
<title>En gästbok</title>
</head>
<body>
<form>
<table border="1">
<tr><td>Namn:</td><td>
<input type="text" name="vem">
</td></tr>
<tr><td>Elpost:</td><td>
<input type="text" name="elpost">
</td></tr>
<tr><td>Ärende:</td><td>
<input type="text" name="arende">
</td></tr>
<tr><td>Text:</td>
<td>
<textarea name="texten" rows="5" cols="40"></textarea>
</td></tr>
<tr><td> </td><td>
<input type="submit" name="knapp" value=" Skriv ">
</td></tr>
</table>
</form>
<?php
function beakta_alla_dumheter( $text )
{
$text = strip_tags( $text );
$text = strip_tags( $text );
$text = nl2br( $text );
$text = str_replace( "\r", "", $text );
$text = str_replace( "\n", "", $text );
$text = str_replace( "\\\"", "\"", $text );
$text = str_replace( "|", "", $text );
return $text;
}
if ( isset( $_REQUEST[ "knapp" ] ) )
{
$vem = $_REQUEST[ "vem" ];
$elpost = $_REQUEST[ "elpost" ];
$ärende = $_REQUEST[ "arende" ];
$texten = $_REQUEST[ "texten" ];
$datum = date("Y.m.d H:i");
$vem = beakta_alla_dumheter( $vem );
$ärende = beakta_alla_dumheter( $ärende );
$elpost = beakta_alla_dumheter( $elpost );
$texten = beakta_alla_dumheter( $texten );
$allt = $datum . "|" . $vem . "|" . $elpost . "|" .
$ärende . "|" . $texten ;
# ändrat lite på echo för att visa tydligare vad som skett
echo "Du klickade på Skriv och
följande kommer att sättas i filen<br>";
echo htmlentities ($allt);
# öppna guestbook.txt för "append" = tillägg
$filen = fopen ( "guestbook.txt", "a");
# gick det?
if ( $filen )
{
# lås filen så att andra kan läsa men inte skriva
flock( $filen, 1 );
# skriv till filen \n är för att notepad skall
fputs ( $filen, $allt . "\n");
# tag bort låsningen
flock( $filen, 3 );
# stäng filen
fclose ( $filen );
}
}
# all PHP kod som tidigare
# ...
?>
</body>
</html>
Förhoppningsvis har du nu en hyfsat fungerande gästbok.
Det finns dock två allvarliga buggar + ett litet problem:
Tag en kopia av din fil guestbook.php och kalla kopian för guestcode.php (den skall finnas i samma katalog som guestbook.php och guestbook.txt)
Modifiera sedan guestcode.php så att allt som inte finns innanför <?php och ?> tas bort. Se även till att <?php kommer direkt som första rad / tecken i filen:
<?php
function beakta_alla_dumheter( $text )
{
$text = strip_tags( $text );
$text = strip_tags( $text );
$text = nl2br( $text );
$text = str_replace( "\r", "", $text );
$text = str_replace( "\n", "", $text );
$text = str_replace( "\\\"", "\"", $text );
$text = str_replace( "|", "", $text );
return $text;
}
if ( isset( $_REQUEST[ "knapp" ] ) )
{
$vem = $_REQUEST[ "vem" ];
$elpost = $_REQUEST[ "elpost" ];
$ärende = $_REQUEST[ "arende" ];
$texten = $_REQUEST[ "texten" ];
$datum = date("Y.m.d H:i:s");
$vem = beakta_alla_dumheter( $vem );
$ärende = beakta_alla_dumheter( $ärende );
$elpost = beakta_alla_dumheter( $elpost );
$texten = beakta_alla_dumheter( $texten );
$allt = $datum . "|" . $vem . "|" . $elpost . "|" .
$ärende . "|" . $texten ;
$filen = fopen ( "guestbook.txt", "a");
if ( $filen )
{
flock( $filen, 1 );
fputs ( $filen, $allt . "\n");
flock( $filen, 3 );
fclose ( $filen );
}
}
$innehållet = file ( "guestbook.txt" ) Or Die("Kunde inte öppna filen");
arsort($innehållet);
echo "<table border=\"1\">\n";
foreach( $innehållet as $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 ];
$datum = substr($datum, 8, 2) . "." .
(int) substr($datum, 5, 2) . "." .
(int) substr($datum, 0, 4) . " " .
substr($datum, 11);
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";
?>
Modifiera sedan gustbook.php så att all php-kod tas bort:
<html>
<head>
<title>En gästbok</title>
</head>
<body>
<form>
<table border="1">
<tr><td>Namn:</td><td>
<input type="text" name="vem">
</td></tr>
<tr><td>Elpost:</td><td>
<input type="text" name="elpost">
</td></tr>
<tr><td>Ärende:</td><td>
<input type="text" name="arende">
</td></tr>
<tr><td>Text:</td>
<td>
<textarea name="texten" rows="5" cols="40"></textarea>
</td></tr>
<tr><td> </td><td>
<input type="submit" name="knapp" value=" Skriv ">
</td></tr>
</table>
</form>
</body>
</html>
Du har nu två php-filer: en med alla php kod och en med all html kod.
Ändra sedan guestcode.php så att gästbokslistningen blir till en funktion:
<?php
function beakta_alla_dumheter( $text )
{
$text = strip_tags( $text );
$text = strip_tags( $text );
$text = nl2br( $text );
$text = str_replace( "\r", "", $text );
$text = str_replace( "\n", "", $text );
$text = str_replace( "\\\"", "\"", $text );
$text = str_replace( "|", "", $text );
return $text;
}
if ( isset( $_REQUEST[ "knapp" ] ) )
{
$vem = $_REQUEST[ "vem" ];
$elpost = $_REQUEST[ "elpost" ];
$ärende = $_REQUEST[ "arende" ];
$texten = $_REQUEST[ "texten" ];
$datum = date("Y.m.d H:i:s");
$vem = beakta_alla_dumheter( $vem );
$ärende = beakta_alla_dumheter( $ärende );
$elpost = beakta_alla_dumheter( $elpost );
$texten = beakta_alla_dumheter( $texten );
$allt = $datum . "|" . $vem . "|" . $elpost . "|" .
$ärende . "|" . $texten ;
$filen = fopen ( "guestbook.txt", "a");
if ( $filen )
{
flock( $filen, 1 );
fputs ( $filen, $allt . "\n");
flock( $filen, 3 );
fclose ( $filen );
}
}
function visa_gästboken()
{
$innehållet = file ( "guestbook.txt" ) Or Die("Kunde inte öppna filen");
arsort($innehållet);
echo "<table border=\"1\">\n";
foreach( $innehållet as $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 ];
$datum = substr($datum, 8, 2) . "." .
(int) substr($datum, 5, 2) . "." .
(int) substr($datum, 0, 4) . " " .
substr($datum, 11);
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";
}
?>
Ändra sedan guestbook.php på följande sätt:
<?php
include_once("guestcode.php");
# säkrare version kan vara:
# include_once( dirname(__FILE__) . "/guestcode.php");
?>
<html>
<head>
<title>En gästbok</title>
</head>
<body>
<form>
<table border="1">
<tr><td>Namn:</td><td>
<input type="text" name="vem">
</td></tr>
<tr><td>Elpost:</td><td>
<input type="text" name="elpost">
</td></tr>
<tr><td>Ärende:</td><td>
<input type="text" name="arende">
</td></tr>
<tr><td>Text:</td>
<td>
<textarea name="texten" rows="5" cols="40"></textarea>
</td></tr>
<tr><td> </td><td>
<input type="submit" name="knapp" value=" Skriv ">
</td></tr>
</table>
</form>
<?php
visa_gästboken();
?>
</body>
</html>
Dess ändringar gör php-koden mer modulär och html-koden blir enklare att editera i en vanlig html-editor. Dessutom kan man nu dela upp projektet så att en person skriver php och en annan skriver html; en ack så viktig finess...
Problemet är ju att URL i adressfältet är guestbook.php?vem=aa&...
efter att vi skrivit i gästboken, och om vi laddar om sidan är
det ju denna url som laddas.
Vi borde således "tömma" adressen från alla
parametrar efter att vi skrivit till filen. Det går dock inte
att tömma dessa i efterskott. Det är däremot helt möjligt
att ladda sidan på nytt, man denna gång utan parametrar.
Detta görs med några rader på lämpligt ställe,
se nedan:
<?php
function beakta_alla_dumheter( $text )
{
$text = strip_tags( $text );
$text = strip_tags( $text );
$text = nl2br( $text );
$text = str_replace( "\r", "", $text );
$text = str_replace( "\n", "", $text );
$text = str_replace( "\\\"", "\"", $text );
$text = str_replace( "|", "", $text );
return $text;
}
if ( isset( $_REQUEST[ "knapp" ] ) )
{
$vem = $_REQUEST[ "vem" ];
$elpost = $_REQUEST[ "elpost" ];
$ärende = $_REQUEST[ "arende" ];
$texten = $_REQUEST[ "texten" ];
$datum = date("Y.m.d H:i:s");
$vem = beakta_alla_dumheter( $vem );
$ärende = beakta_alla_dumheter( $ärende );
$elpost = beakta_alla_dumheter( $elpost );
$texten = beakta_alla_dumheter( $texten );
$allt = $datum . "|" . $vem . "|" . $elpost . "|" .
$ärende . "|" . $texten ;
$filen = fopen ( "guestbook.txt", "a");
if ( $filen )
{
flock( $filen, 1 );
fputs ( $filen, $allt . "\n");
flock( $filen, 3 );
fclose ( $filen );
}
# ladda sidan på nytt - men utan några ULR parametrar
# du får INTE skriva något till sidan innan du sätter
# header
# OBS! Stora L i Location och EXAKT ett
# mellanslag efter :
header("Location: guestbook.php");
exit;
}
function visa_gästboken()
{
$innehållet = file ( "guestbook.txt" ) Or Die("Kunde inte öppna filen");
arsort($innehållet);
echo "<table border=\"1\">\n";
foreach( $innehållet as $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 ];
$datum = substr($datum, 8, 2) . "." .
(int) substr($datum, 5, 2) . "." .
(int) substr($datum, 0, 4) . " " .
substr($datum, 11);
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";
}
?>
Location modifierar headern på sidan. Tag en titt på följande länk (location.php) där jag visar allt - inklusive headern - som sänds från servern för två sidor, den ena är en sida som finns, medan den andra är en sida som "redirectar" till en annan sida. Observera att Location: är satt på den andra sidan.
När browsern stöter på Location i headern så kommer den att ladda den url som där anges, utan att fortsätta med sidan. Det är detta vi simulerar genom att sätta Header("Location: guestbook.php")
Den enklaste formen av validering är att låta JavaScript sköta om detta redan på klienten. Se även Uppgift 1.5 (ep1.php)
<?php
include_once("guestcode3.php");
?>
<html>
<head>
<title>En gästbok</title>
<script>
<!--
function kolla()
{
// kontrollera om det står något i formen med namnet
// myform och textboxen vem
if (document.myform.vem.value.length == 0)
{
alert("Du måste ange namn.");
return false;
}
if (document.myform.elpost.value.length == 0)
{
alert("Du måste ange elpost.");
return false;
}
if (document.myform.arende.value.length == 0)
{
alert("Du måste ange ärende.");
return false;
}
if (document.myform.texten.value.length == 0)
{
alert("Du måste ange ärende.");
return false;
}
}
//-->
</script>
</head>
<body>
<form name="myform" onsubmit="return kolla();">
<table border="1">
<tr><td>Namn:</td><td>
<input type="text" name="vem">
</td></tr>
<tr><td>Elpost:</td><td>
<input type="text" name="elpost">
</td></tr>
<tr><td>Ärende:</td><td>
<input type="text" name="arende">
</td></tr>
<tr><td>Text:</td>
<td>
<textarea name="texten" rows="5" cols="40"></textarea>
</td></tr>
<tr><td> </td><td>
<input type="submit" name="knapp" value=" Skriv ">
</td></tr>
</table>
</form>
<?php
visa_gästboken();
?>
</body>
</html>
Jag antar att du nu har gått igenom alla steg, och dessutom försökt lista ut vad alla delar av programmet gör - har du inte eller vet du inte går du först igenom alla tidigare delar en gång till.
Jag vill sedan att du skall göra följande:
[ Utskriftsversion av dessa uppgifter ]
Sidans tema: include_once, allmänt om kodning
Denna övning är en flerstegsprocess där resultatet skall bli en sida där man kan sätta in och ta bort länkar. Jag använder inte en databas, utan kör mot en vanlig textfil. Som lite extra krydda skall sidan ha möjlighet att kontrollera att länkarna är i skick samt - vid behov - tid och storlek för filen som länkats till.
<?php
# det kommer nog mer hit...
?>
<?php
include_once( dirname ( __FILE__ ) . "/o1code.php" );
?>
<html>
<head>
<title>Mina länkar</title>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
</body>
</html>
http://www.puv.fi/ En websajt 1 Vasa Yrkeshögskola
http://www.puv.fi/not_exist.asp En annan 2 En sida
http://www.not_exist.fi/test.htm Funkar? 3 Titel
OBS! Se till att URL slutar med / om du inte har ett filnamn angivet
OBS! Jag måste skapa nya filer för varje steg. Ni skall använda samma filer som i föregående sida.
Öppna o1code.php och sätt in följande
<?php
# en funktion som visar innehållet i
# länklistan
# parameter: namnet på filen
function visaLänkarna ( $filnamn )
{
# öppna filen och sätt allt in i en array
$allt = file( $filnamn );
# vi skall returnera en komplett HTML-tabell
# observera .= (en punkt före =)
$result = "<table border=\"1\">";
$result .= "<tr>";
$result .= "<td>URL</td>";
$result .= "<td>Förklaring</td>";
$result .= "<td>Betyg</td>";
$result .= "<td>Titel</td>";
$result .= "</tr>";
# loopa genom arrayen allt
# raden kommer att vara en rad i filen
foreach( $allt as $raden )
{
# plocka ut ut de enskilda fälten
# explode skapar en array och
# list skapar enskilda variabler av arrayen
list($url, $description, $rating, $title ) = explode ( "\t", $raden );
# plocka ihop såval tabellen men också "a href"
$result .= "<tr><td><a href=\"$url\">$url</a></td>";
$result .= "<td>$description</td>";
$result .= "<td>$rating</td>";
$result .= "<td>$title</td></tr>";
}
# avsluta tabellen
$result .= "</table>";
# returnera den genererade tabellen
return $result;
}
?>
Sätt sedan in detta i links.php. Observera att det även har ändrats i början av filen
<?php
# jag måste skapa en ny fil - du skall fortfarende
# inkludera "/o1code.php"
# om du bara tar copy/paste varje gång
# så får du problem (skyll dig själv)
include_once( dirname ( __FILE__ ) . "/o1code2.php" );
# med den katalogstruktur som er övning har
# kan du även skriva
# $länkFilen = "links.txt" ;
# med min struktur måste jag skriva lite annorunda
$länkFilen = dirname ( __FILE__ ) . "/links.txt" ;
?>
<html>
<head>
<title>Mina länkar</title>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<?php
# använd funktionen i den inkuderade filen
# och visa dess resutat
echo visaLänkarna( $länkFilen );
?>
</body>
</html>
URL | Förklaring | Betyg | Titel |
Förstår du hur systemet fungerar? Om inte...
Skule det inte vara bra att kunna visa listan sorterad på lite
olika sätt? Se nästa sida.
Sidans tema: $HTTP_SERVER_VARS
Öppna o1code.php och ändra den på följande sätt
<?php
# en funktion som visar innehållet i
# länklistan
# parameter: namnet på filen
function visaLänkarna ( $filnamn )
{
# NYTT------------------------------------------
# I PHP 4.1.0 skulle vi också kunnat skriva
# $filen = $_SERVER["PHP_SELF"];
# och inte behövt global raden...
global $HTTP_SERVER_VARS;
$filen = $HTTP_SERVER_VARS["PHP_SELF"];
# SLUT PÅ NYTT-----------------------------------
# öppna filen och sätt allt in i en array
$allt = file( $filnamn );
# vi skall returnera en komplett HTML-tabell
$result = "<table border=\"1\">";
# ÄNDRADE ---------------------------------------
$result .= "<tr>";
$result .= "<td><a href=\"$filen?SORT=url\">URL</a></td>";
$result .= "<td><a href=\"$filen?SORT=description\">Förklaring</a></td>";
$result .= "<td><a href=\"$filen?SORT=rating\">Betyg</a></td>";
$result .= "<td><a href=\"$filen?SORT=title\">Titel</a></td>";
$result .= "</tr>";
# SLUT PÅ ÄNDRADE -------------------------------
# loopa genom arrayen allt
# raden kommer att vara en rad i filen
foreach( $allt as $raden )
{
# plocka ut ut de enskilda fälten
# explode skapar en array och
# list skapar enskilda variabler av arrayen
list($url, $description, $rating, $title ) = explode ( "\t", $raden );
# plocka ihop såval tabellen men också "a href"
$result .= "<tr><td><a href=\"$url\">$url</a></td>";
$result .= "<td>$description</td>";
$result .= "<td>$rating</td>";
$result .= "<td>$title</td></tr>";
}
# avsluta tabellen
$result .= "</table>";
# returnera den genererade tabellen
return $result;
}
?>
Inga ändringar i links.php
<?php
# jag måste skapa en ny fil - du skall fortfarende
# inkludera "/o1code.php"
# om du bara tar copy/paste varje gång
# så får du problem (skyll dig själv)
include_once( dirname ( __FILE__ ) . "/o1code3.php" );
# med den katalogstruktur som er övning har
# kan du även skriva
# $länkFilen = "links.txt" ;
# med min struktur måste jag skriva lite annorunda
$länkFilen = dirname ( __FILE__ ) . "/links.txt" ;
?>
<html>
<head>
<title>Mina länkar</title>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<?php
# använd funktionen i den inkuderade filen
# och visa dess resutat
echo visaLänkarna( $länkFilen );
?>
</body>
</html>
URL | Förklaring | Betyg | Titel |
Observera att när du klickar på länkarna i tabellen
kommer ?SORT=x att sättas till arderssen
Öppna o1code.php och ändra den på följande sätt
<?php
# NYA ----------------------------------------------
# funktion som sorterar arrayen
# observera & tecknet som gör att
# arrayen sänds med referens
# och modifieras "in-place"
function minSortering( &$arrayen )
{
# Kolla om det fanns en sortering i adressraden
global $HTTP_GET_VARS;
if ( isset ( $HTTP_GET_VARS["SORT"] ) )
{
$sorteringsNyckel = $HTTP_GET_VARS["SORT"];
}
else
{
# default sortering är enligt url
$sorteringsNyckel = "url" ;
}
# sortera enligt angiven nyckel
# det vi i praktiken sände via URL var vilken
# funktion vi skulle använda för sortering
uasort( $arrayen, $sorteringsNyckel );
}
# funktion som sorterar enligt url
function url( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[0], $rightArray[0] );
}
# funktion som sorterar enligt description
function description( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[1], $rightArray[1] );
}
# funktion som sorterar enligt rating
function rating( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[2], $rightArray[2] );
}
# funktion som sorterar enligt title
function title( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[3], $rightArray[3] );
}
# SLUT PÅ NYA --------------------------------------
# en funktion som visar innehållet i
# länklistan
# parameter: namnet på filen
function visaLänkarna ( $filnamn )
{
global $HTTP_SERVER_VARS;
$filen = $HTTP_SERVER_VARS["PHP_SELF"];
# öppna filen och sätt allt in i en array
$allt = file( $filnamn );
# NYTT ---------------------------------------------
minSortering( $allt );
# SLUT PÅ NYTT -------------------------------------
# vi skall returnera en komplett HTML-tabell
$result = "<table border=\"1\">";
$result .= "<tr>";
$result .= "<td><a href=\"$filen?SORT=url\">URL</a></td>";
$result .= "<td><a href=\"$filen?SORT=description\">Förklaring</a></td>";
$result .= "<td><a href=\"$filen?SORT=rating\">Betyg</a></td>";
$result .= "<td><a href=\"$filen?SORT=title\">Titel</a></td>";
$result .= "</tr>";
# loopa genom arrayen allt
# raden kommer att vara en rad i filen
foreach( $allt as $raden )
{
# plocka ut ut de enskilda fälten
# explode skapar en array och
# list skapar enskilda variabler av arrayen
list($url, $description, $rating, $title ) = explode ( "\t", $raden );
# plocka ihop såval tabellen men också "a href"
$result .= "<tr><td><a href=\"$url\">$url</a></td>";
$result .= "<td>$description</td>";
$result .= "<td>$rating</td>";
$result .= "<td>$title</td></tr>";
}
# avsluta tabellen
$result .= "</table>";
# returnera den genererade tabellen
return $result;
}
?>
Du behöver inte göra några ändringar i links.php
<?php
# jag måste skapa en ny fil - du skall fortfarende
# inkludera "/o1code.php"
# om du bara tar copy/paste varje gång
# så får du problem (skyll dig själv)
include_once( dirname ( __FILE__ ) . "/o1code4.php" );
# med den katalogstruktur som er övning har
# kan du även skriva
# $länkFilen = "links.txt" ;
# med min struktur måste jag skriva lite annorunda
$länkFilen = dirname ( __FILE__ ) . "/links.txt" ;
?>
<html>
<head>
<title>Mina länkar</title>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<?php
# använd funktionen i den inkuderade filen
# och visa dess resutat
echo visaLänkarna( $länkFilen );
?>
</body>
</html>
Skulle det inte vara bra om man kunde kolla om sidorna finns kvar och när de ändrats om de finns kvar? OK, lets do it!
Sätt den i samma katalog som de övriga och sätt in följande:
<?php
function kollaLänkarna ( $filnamn )
{
# öppna filen och sätt allt in i en array
$allt = file( $filnamn );
# filen har redan stängts
# öppna upp filen för skrivning
$fp = fopen( $filnamn, "w+" );
# lås filen så att andra kan läsa men inte skriva
flock( $fp, 1 );
# loopa genom arrayen allt
foreach( $allt as $raden )
{
list( $url, $description, $rating, $title ) = explode ( "\t", $raden );
# plocka ut servernamn respektive filnamn ur url:n
# sätt dem in i en array där $matches[1] är servern
# och $matches[2] är sidan (om någon)
preg_match( "/http:\/\/([^\/]*)\/(.*)/", $url, $matches );
# skapa en tom header för reslutatet
$headerdata = array();
# kolla om sidan finns
# om funktionen returnerar true kommer
# $headerdata att fyllas med headerns data
# i annat fall kommer $headerdata["Status"] att
# innehålla orsaken till felet
if ( kontaktaServern( $matches ,$headerdata ) )
{
# skapa en tabseparerad rad
$nyrad = $url . "\t";
$nyrad .= $description. "\t";
$nyrad .= $rating . "\t";
$nyrad .= trim($title) . "\t";
$nyrad .= $headerdata["Date"] ."\r\n" ;
}
else
{
# skapa en tabseparerad rad
$nyrad = $url . "\t";
$nyrad .= $description. "\t";
$nyrad .= $rating . "\t";
$nyrad .= trim($title) . "\t";
$nyrad .= $headerdata["Status"] . "\r\n";
}
# skriv den tabseparerade raden till links.txt
fputs( $fp, $nyrad );
}
# tag bort fillåsningen
flock( $fp, 3 );
# stäng filen
fclose( $fp );
}
# funktion som kollar om en server är vid liv och om sidan
# finns
# första parametern är en array med servernamnen
# och file (inklusive path)
# andra är en *referens* till en array som kommer att användas för
# resultat-rapportering
function kontaktaServern( $data , &$resultat )
{
$server = $data[1];
# det finns kanske inte alltid ett andra element
# i arrayen - därav @
$file = "/" . @ $data[2];
# prova öppna porten
$fp = fsockopen (
$server, # adressen - ip går också
80, # port. 80 = HTTP
$errno, # för eventuella felnummer
$errstr, # eventuella felmeddelanden
20 # timeout tid innan vi skall ge upp
);
# gick det inte att öppna ?
if ( !$fp )
{
# Sätt felmeddelande om inte det gick
$resultat["Status"] = "Servern död";
# och returnera false
return false;
}
else
{
# skapa ett normalt HTTP GET kommando
# observera att en den alltid måste sluta
# med \r\n\r\n (två CRLF)
$command = "GET $file ";
$command .= "HTTP/1.0\r\n";
$command .= "Host: $server\r\n\r\n";
# sänd detta
fputs ( $fp, $command );
# läs första raden
$row = fgets ( $fp, 4096 );
# ett normalt status medelande innehåller alltid 200
# alla andra nummer visar på fel - t.ex att sidan inte finns
# Vanliga meddelandenummer
# 200 - OK
# 301 - Moved Permanently
# 302 - Moved Temporarily
# 400 - Bad Request
# 401 - Unauthorized
# 402 - Forbidden
# 404 - Not found
# 500 - Internal server error
if ( ! ( strpos ( $row, "200" ) > 0 ) )
{
$resultat["Status"] = "Sidan finns inte";
return false;
}
# läs vidare tills headern är slut
while ( trim( $row ) != "" AND ( !feof( $fp ) ) )
{
$row = fgets ( $fp, 4096 );
# tag bort nedanstående kommentarstecken # om du vill
# se vad som egentligen händer.
# echo "$row <br />";
# Headern från min server innehåller bland annat
# Server: Microsoft-IIS/5.0
# Date: Thu, 28 Feb 2002 14:52:40 GMT
# Connection: Keep-Alive
# Content-Length: 10168
# Content-Type: text/html
# observera att det alltid är ett kolon i raden
if (strpos ( $row, ":") > 0 )
{
# plocka ut det före kolon och det efter kolon
list( $header, $content ) = explode ( ":", $row );
# kolla om det var date
# konvertera från GMT datum til en dateserial
if ( strcasecmp( trim( $header ), "Date" ) == 0 )
$content = strtotime( $content ) ;
# sätt in detta i resultat arrayen
$resultat[ trim( $header ) ] = trim ( $content );
}
}
# stäng porten
fclose ( $fp );
# kom vi ända hit måste väl allt vara ok
return true;
}
}
?>
<?php
# funktion som sorterar arrayen
# observera & tecknet som gör att
# arrayen sänds med referens
# och modifieras "in-place"
function minSortering( &$arrayen )
{
# Kolla om det fanns en sortering i adressraden
global $HTTP_GET_VARS;
if ( isset ( $HTTP_GET_VARS["SORT"] ) )
{
$sorteringsNyckel = $HTTP_GET_VARS["SORT"];
}
else
{
# default sortering är enligt url
$sorteringsNyckel = "url" ;
}
# sortera enligt angiven nyckel
# det vi i praktiken sände via URL var vilken
# funktion vi skulle använda för sortering
uasort( $arrayen, $sorteringsNyckel );
}
# funktion som sorterar enligt url
function url( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[0], $rightArray[0] );
}
# funktion som sorterar enligt description
function description( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[1], $rightArray[1] );
}
# funktion som sorterar enligt rating
function rating( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[2], $rightArray[2] );
}
# funktion som sorterar enligt title
function title( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[3], $rightArray[3] );
}
# en funktion som visar innehållet i
# länklistan
# parameter: namnet på filen
function visaLänkarna ( $filnamn )
{
global $HTTP_SERVER_VARS;
$filen = $HTTP_SERVER_VARS["PHP_SELF"];
# öppna filen och sätt allt in i en array
$allt = file( $filnamn );
minSortering( $allt );
# vi skall returnera en komplett HTML-tabell
$result = "<table border=\"1\">";
$result .= "<tr>";
$result .= "<td><a href=\"$filen?SORT=url\">URL</a></td>";
$result .= "<td><a href=\"$filen?SORT=description\">Förklaring</a></td>";
$result .= "<td><a href=\"$filen?SORT=rating\">Betyg</a></td>";
$result .= "<td><a href=\"$filen?SORT=title\">Titel</a></td>";
$result .= "</tr>";
# loopa genom arrayen allt
# raden kommer att vara en rad i filen
foreach( $allt as $raden )
{
# plocka ut ut de enskilda fälten
# explode skapar en array och
# list skapar enskilda variabler av arrayen
# ÄNDRAD ---------------------------------------------
list($url, $description, $rating, $title, $status ) = explode ( "\t", $raden );
# SLUT PÅ ÄNDRAD -------------------------------------
# NY -------------------------------------------------
if ( intval ( $status ) != 0 )
{
$status = "Senast ändrad : " . date("d.m.Y", trim( $status ) );
}
# SLUT PÅ NY ----------------------------------------
# plocka ihop såval tabellen men också "a href"
$result .= "<tr><td><a href=\"$url\">$url</a></td>";
$result .= "<td>$description</td>";
$result .= "<td>$rating</td>";
$result .= "<td>$title</td></tr>";
# NY -------------------------------------------------
$result .= "<tr><td colspan=\"4\">$status</td></tr>";
# SLUT PÅ NY ----------------------------------------
}
# avsluta tabellen
$result .= "</table>";
# returnera den genererade tabellen
return $result;
}
?>
<?php
# NY -------------------------------------------------
include_once( dirname ( __FILE__ ) . "/checklinks.php" );
# SLUT PÅ NY -----------------------------------------
# du skall fortfarande inkludera o1code.php
include_once( dirname ( __FILE__ ) . "/o2code1.php" );
$länkFilen = dirname ( __FILE__ ) . "/links.txt" ;
?>
<html>
<head>
<title>Mina länkar</title>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<?php
# NY -------------------------------------------------
kollaLänkarna ($länkFilen );
# SLUT PÅ NY -----------------------------------------
echo visaLänkarna( $länkFilen );
?>
</body>
</html>
URL | Förklaring | Betyg | Titel |