Först av allt vill jag säga att jag misstänker att du tänker lite fel vad gäller hur koden körs. "Koden som hanterar den inkommande datat ska ligga efter formuläret." Hela sidans kommer ju köras (åminstone) två gånger, först när formuläret först skrivs ut, sedan när det postas.
Det du bör göra är att se till att all kod som hanterar input körs först, innan något skrivs ut. Då vet du på förhand om formuläret lyckades skicka iväg något. Detta sparar du i en variabel, och stoppar utskriften av ifyllda värden om formuläret lyckades skickas iväg. För koden gör ju bara precis vad det står att den ska göra. $_POST['name'] existerar ju oavsett om formuläret lyckades skickas iväg eller inte.
<?
if(!session_id()) session_start();
header('Cache-control: private, no-cache, must-revalidate');
header('Expires: 0');
?><?php
$hide_values = false;
if($_POST['do']=="send") {
$to = "exempel@mail.com";
$subject = $_POST['subject'];
$name = $_POST['name'];
$tfn = $_POST['tfn'];
$visitor_email = check_input($_POST['visitor_email'], "Ditt mail har inte skickats! Vänligen ange din mailadress");
$message = $_POST['message'];
$secCode = check_input($_POST['secCode'], "Ditt mail har inte skickats! Hjälp oss att undvika spam, vänligen ange koden");
$today = date("d M, Y");
$forminfo =
"Namn: $_POST[name]\n
E-mail: $_POST[visitor_email]\n
Telefonnummer: $_POST[tfn]\n
Skickat den: $today\n\n
OBS! Mailet går inte att svara på!\n";
$from = "svara_exempel@mail.com";
$headers .= "Reply-To: $visitor_email \r\n";
$headers = "From:" . $from;
}
if($_POST['do']=="send") {
if($_POST['secCode'] == $_SESSION['secCode']) {
// security code is valid; reset it!
$_SESSION['secCode'] = rand(100000, 999999);
mail($to,$subject,$forminfo,$message,$headers);
echo "$name, ditt mail har nu skickats.";
$hide_values = true; // Fyll inte i värden i formuläret om mailet skickades!
} else {
// wrong security code
echo '<font style="color: White;"><b>Ditt mail har inte skickats! Hjälp oss att undvika spam, vänligen ange den rätta koden</b></font>';
}
}
function check_input($data, $problem='')
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
if ($problem && strlen($data) == 0)
{
show_error($problem);
}
return $data;
}
function show_error($myError)
{
?>
<b><?php echo $myError; ?></b><br />
<?php
exit();
}
function get_post_value($which){
global $hide_values;
if($hide_values){
// Formuläret skickades. Skriv ut en tom sträng i formuläret.
return "";
}else{
// Formuläret skickades inte korrekt. Skriv ut valt värde.
// Flytta htmlspecialchars hit också när vi ändå håller på.
return htmlspecialchars($_POST[$which]);
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="sv">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>Mail</title>
<style type="text/css">
<!--
body {
background-color: #908989;
background-image:url('form_image/main_bg.gif');
font-family: Arial;
font-size: 13px;
color: #FFFFFF;
}
fieldset {
border:0px;
}
input[type="text"] {
width: 150px;
background: #e8e8e8;
border: 1px solid #7b7878;
font-family: Arial;
font-size: 13px;
color: #000000;
}
textarea{
width:300px;
border:1px solid #7b7878;
background-color:#e8e8e8;
font-family: Arial;
font-size: 13px;
color: #000000;
}
img
{
vertical-align:middle;
}
-->
</style>
</head>
<body>
<form method="post" action="<?php $_SERVER['PHP_SELF']; ?>">
<fieldset>
<label>Mitt namn:<br />
<input name="name" type="text" value="<?php echo get_post_value('name'); ?>" /></label><br />
<label>Telefonnummer:<br />
<input name="tfn" type="text" value="<?php echo get_post_value('tfn'); ?>" /></label><br />
<label>Min E-mail: <font size="4">*</font><br />
<input name="visitor_email" type="text" value="<?php echo get_post_value('visitor_email'); ?>" /></label><br />
<label>Ämne:<br />
<input name="subject" type="text" value="Förfrågan om spelning" /></label><br />
<label>Meddelande:<br />
<textarea name="message" rows="7" cols="15"><?php echo get_post_value('message'); ?></textarea></label><br />
<label>Ange koden:
<input type="text" name="secCode" maxlength="6" style="width:50px" /> <b>«</b>
<img src="seccode.php" width="71" height="21" alt="Ange kod" /></label><br />
<input type="submit" value="Skicka" /><input type="hidden" name="do" value="send" /><input type="reset" value="Återställ" />
</fieldset>
</form>
</body>
</html>
Om fomuläret skickas korrekt, sätts $hide_values till true. Detta ger utslag i get_post_value som då förhindrar utskrift av det tidigare ifyllda värdet.
Otestat, men borde funka, minus eventuella misstag som skrivfel.

