Php & MySQL

Skapa kontaktformulär i PHP

2012-09-17 23:43 #0 av: MichaelE

Att skapa ett fungerande kontaktformulär är enkelt, men det kan skapa problem med det svenska språket. I denna artikel kommer jag visa hur man skapar ett formulär som kan hantera åäö utan problem.

Det enklaste att skicka ett mejl med hjälp av php är följande:

<?php
mail("your@adress.com", "
ämne", "meddelande");
?>

Men det finns problem med denna enkla kod, det klarar inte av att skicka tecken som åäö.

Grundfunktionen hos linux servrarna är att skicka enbart de 128 första teckena i ASCII-tabellen och där inkluderas inte åäö. Även om de flesta servrar idag klarar av att skicka mejl som innehåller alla de 191 tecken ur den utökade ASCII-tabellen (ISO Latin-1) så används ändå den mindre tabellen.

För att kunna skicka ett mejl från ett kontaktformulär med svenska tecken så måste man lägga till ett attribut i mail, nämligen headers enligt följande:

<?php
mail("din@adress.com", "
ämne", "meddelande", "headers");
?>

Här nedan kommer jag genomgående skapa ett fomulär som kommer skicka meddelandet korrekt till din inkorg.

Först måste vi skapa självaste formuläret (som skrivs i en passande html fil som contact.html):

<form name="contact" method="post" action="mailer.php">
Namn:<br/> <input name="name" type="text" size="30" /><br />       
Ämne:<br/> <input name="subject" type="text" size="30" /><br />       
e-mail:<br/> <input name="email" type="text" size="30" />     
Meddelade:<br/>       
<textarea name="message" cols="40" rows="7" ></textarea><br />       
<input type="submit" value="Skicka" name="submit" />   </form>

Detta formulär innehåller enbart namn, ämne, mejl samt självaste meddelandet. Ur säkerhetssynpunkt används POST som döljer informationen som skickas.

I självaste filen mailer.php börjar vi med att skriva den kod som hämtar informationen som hämtas från formuläret.

$name = utf8_decode($_POST['name']);
$subject = utf8_decode($_POST['subject']);
$email = $_POST['email'];
$message = utf8_decode($_POST['message']);
$to = "din@adress.com";

utf8_decode() konverterar texten till att vara kompitabel med den utökade ASCII-tabellen.

För att skapa headers behövs följande kod, denna är viktig annars kommer inte åäö att fungera trots konverteringen ovan.

$headers = "From: " . $name ." <". $email ."> \n"; $headers .= "MIME-version: 1.0\n";
$headers .= "Content-type: text/plain; charset=iso-8859-1\n";
$headers .= "Content-transfer-encoding: 8bit\n";

Nu har vi skapat de två viktigaste delarna i koden och bör sätta ihop alltihopa till en enda kod:

<?php

$name = utf8_decode($_POST['name']);
$subject = utf8_decode($_POST['subject']);
$email = $_POST['email'];
$message = utf8_decode($_POST['message']);
$to = "din@adress.com";

if(strlen($name) > 0 && strlen($subject) > 0 && strlen($email) > 0 && strlen($message) > 0) {
$headers = "From: " . $name ." <". $email ."> \n"; $headers .= "MIME-version: 1.0\n";
$headers .= "Content-type: text/plain; charset=iso-8859-1\n";
$headers .= "Content-transfer-encoding: 8bit\n";

if(mail($to, $subject,$message,$headers)) {
header("Location: /success.html");
exit();
}
else {
header("Location: /failure.html");
exit();
}
}
else {
header("Location: /failure.html");
exit();
}
?>

Denna kod kontrollerar ifall alla fält är ifyllda och skickar användaren till en felsida (se header("Location:") i koden). Om mail lyckas skickas användaren till en sida som säger att mejlet skickades problemfritt, annars skickas denne person till felsidan.

Nu kan du emot meddelanden från din hemsida utan att oroa över att få konstiga tecken pga åäö.

Uppdaterad: 2012-09-29

Anmäl
2012-09-27 21:25 #1 av: thenameless

Hej MichaelE

Ska mailer.php vara en separat fil? precis som man ibland kan göra med css?

Eller skrives allt i samma fil?

Och vart sätter man headers någonstans?

De verkar inte finnas i ditt fullständiga "mailer.php"?

Det vore bra om du kunde uppfdatera din tutorial med dessa detaljer. Vi (jag) som är nvis opå php behöver strikta instruktioner.

Anmäl
2012-09-27 21:39 #2 av: MichaelE

mailer.php är en separat fil. Headers finns där, läs sista kodstycket.

Anmäl
2012-09-28 01:28 #3 av: thenameless

OPkej tack jag testar det

Anmäl
2012-09-28 14:54 #4 av: [Fibbe]

Bra artikel!

Men varför använder du meta-taggen istället för att skicka till annan sida via header?;

if(mail($to, $subject,$message,$headers)) {
header("Location: /success.html");

exit();

else {
header("Location: /failure.html");
exit();
}

 

Då slipper webbservern exekvera resten av koden och webbläsaren slipper rendera html-koden.

Mvh Felix

Intresserad av Php, MySQL eller övrig webbprogrammering?
Välkommen till webbprogrammering.ifokus.se

Anmäl
2012-09-28 15:18 #5 av: MichaelE

Tack, jag har letat efter sån kod men har inte hittat det. Då kommer jag uppdatera det när jag har kommit hem från jobbet.

Anmäl
2012-09-29 11:31 #6 av: MichaelE

Uppdaterat! Tack för tipset.

Anmäl
2012-10-05 20:46 #7 av: thenameless

I mailer.php, Ska det inte vara en sluttagg där? som i html?

typ </?php> ?

Jag är nybörjare i php detta är t om det första jag gör i php så därför min förvirring.

Anmäl
2012-10-05 21:36 #8 av: MichaelE

Nej, php skiljer från html.

Man skriver enligt följande:

<?php kod ?>

Anmäl
2012-10-21 01:04 #9 av: thenameless

Okej jag testade formuläret hade lagt upp det på min hemsida.

- Lagt mailer i mappen tillsammans med sidan.

- Provade att fylla i och skicka.fick upp det i oulook

- Skickade igen

Fick detta "Felmeddelande" Som bara ser ut som koden?

<?php

$name = utf8_decode($_POST['name']);
$subject = utf8_decode($_POST['subject']);
$email = $_POST['email'];
$message = utf8_decode($_POST['message']);
$to = "sjoberg_bjorn@glocalnet.net";

if(strlen($name) > 0 && strlen($subject) > 0 && strlen($email) > 0 && strlen($message) > 0) {
$headers = "From: " . $name ." <". $email ."> \n"; $headers .= "MIME-version: 1.0\n";
$headers .= "Content-type: text/plain; charset=iso-8859-1\n";
$headers .= "Content-transfer-encoding: 8bit\n";

if(mail($to, $subject,$message,$headers)) {
header("Location: /success.html");
exit();
}
else {
header("Location: /failure.html");
exit();
}
}
else {
header("Location: /failure.html");
exit();
}
?>

Så där ser du kanske vad jag gjort fel?

Anmäl
2012-10-21 03:15 #10 av: MichaelE

Du måste ha filändelsen php för den koden.

Anmäl
2012-10-22 00:50 #11 av: thenameless

Ja då den är döpt till mailer.php och ligger i samma mapp som contact.html som jag döpte kontaktformuläret till på min serverplats.

Anmäl
2012-10-22 21:36 #12 av: thenameless

Här e en länk till min sida jag testat den på:  http://goto.glocalnet.net/sjoberg_bjorn/contact.html

Där har du html formuläret och scriptet ser ni ju ovan.

Anmäl
2012-10-22 22:11 #13 av: MichaelE

Det beror på att ditt webbhotell inte stödjer php. Du måste ha ett eget domän hos One, Binero etc.

Så tyvärr så kan du inte använda denna kod.

Anmäl
2012-10-22 23:02 #14 av: thenameless

aha tack för svaret. Jag hade missat det. de stödjer inte heller annat jag försökt med chattar. Jag får helt enkelt byta.....

Anmäl
2012-10-24 17:50 #15 av: Perly

Bra artikel/inlägg, informationen om detta är på många andra sidor väldigt luddig Glad

Alltid Oavsett

Anmäl
2012-10-24 23:06 #16 av: thenameless

Sant jag visste inte tidigare att glocalnet stängde av vissa funktioner på sina kundservrar.  Fick reda på det när jag ringde för att få support när min cgi-bin inte ville fungera för messageboards och liknande. Då da de att de stängt av den funktionen. Stor mening att låta folk lägga upp hemsidor om det enda man kan lägga upp är test och bilder....

Anmäl
2012-10-25 11:08 #17 av: MichaelE

#15 Tackar Skrattande. Jag håller med dig, även guiden på webbdesignskolan är helt värdelös. Denna kod lyckades jag sätta ihop med hjälp av böcker och flertalet forumtrådar. När jag väl var klar och såg att det fungerade så pass bra så bestämde jag mig för att dela med mig.

Anmäl
2012-10-25 11:16 #18 av: Perly

#17 Jo har själv varit inne på webbdesignskolan flera gånger o kollat utan någon framgång men nu borde jag kunna lyckas så tack för att du delar med dig Glad

Alltid Oavsett

Anmäl
2012-10-25 13:29 #19 av: MichaelE

#18 Det var så lite så Skrattande

Anmäl
2012-11-14 13:17 #20 av: LinneaChristina

Bra artikel!

Jag skulle behöva info om hur man styr så att en viss användare (IP-nummer?) bara kan skicka ett visst formulär en gång under en viss tidsperiod. Någon som vet hur man gör eller var jag kan hitta infon jag behöver?

Anmäl
2012-11-15 00:06 #21 av: MichaelE

#20 Tackar.

Min största fråga är varför? Detta kan skapa en negativ effekt ifall det blev fel vid skickandet och användaren försöker skicka om så kan den inte göra det utan måste vänta en viss tid.

 

Anmäl
2012-11-15 09:30 #22 av: [Fibbe]

#20

Det går att lösa enklast med en databas. Det går även att lösa med cookies om det enbart är dubbelpost du vill hindra.

#21

Det gäller ju bara att hindra användaren från efter att allt är skickat korrekt så borde det inte vara ett problem.

Mvh Felix

Intresserad av Php, MySQL eller övrig webbprogrammering?
Välkommen till webbprogrammering.ifokus.se

Anmäl
2012-11-15 09:47 #23 av: MichaelE

#22 Enklast är väl med session?

$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];

 

Anmäl
2012-11-15 09:57 #24 av: [Fibbe]

#23

Sessioner bygger på cookies

Mvh Felix

Intresserad av Php, MySQL eller övrig webbprogrammering?
Välkommen till webbprogrammering.ifokus.se

Anmäl
2012-11-15 10:59 #25 av: LinneaChristina

Tack båda! Det gäller en enkät, som genererar en rabattkod som tack när man fyllt i den. Vill inte att någon utnyttjar det och fyller i flera gånger för att få fler rabattkoder.

Det stör mig att jag aldrig lärt mig använda cookies... Är det svårt att lära sig?

Anmäl

Det finns en till kommentar till den här diskussionen. Den är bara synlig för medlemmar på iFokus. För att läsa kommentaren, logga in eller registrera dig på iFokus.