Anders Boholdt-Petersen skrev:
> Har du eller en anden venlig person mulighed med at hjælpe med at tilrette
> koden (ligger på samme filplacering som før), så den kommer til at virke i
> praksis?
Nu har jeg skrevet koden helt færdig så den skulle være lige til at kopiere. Jeg
har testet den (dog ikke grundigt), og den virker og validerer.
================================
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "
http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
<title>Kontakt webmaster ved at udfylde dette skema</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<?php
// Sørg for at datoudskriften følger dansk standard.
setlocale(LC_ALL, 'danish');
echo "<p>".strftime('Denne side er sidst opdateret %d. %B %Y kl. %T')."</p>\n";
// Hvis der er trykket "Slet", skal alle felter tømmes.
// Det skal ske før formularen præsenteres.
if (isset($_POST['slet'])) {
$_POST['navn']='';
$_POST['email']='';
$_POST['emne']='';
$_POST['tekstbesked']='';
$_POST['kopi']=false;
}
?>
<form name="Mail" action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
<h1>Her kan du skrive til webmasteren for Boholdt-Petersen.dk</h1>
<p>Udfyld felterne nedenfor, og klik derefter på send knappen.</p>
<p>Bemærk at feltet E-mail adresse skal udfyldes, ellers får du en fejlmeddelelse!</p>
<p>Navn: <input name="navn" type="text" size="30" value="<?php echo $_POST['navn'] ?>"></p>
<p>E-mail adresse: <input name="email" type="text" size="30" value="<?php echo $_POST['email'] ?>"></p>
<p>Emne: <input name="emne" type="text" size="30" value="<?php echo $_POST['emne'] ?>"><br>
Skriv din besked/kommentar her:<br>
<textarea name='tekstbesked' cols="40" rows="5"><?php echo $_POST['tekstbesked'] ?></textarea>
</p>
<p><label for="kopi_id">Send mig en kopi</label>
<input type="checkbox" id="kopi_id" name="kopi"
<?php if ($_POST['kopi']) echo "checked"; ?>
></p>
<p>
<input name="send" type="submit" value="Send din besked">
<!-- Sletteknappen skal være af typen submit fordi jeg har sat PHP til at genindsætte indholdet i felterne. -->
<input name="slet" type="submit" value="Slet alt og start forfra">
</p>
</form>
<p>
<a href="
http://validator.w3.org/check?uri=referer">
<img src="
http://www.w3.org/Icons/valid-html401"
alt="Valid HTML 4.01 Transitional" height="31" width="88">
</a>
</p>
<p>
<a href="
http://jigsaw.w3.org/css-validator/">
<img style="border:0; width:88px; height:31px"
src="
http://jigsaw.w3.org/css-validator/images/vcss"
alt="Valid CSS!">
</a>
</p>
<p><a href="side.php?id=0">Tilbage til forsiden</a></p>
<?php
// $usermessage skal indeholde beskeden til brugeren. Den bruges i første omgang til at tjekke
// om alle felter er udfyldt. Den forbliver tom hvis alt er i orden.
$usermessage='';
if (isset($_POST['send'])) {
/*
// Her er der gjort klar til at man kan give en fejlmeddelelse hvis navn og overskrift mangler:
if (!$_POST['navn']>'')
$usermessage.="Du skal angive dit navn.\n";
if (!$_POST['emne']>'')
$usermessage.="Du skal angive en overskrift.\n";
*/
if (!$_POST['email']>'' or strpos($_POST['email'],'@')===false)
$usermessage.="Du skal angive din mailadresse.\n";
// Her testes det så om $usermessage er tom:
if ($usermessage=='') {
$recipent = 'Anders Boholdt-Petersen <post-removethis@boholdt-petersen.dk>';
$sender = urldecode($_POST['navn']).' <'.urldecode($_POST['email']).'>';
$subject = strip_tags($_POST['emne']);
$message = strip_tags($_POST['tekstbesked']);
$headers = "From: ".$sender."\r\n";
if (eregi("\r", $sender) || eregi("\n", $sender)) {
die('spam protection');
}
if (@mail($recipent, $subject, $message, $headers)) {
$usermessage='Mailen er sendt.';
if(isset($_POST['kopi']))
if (@mail($sender, $subject, $message, $headers))
$usermessage.="<br>En kopi er også sendt til dig.\n";
}
else
$usermessage='Det var ikke muligt at afsende mailen...';
}
// Under alle omstændigheder udskrives $usermessage -
// enten med en fejlbesked eller også med besked om at mailen er sendt.
// Jeg har givet den en <div> og en klasse, 'kvittering'. Så er det forberedt at den kan styles i CSS.
echo "<div class='kvittering'>$usermessage</div>\n";
}
?>
</body>
</html>
================================
Forklaring til visse punkter:
1. Hvorfor har jeg lavet om på doctypen?
Fordi det er nemmere at få browserne til at opføre sig ens med en strict-type.
I øvrigt hat jeg også fjernet de skråstreger der blev brugt i visse tags, f.eks. <br />.
De er nemlig forkerte i HTML (de hører hjemme i XML).
2. Hvordan sørger man for at brugerens input bliver stående når siden hentes igen?
Normalt ville man lave et input således:
<p>Navn: <input name="navn" type="text" size="30"></p>
Hvis man vil tildele en værdi på forhånd, skriver man:
<p>Navn: <input name="navn" type="text" size="30" value="Børge"></p>
men det er jo ikke alle der hedder Børge, og værdien Børge ville bare overskrive
det som brugeren møjsommeligt havde indtastet.
Derfor benytter jeg mig af at PHP har registreret hvad brugeren har tastet, og jeg sørger
for at det bliver skrevet som value-parameter:
<p>Navn: <input name="navn" type="text" size="30" value="<?php echo $_POST['navn'] ?>"></p>
Sådan skal det stå i et HTML-afsnit. Man er nødt til at bruge <?php og ?>. Hvis man nu var
i et PHP-afsnit, skulle HTML'en udskrives med echo, og så ville det se sådan ud:
echo "<p>Navn: <input name="navn" type="text" size="30" value='".$_POST['navn']."'></p>";
Bemærk den omhyggelige brug af anførselstegnene. HTML er ligeglad med om man bruger ' eller "
men de bruges lidt forskelligt i PHP. Prøv at hente siden i en browser og så kik på den kode
som PHP har produceret. Det kan måske hjælpe dig til at se hvordan anførselstegnene fungerer.
3. Hvorfor er det anderledes ved det felt der er et textarea?
Fordi textarea opfører sig anderledes. Der skal man bare skrive den forudfyldte tekst
mellem de to tags <textarea> og </textarea>.
4. Hvordan laves det så ved en checkbox?
Ved den skal der stå "checked" hvis der skal være hak, og POST-variablen har værdien
true eller false. Derfor tjekker jeg og udskriver "checked" hvis værdien er true.
Jeg tjkekker på den 'korte' måde. Det er nemlig som regel ligegyldigt om man skriver:
if ($input==true)
eller bare
if ($input)
5. Hvorfor har jeg lavet om på navnene "submit" og "reset" og ændret dem til "send" og "slet"?
Det har jeg fordi det er en skidt idé at bruge reserverede navne til variabler
uanset om det er tilladt eller ej. Det virker forvirrende.
Jeg har også ændret "Kopi" til "kopi_id" fordi man sparer sig selv for problemer ved
kun at bruge små bogstaver og ved aldrig at genbruge et navn hvor man blot ændrer nogle af
bogstaverne til modsat størrelse.
6. Hvorfor er reset-knappen blevet lavet om til typen submit?
Det er den fordi en reset-type ikke vil virke når man får PHP til at indsætte værdier
i felterne på forhånd. Så er man nødt til at slette indholdet i alle POST-variablene,
men det må kun ske når siden genhentes, og derfor skal der et submit til.
7. Hvad er det for noget $_SERVER['PHP_SELF'] der er dukket op i action-parameteren?
Det er såmænd en automatisk måde at få filnavnet skrevet ind i koden på. Det betyder
at siden vil kalde sig selv uanset hvilket filnavn man vælger at give den. Det er en god idé
at bruge det ved selvkaldende sider. Så er der en ting mindre at rette hvis man vil genbruge koden,
og så er man også sikret at det virker hvis man skulle få lyst til at ændre filnnavnet.
8. Alle kommentarerne i koden kan naturligvis slettes.
HTML-kommentarer står mellem <!-- og -->.
PHP-kommentarer er enten en-linjers, og de starter bare med //
eller også strækker de sig over flere linjer, og så skal de omkranses
af /* og */. Det sidste har jeg benyttet til at deaktivere tjekket af to brugerinput.
Det tjek havde du ikke selv lavet, men nu er det en smal sag at få det med hvis du skulle få lyst.
--
Bertel
http://bertel.lundhansen.dk/ http://fiduso.dk/