Warning: Cannot modify header information - headers already sent by (output started at /customers/jobak.se/jobak.se/httpd.www/form/formmail.php:52) in /customers/jobak.se/jobak.se/httpd.www/form/formmail.php on line 67
Här är formmail.php:
<?php
// startar sessioner
session_start();
// ämnesrubrik som visas när mailet tas emot
$subject = "Kontakt från min webplats";
// e-postadress som formulärinnhållet ska skicka till
$to = "din@mailadress.xx";
// om submitknappen använts i formuläret bearbetas informationen i formulärfälten
if(isset($_POST['submit'])){
// kontrollerar om magic_quotes_gpc är aktiverat
// och lagrar information från formuläret
// som används i meddelandet och validering av fältinnehåll
if(get_magic_quotes_gpc()){
$name = stripslashes(trim($_POST["name"]));
$email = stripslashes(trim($_POST["email"]));
$message = stripslashes(trim($_POST["message"]));
}
else{
$name = $_POST["name"];
$email = $_POST["email"];
$message = $_POST["message"];
}
// startar sessioner
$_SESSION['name'] = $name;
$_SESSION['email'] = $email;
$_SESSION['message'] = $message;
// anger en variabel som kan lagra de eventuella felaktigheterna
$errors = array();
// kontrollera om namn angivits
if (!$_POST["name"])
$errors[] = "- ditt namn saknas";
// kontrollera om meddelande angivits
if (!$_POST["message"])
$errors[] = "- inget meddelande har skrivits!";
// kontrollerar om epostadressen är korrekt angiven
if(!preg_match("/^[a-z0-9\å\ä\ö\ü\%._-]+@[a-z0-9\å\ä\ö\ü\%.-]+\.[a-z]{2,6}$/i", $email))
$errors[] = "- din e-postadress saknas eller är felaktig";
//kontrollera om scriptet anropas från ditt formulär
if ($_SERVER['HTTP_REFERER']!= "http://www.dinadress.se/kontaktform.php")
$errors[] = "- Du försöker använda vårt Formmail vilket bara är tillåtet från vår webplats!";
}
//CSS-formatering av felmeddelande
echo '<style type="text/css">
<!--
.text {font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 11px;}
h2 {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; color: #336633; letter-spacing: 2px; font-weight: normal;}
.textbakgrund {background-color: #ccff66;}
-->
</style>';
// visning av felmeddelande
if (count($errors)>0){
echo "<span class='text'>";
echo "<h2>Följande information måste anges innan du kan skicka formuläret:</h2><br /><br />";
foreach($errors as $fel)
echo "<span class='textbakgrund'> $fel <br /><br /></span>";
echo "<br />Ange den information som saknas och skicka formuläret igen. Tack! <br /><br />";
echo "<a href='javascript:history.go(-1)'>« klicka här för att komma tillbaka till formuläret</a></span>";
}
else {
// om formuläret är korrekt ifyllt skickas informationen
if (mail($to, $subject, $message ,"From: $email"))
// visar bekräftelsesidan
header("Location: bekraftelse.php");
else
echo "Det gick inte att skicka ditt meddelande";
}
?>
Tanken är att det skall fungera så här.
Vad är felet?
Header funktionen kan endast användas innan HTML kod skickats till webbläsarn, vilket inte är fallet här. Du får istället använda dig av en redirect. Tror t.ex. följande ska fungera:
funktionen http_redirect verkar inte finnas. det äär det som är felet nu.
För att återgå till första problemet, har du gjort några ändringar i programmet, ex. lagt in det mellan html taggar eller så ? Eller har du ett returnslag eller mellanslag före <?php ?
Du har ju glömpt "klammrarna" ! (För det funkar väll inte annars?)
if (mail($to, $subject, $message ,"From: $email"))
// visar bekräftelsesidan
header("Location: bekraftelse.php");
else
echo "Det gick inte att skicka ditt meddelande";
}
Ska vara
if (mail($to, $subject, $message ,"From: $email"))
// visar bekräftelsesidan
header("Location: bekraftelse.php");
} else {
echo "Det gick inte att skicka ditt meddelande";
}
en else måste väll ha }{ runt sig ? (finner ingen annan lösning på https://www.php.net men blir lite undrande)
EDIT: Kom precis på vad som var fel/löste det.
Bytte ut:
header("Location: bekraftelse.php");
Mot:
include("bekraftelse.php");
Tråden kan låsas :).
Hm.... Snarast ändrade du vad skriptet gör, och om det är OK är det så klart en lösning... Men...
include("bekraftelse.php");
Plockar in allt som står i bekraftelse.php i den här filen.
header("Location: bekraftelse.php");
Detta däremot skickar iväg besökaren till den andra sidan.
Det kanske är likvärdigt den här gången, men inte alltid.
Felet berodde, precis som andra skrev på att du först skrev ut information som skulle skickas till webbläsaren för den här sidan, (vilket bl.a. skriver ut headerinfon) och sedan försökte du redirecta nån annanstans. Lösningen på det problemet är att bara skriva ut till webbläsaren när du säkert vet att inget gått fel. Därför är den egentliga lösningen att använda if - else på ovanstående sätt.
Vad gäller klammrar eller inte...
Det är visserligen aldrig fel att använda klammrar, och det kan göra koden mer lättläst och mer robust, särskilt för ovana programmerare som plötsligt lägger till en rad eller två och då slipper komma ihåg att lägga till klammrar också. Men i de allra flesta (alla?) programmeringsspråk är det en grundläggande regel att en styrfunktion (if, else, for, while,... ) alltid gäller efterföljande sats. Och denna "sats" är antingen en ensam kodrad, eller ett ensamt block, vilket kan innehålla en massa olika kodrader, men även andra styrfunktioner och som (i PHP med flera språk) omringas av { och }.
133 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe