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

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:

  1. Datum när det blev skrivet i gästboken
  2. Vem som skrivit i gästboken
  3. Elpostadressen till den som skrev
  4. En rubrik (subject) för meddelandet
  5. Själva texten i meddelandet

Dessutom finns det följande saker att beakta:

  1. Inläggen skall sorteras så att det senast skrivna kommer först och sedan de andra i omvänd ordning.
  2. 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.
  3. Datum skall inte skrivas in i gästboken, utan de skall hanteras av systemet.
  4. 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;
}
?>
Listning 2.3.1.1 - samples/_l3.php
[Visa i separat fönster]

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;
}
?>
Listning 2.3.1.2 - samples/_l3a.php
[Visa i separat fönster]

 

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:

  1. 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.
  2. Variabler kan innhålla åäö, men måste börja med ett $ tecken
  3. PHP kod skall alltid omslutas med <?php .... ?>
  4. Kommentarer skrivs med hjälp av (bland annat) #
  5. För att skriva till webbsidan kan man använda echo
  6. Programsatser avslutas alltid med ;

Dessutom borde vi ha lagt märke till följande:

  1. De två raderna vi skriver kommer på samma rad på webbsidan.
  2. Det vi skapat är inte helt korrekt HTML kod, såtillvida att det fattas <html><head>... mm.

Första ändringarna i programmet:

  1. Ä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.

  2. Ändra samma rad till följande (och ta en titt på browserns source efteråt):

    echo $vem . "<br>\n";


  3. 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&auml;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>
    Listning 2.3.1.3 - samples/_l3b.php
    [Visa i separat fönster]


    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&auml;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>
Listning 2.3.1.4 - samples/_l3c.php
[Visa i separat fönster]

 

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&auml;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>
Listning 2.3.1.5 - samples/_l3d.php
[Visa i separat fönster]

Du bör nu:

  1. 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.
  2. Du får även "snygga till" den tabell som används för att visa gästboken. Ändra dock inte variabelnamnen.
  3. Du kan även fundera lite över lämpligheten att sätta ut mailto: länkar på en webbsida...
   UppgifterUppgift 21