10. januar 2011 - 13:37Der er
40 kommentarer og 1 løsning
Hjælp til kontaktformular
Hej eksperter Jeg er i gang med at lave en kontaktformular, men har brug for at lidt hjælp til at kontaktformularen opfylder mine krav:
1) Kontaktformularen må meget gerne kunne laves på en side
2) Tjek felter før afsendelse (i første omgang bare et simpel tjek - senere gerne noget mere avanceret tjek)
3) Hvis der er fejl/tomme felter, så skal formularen vise, hvis felter som fejler
4) Kontaktformularen skal huske felterne indtil at mailen er sendt (hvis IE crasher eller andet, så skal man ikke starter forfra med indtastningen)
Jeg har lavet selve formularen, men vil gerne hjælp til ovenstående. Jeg har prøvet at google kontaktformular, men finder stort set samme kontaktformular i forskellige fora, hvor folk har problemer med det ene og det andet. Jeg har kun lidt erfaring med PHP, men vil godt blive bedre. Jeg har siddet og prøvet at lave ovenstående i par dage nu, men det driller hele tiden. Jeg har brug for hjalp til at lave ovenstående step-by-step.
PHP: Hvordan skal jeg opbygge strukturen på min php-kode? I første omgang skal jeg vel tjekke om der er trykket på send knappen : if (isset($_POST['send']))
Hvis der er trykket på send knappen, så skal jeg tjekke om variablerne er sat samt om de ikke er tomme.
Næste step er at sende mailen eller udskrive fejlmeddelelse på, hvorfor mailen ikke blev sendt. Hvis et er felterne ikke er udfyldt kunne jeg godt tænke mig, at kunne vise dette i min formular.
Du har point ude. Du skal huske at lukke dine gamle tråde. Du har nogle vældig gamle liggende. Hvis der er en eller flere personer som har lagt et svar eller hjulpet på anden måde, tildel dem point. Bed dem om at lægge et svar, hvis det ikke allerede er gjort. Og ellers, hvis du ikke fik svar på dit spørgsmål, så læg et svar selv og accepter det.
Når jeg gennemgår listen indlæg, så er der ingen af de åbne tråde du henviser til. Jeg har kun kunne finde et indlæg, som jeg ikke havde fået lukket (som jeg har lukket nu), men resten af mine indlæg have en grøn status. De indlæg som ikke var grønne, var ikke oprettet af mig. Hvor kan man selv se ens åbne spørgsmål? Nu har jeg lukket de åbne tråde.
Du ser dine åbne spørgsmål via det link jeg henviste til i forrige indlæg. Ikke andres. Du havde flere tråde, som ikke var lukkede. Jeg gennemgik listen. De er blevet lukket nu, så du kun har denne tråd tilbage :)
Angående din mailform, så kan der laves validering på den forholdsvis simpelt.
Fx noget ala,
<?php
$showform = TRUE;
if (isset($_POST['send'])) {
if (!$_POST['navn']) { $fejl = "<p>Du mangler at udfylde dit navn.</p>"; $showform = TRUE; }
if (!$_POST['emne']) { $fejl .= "<p> Du mangler at udfylde emne.</p>"; $showform = TRUE; }
OK. Jeg kender lige på koden og vender tilbage, når jeg ikke kan komme længere.
Mht. åbne tråde, hvor kan jeg se på min egen side her på eksperten, hvilke tråde der er åbne (lige som den liste du henviser til)? Det undre mig bare, at de åbne tråde du henviste til ikke stod på indlæg listen. Nok om det:-)
1) Når man kommer ind på formularsiden, så skriver formularen "Du mangler at skrive en besked." inden man har trykket 'send'.
2) Jeg vil godt have, at felterne forbliver når mailen er sendt. (jeg har prøvet at sætte showform til TRUE efter at mailen er sendt, men felterne er væk)
3) I stedet for at der skrive ud til brugeren, at vedkommende mangler at udfylde et eller felter, kan man ikke sætte en rød ramme om det felt som der er fejl i?
Hvordan får man koden indrammet?
<?php
$showform = TRUE;
if(!isset($_POST['send'])){
if(!$_POST['navn']){ $fejl = "<p>Du mangler at udfylde dit navn.</p>"; $showform = TRUE; }
if(!$_POST['mail']){ $fejl = "<p>Du mangler at udfylde din mailadresse.</p>"; $showform = TRUE; }
if(!$_POST['emne']){ $fejl = "<p>Du mangler at udfylde et emne.</p>"; $showform = TRUE; }
if(!$_POST['besked']){ $fejl = "<p>Du mangler at skrive en besked.</p>"; $showform = TRUE; }
Grunden til at du får fejlen med det samme, er fordi at der mangler en tuborgklamme i koden, samt at du har inventeret if sætningen ved at sætte et ! ind i den.
Hvis du ændrer showform til TRUE hele vejen ned igennem, vil felterne også forblive synlige. Men hvis de skal vises hele tiden, er det bedre at fjerne showform helt. Så er der ingen grund til at spilde resourcer på det.
Det kan sagtens laves, så du får en border omkring ved fejl. Det er dog ofte smart at skrive hvad fejlen er også. Ved et tomt felt, er det ikke så svært at regne ud, men hvis det er mere komplekse fejl, så fx at der ikke må bruges bestemte tegn og så videre, kan det være svært at regne ud.
Jeg har kun vist hvordan du får en rød border ved fejl på det første felt. Så burde du kunne lave det selv på resten. Det er samme fremgangsmetode, hvor navnet i variablen bare skal rettes til.
Parse error: syntax error, unexpected '{' in C:\AppServ\www\kontakt\test4.php on line 49
Det er denne linie den brokker sig over: <input <?php (isset($_POST['send']) AND !$_POST['navn']) { echo 'style="border: 1px solid red"'; } ?> type="text" name="navn" />
Jeg har prøvet at se, om jeg selv kunne rette fejlen, men kan ikke finde fejlen som skal rettes.
Nej. Du kan ikke bruge sessions. De determineres, når du lukker browser vinduet. Så det ville måske være noget med at gemme en cookie for hvert felt. Det vil ikke være særlig hensigtsmæssigt, hvis man skal have 5 af dem liggende fx.
Jeg synes personligt ikke at det er særlig smart at du vil lave en funktion som den. Det er vidst sjældent browseren crasher bare sådan lige. Og så er det en lillebitte form, så der er jo ikke meget at huske. Det kunne man nok godt lige overkomme at taste ind igen. En anden ulempe kan også være, at hvis du bruger cookies, så gemmer den det også selvom der ikke er noget der crasher. Og så vil den gamle mail komme frem, så længe man har cookien liggende. Det er nok mere irriterende, hvis man gerne vil skrive en ny mail. Så skal man rydde felterne. Og man kan nemt komme til at trykke enter eller noget, hvor den så sender den gamle mail afsted igen.
Og sidst men ikke mindst, så vil funktionen til at gemme mailen i cookies, først blive aktiveret ved tryk på submit. Så hvis man allerede har skrevet mailen, og den crasher før man trykker afsend, så gemmes det ikke. Hvis man trykker afsend og den ikke finder noget i den anden ende, men bare laver en timeout, gemmes det heller ikke, da den aldrig kommer frem til PHP koden der udfører det.
Nææh, det du hellere skulle gøre, er så at lave en funktion, så den gemmer de indtastede data, hvis formen ikke validerer. Sådan som det er nu, vil den slette alt i felterne, hvis du ikke udfylder alle de felter du skal, og den får en rød border. Det ville jo være meget rart, hvis den huskede det man havde skrevet i dem som ér udfyldt.
Mange tak for en fyldestgørende forklaring om, hvordan man bedst laver den omtalte funktion.
Jeg har prøvet at lave funktionen på feltet emne, men synes ikke helt at det virker som det skal. Det indtastede forsvinder, hvis det har været rød ramme om et af de andre felter.
Altså, når du taster emne ind fx, men ikke navn, og så trykker send .. Så kommer der en rød border omkring inputfeltet ved Navn, men teksten i emne du har udfyldt forsvinder? Bør den slet ikke gøre. Det forstår jeg ikke meget af.
Har du prøvet at skrive $_POST["emne"]; både med ", med ' og uden noget overhovedet, for at se om det gør en forskel? Prøv også at lave mellemrum igen mellem ; og ?> ...
Du skal selvfølgelig også lave det på de andre felter, for at den husker dets værdi der.
Nu virker det i hvert fald:-) Jeg laver lige det for resten af felterne.
Jeg er i bund og grund rigtigt glæd for kontaktformularen som den er nu, men synes du, at der mangler noget på kontaktformularen eller noget vi kan lave bedre?
Jeg var vist lige lidt for hurtig. Godt nok husker kontaktformularen nu det indtastet, men desværre viser den rød ramme om feltet selvom der står noget i feltet og man har opdateret formularen ved at trykke på send
Okay. Nej, jeg kender ikke noget til gratis webhoteller længere. Benytter mig udelukkende at betalingstjenester.
De behøver ikke lægge koden op. Nu har du validering på din form og den kan sende mails går jeg ud fra. Det er begrænset hvor meget man kan lave med en mailform jo. Du skriver ikke hvad fejlen er, hvis du ikke har udfyldt et felt.. Det kan være en ulempe. Men hvis det bare er fordi feltet er tomt, så kan det godt gå an.
Det kan du se i indlæg #3 i starten af scriptet. Du skal faktisk bare bruge den samme if sætning, som du bruger til at lave den røde border. Den kopierer du bare derhen, hvor du vil vise fejlen, og så istedet for at den udfører noget CSS, skal du bare lave en tekst i stedet.
Nu virker det også:-) Jeg kom ikke så langt med fejlmeddelelserne - for at være ærlig, så fik jeg ikke kigget på det - , men tænkte om det ikke var en idé, at lave fejlmeddelelsen ud ad det felt, hvor fejlen er. Hvordan laver man dette?
Skal man starte med at kalde jer fejl ved navn (altså "navn" feltet får variablen $navn; osv.)?
Så tjekker man til sidst alle felterne for fejl. Er det den måde man skal lave det på?
Jeg synes ikke, at vi skal tjekker 117 ting, men måske var det en idé også at tjekke om der er skrevet en korrekt mailadresse, så på mail feltet vil der være to fejlmeddelelser (tomt og ikke en korrekt mailadresse).
Er er vi efterhånden i mål:-) Det virker super fedt.
Dog har jeg en lille ting, som jeg godt vil lave om. Når man har sendt en mail, så skriver kontaktformularen "Mailen blev sendt", hvilket er fint nok, når man lige har sendt mailen, men kan man ikke få den til at forsvinde efter noget tid?
Eller skal man lave en side, hvor man skriver noget mere end bare "Mailen blev sendt", og så først reloade kontaktformularen næste gang brugeren kommer ind på siden kontakt.
Må jeg spørge dig om, hvordan du er blevet så god til php?
Du kan sagtens lave et redirect, hvis det er det du vil. Vi kan jo lave det i PHP, når vi nu arbejder med dette. Der er dog nogle "krav" for at denne funktion kan virke, og det er, at funktionen skal afvikles, inden der outputtes til browseren.
Med andre ord, så skal din PHP kode rykkes op i toppen af din fil, før <html> <head> og så videre ...
Din kode vil nu se ud som noget ala,
<?php
if (isset($_POST['send'])) {
$fejl = FALSE;
if (!$_POST['navn']) {
$navn_error = "Du har ikke udfyldt dit navn."; $fejl = TRUE;
unset($_POST["navn"], $_POST["emne"], $_POST["besked"]); header( "refresh:5;url=minSide.php" ); // 5 er antal sekunder før redirect
}
}
?>
<DOCTYPE ...>
<html>
<head>...</head>
<body>
...
<?php if (!$fejl) { echo "Din mail blev sendt."; } ?>
...
Ja, det må du da gerne spørge om :) Det handler bare om træning, træning og træning. At arbejde med det og have en interesse/passion for det. Jeg sidder med det stort set hver dag. Så skal det nok også komme. Det tager sin tid, men det kommer for de fleste. Når man først forstår logikken og måden PHP arbejder på, så bliver det hele meget nemmere. Men der er altid noget nyt at lære inden for programmering. Også for mig. :)
Jeg har besluttet mig for, at jeg vil lære at programmere hjemmesider, men er også godt klar over at det kræver en del træning. Jeg vil fremover bruge noget tid hver aften for at blive bedre.
Er der andre ting, man skal tage højde for ved en kontaktformular? Kan man lave kontaktformularen mere enkelt? Her tænker jeg på, om man kan lave nogle funktioner som f.eks. tjek om emailadressen er skrevet rigtigt.
Hvad med tegnsæt? Understøtter kontaktformularen æ,ø og å?
Det lyder fornuftigt, hvis det er noget du gerne vil udvikle dig inden for :)
Det er begrænset hvad man laver på en mailform. (kontaktformular). Du har allerede validering på om en mailadresse er korrekt udfyldt (du kan "ikke" checke om mailen bogstaveligttalt findes). Det lavede vi tidligere i tråden.
Hvis du har tegnsæt sat til UTF-8, din fil er gemt i dette format og serveren er sat op til det (hvilket den som regel er), så ja, så vil du ikke have nogle problemer med det.
Men det er jo bare at teste, når du får lagt det op :)
OK. Jeg tager lige en kopi af vores kontaktformular og leger lidt med det selv her de næste par dage. Jeg vil bare prøve at skrive koden lidt mere efter min logik og stil (koden står lidt overskuelig nu). Jeg vender tilbage, hvis jeg støder ind i problemer.
Kontaktformularen kan helt klart det, som det skal kunne nu:-)
Kom lige i tænke om noget:-) Jeg har tænkt mig at lave en hovedside, og så inkludere mine undersider vha. include, så bliver det noget svært at lave en redirect, da denne skal afvikles head'en.
Hvordan kan jeg både lave includes af mine undersider samt lave redirects? Vil en redirect funktion være en løsning?
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.