JakobJMedlem sedan apr. 200839 inlägg Håller på med ett formulär just nu (från Webdesignskolan.com (http://www.webdesignskolan.com/php/formmail/form2/formmail.zip)). När det skall bekräfta skickandet står det istället för att visa bekraftelse.php:
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?
matlinMedlem sedan okt. 2006224 inlägg header("Location: bekraftelse.php");
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:
http_redirect("bekraftelse.php");
Mr TMedlem sedan maj 20071 061 inlägg 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 ?
JakobJMedlem sedan apr. 200839 inlägg Inte mycket mer ändringar än småjusteringar i 'svaren' osv...
überfuzzMedlem sedan apr. 2006409 inlägg http_redirect är ju en kärnfunktion. Du kanske borde uppdatera din php-läsare. Eller testa scriptet på en extern server.
TroxyMedlem sedan mars 20041 505 inlägg
überfuzz skrev:
http_redirect är ju en kärnfunktion.
Nej, det står ju faktiskt i länken du själv postade: PECL pecl_http:0.1.0-1.5.5
Vilken är rad 67?
JakobJMedlem sedan apr. 200839 inlägg
Troxy skrev:
Nej, det står ju faktiskt i länken du själv postade: PECL pecl_http:0.1.0-1.5.5
Vilken är rad 67?
Den här:
header("Location: bekraftelse.php");
TroxyMedlem sedan mars 20041 505 inlägg Du anropar echo innan header vilket orsakar problem.
Flytta echo till if-satsen så den inte körs samtidigt som header.
Mr TMedlem sedan maj 20071 061 inlägg 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)
fiddlerMedlem sedan juli 20023 617 inlägg
Mr T skrev:
en else måste väll ha }{ runt sig ? (finner ingen annan lösning på https://www.php.net men blir lite undrande)
I detta fall funkar det då else bara följs av en echo-sats.
Nate.AMedlem sedan mars 2006296 inlägg Du skriver ut CSS formateringen innan du vet om det finns något fel, det gör att header("location:...); inte fungerar och ger ett felmeddelande.
Enklast är att helt enkelt flytta in css formateringen in i if satsen som skriver ut felmeddelandet.
JakobJMedlem sedan apr. 200839 inlägg
Nate.A skrev:
Du skriver ut CSS formateringen innan du vet om det finns något fel, det gör att header("location:...); inte fungerar och ger ett felmeddelande.
Enklast är att helt enkelt flytta in css formateringen in i if satsen som skriver ut felmeddelandet.
Flytta in CSS formateringen i if-satsen?
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 :).
aasahMedlem sedan mars 20034 471 inlägg
JakobJ skrev:
Flytta in CSS formateringen i if-satsen?
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 }.