|
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:
- Om man tar Refresh på sidan efter att ha skrivit i gästboken
så kommer det stt skrivas samma sak på nytt.
- Man kan ju faktiskt lämna tomt i alla fält.
- 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";
?>
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...
|