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.7 Nästan klar, men...

Förhoppningsvis har du nu en hyfsat fungerande gästbok.

 

Det finns dock två allvarliga buggar + ett litet problem:

  1. Om man tar Refresh på sidan efter att ha skrivit i gästboken så kommer det stt skrivas samma sak på nytt.
  2. Man kan ju faktiskt lämna tomt i alla fält.
  3. Koden börjar bli lite komplicerad - mest eftersom den innehåller såväl html som php kod. Jobbar vi vidare på så sätt blir allt en hemsk soppa.
Det är den sista vi skall börja med...

Dela upp html och kod

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";
?>
Listning 2.3.7.1 - samples/guestcode.php
[Visa i separat fönster]

Modifiera sedan gustbook.php så att all php-kod tas bort:

<html>
      <head>
        <title>En g&auml;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>&nbsp;</td><td>
            <input type="submit" name="knapp" value="    Skriv    ">
        </td></tr>
        </table>
    </form>
    
    </body>
</html>
Listning 2.3.7.2 - samples/guestbook.php
[Visa i separat fönster]

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

    
}

?>
Listning 2.3.7.3 - samples/guestcode2.php
[Visa i separat fönster]

Ä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&auml;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>&nbsp;</td><td>
            <input type="submit" name="knapp" value="    Skriv    ">
        </td></tr>
        </table>
    </form>
    <?php
    
visa_gästboken();
    
?>
    </body>
</html>
Listning 2.3.7.4 - samples/guestbook2.php
[Visa i separat fönster]

 

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

 

   UppgifterUppgift 27