1
2
3
4
5
6
7
8
9
Din uppgift
2.3.1 Gästbokens datafil och fillistning
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...
Grundidén
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:
- Datum när det blev skrivet i gästboken
- Vem som skrivit i gästboken
- Elpostadressen till den som skrev
- En rubrik (subject) för meddelandet
- Själva texten i meddelandet
Dessutom finns det följande saker att beakta:
- Inläggen skall sorteras så att det senast skrivna kommer
först och sedan de andra i omvänd ordning.
- För att enklast kunna sortera datum så behöver de
vara i sorteringsbar ascii-form, d.v.s. i formen YYYYMMDD eller liknande
med år före månad före dag före tid.
- Datum skall inte skrivas in i gästboken, utan de skall hanteras
av systemet.
- För att enklast kunna sortera hela rader så sätts
datum först i raden
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 datafilen:
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.
Skapa PHP programmet:
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).
Mellananalys:
Vi borde nu ha insett följande saker:
- PHP har kraftfull hantering av såväl filer som arrays.
I VB brukar vi kanske undvika arrays, mest eftersom de egentligen
inte är så användbara, men i PHP skall vi försöka
använda dem så mycket som möjligt.
- Variabler kan innhålla åäö, men måste
börja med ett $ tecken
- PHP kod skall alltid omslutas med <?php .... ?>
- Kommentarer skrivs med hjälp av (bland annat) #
- För att skriva till webbsidan kan man använda echo
- Programsatser avslutas alltid med ;
Dessutom borde vi ha lagt märke till följande:
- De två raderna vi skriver kommer på samma rad på
webbsidan.
- Det vi skapat är inte helt korrekt HTML kod, såtillvida
att det fattas <html><head>... mm.
Första ändringarna i programmet:
- Ändra på raden:
echo $vem;
så att den istället blir
echo $vem
. "<br>";
Detta gör att de två echo raderna kommer att komma på
olika rader i browsern, men om du tar och tittar på den generarade
html koden i browsern så är de i alla fall på samma
rad i denna.
- Ändra samma rad till följande (och ta en titt på
browserns source efteråt):
echo $vem
. "<br>\n";
- Vi skall även se till att det skapas giltig html kod genom
att sätta in "vanlig html kod i filen. Observera att den
med fördel kan sättas "utanför" php-koden:
<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>
OBS! Jag kommer i fortsättningen att lämna bort all
icke nödvändig html kod för att spara utrymme. Det
är självklart att du skall se till att php skapar korrekta
html sidor.
Mer komplett visning av gästboken
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\">";
En vidareutveckling
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>
Du bör nu:
- Fundera över om du förstår den kod vi hitintills
har. Om inte, bör du kontrollera från övriga sidor
på denna site, och/eller ta en titt på nätet (förslagsvis
på php:s hemsida) efter mer information om de enskilda programkoncept
som framgår ur koden.
- Du får även "snygga till" den tabell som används
för att visa gästboken. Ändra dock inte variabelnamnen.
- Du kan även fundera lite över lämpligheten att sätta
ut mailto: länkar på en webbsida...
|