Ett par frågor om php och formulär

Permalänk
Medlem

Ett par frågor om php och formulär

Hej,

Har idag två frågor om formulär och php som jag undrar om det finns någon mer kunnig som kan hjälpa mig med, den ena om validering av fält och den andra om att temporärt spara info från fält (mer detaljer om detta sen).

Fråga 1
Håller på med kontaktformuläret på min sida, och kör för tillfället ett antal valideringar på alla olika fält för att se att de är korrekt ifyllda. Valideringen fungerar bra, men jag vill gärna informera om vilka fält som inte är ifyllda, hur gör jag det? Jag vill alltså inte bara säga att det är fel, utan även säga vilka fält som är felaktiga/tomma. Koden för valideringen av alla fält ser ut som följer:

if(empty($name_field) or empty($message) or empty($email_field) or (!filter_var($email_field, FILTER_VALIDATE_EMAIL))) {header ("Location: http://www.leosjoberg.com/contact.php?success=3");}

Jag kollar alltså först om fälten namn, meddelande eller mail är tomma, följt av att kolla om mailen är giltig. Det jag undrar är alltså om man sedan kan visa vilka fält som inte är ifyllda genom php. Exempelvis: "Fyll i namn och email-adress". Är dock inte helt säker på hur man ska göra detta; kan man kanske skapa en array av de fält som misslyckades i valideringen, för att sedan kunna rada upp dem?

Fråga 1.1
En liten sidofråga är om ert tyckande, hur ska valideringen vara skriven? Antingen

if(empty($name_field) or empty($message) or empty($email_field) or (!filter_var($email_field, FILTER_VALIDATE_EMAIL))) {header ("Location: http://www.leosjoberg.com/contact.php?success=3");}

eller kanske

if(empty($name_field) or empty($message) or empty($email_field)) {header ("Location: http://www.leosjoberg.com/contact.php?success=3") else if (!filter_var($email_field, FILTER_VALIDATE_EMAIL)) {header ("Location: http://www.leosjoberg.com/contact.php?success=4");}

Eller ska man göra på något helt annat sätt?

Fråga 2
Om användaren skulle missa att fylla i ett av fälten, och sedan trycka på "skicka", så töms ju som bekant alla fält, hur förhindrar jag detta? Är det möjligt att jag kan spara antingen bara $message (finns inte så stor anledning att spara något annat fält), eller alla fält som inte klarade valideringen? Jag antar att man kan skriva infon från dessa fält till en temporär fil, men hur? Är det kanske möjligt att bara bygga på koden från föregående fråga så att det blir så här:

if(empty($name_field) or empty($message) or empty($email_field) or (!filter_var($email_field, FILTER_VALIDATE_EMAIL))) {header ("Location: http://www.leosjoberg.com/contact.php?success=3"); //sätt in koden för att skapa en temp-fil här; }

Edit: Det borde gå med en kod liknande denna:

if(empty($name_field) or empty($message) or empty($email_field) or (!filter_var($email_field, FILTER_VALIDATE_EMAIL))) {header ("Location: http://www.leosjoberg.com/contact.php?success=3"); fwrite ($temp, $message); //eller kanske man bara kan få över en variabel utan problem? }

Dock vet jag inte hur man får över innehållet från denna variabel (liggandes i send.php) till contact.php, eller kan man bara få över variabeln message direkt? Eller ska man låta location för header vara till contact.php?success=3&message=$message (kommer meddelandet visas i URLen då?), alternativt låta skriva till en temp fil som contact.php sedan kan använda?

EDIT2: Kör numera med en temp-fil i väntan på bättre lösning!

Tackar på förhand för all hjälp!

Visa signatur

Citera för svar!|Fraktfritt hos INET|Min hemsida
Fractal Design Define R3|Corsair AX 850W|Gigabyte Nvidia GeForce GTX 570|Corsair Vengeance 1600MHz 2x4GB|ASRock P67 Extreme4|Intel Core i5 2500K|2x Samsung Spinpoint F3 1TB|Samsung Blu-Ray läsare
Nikon D7000|Nikon 60mm macro|Nikon 18-70|Nikon 55-300|Nikon 10.5 Fisheye

Permalänk

Detta borde ge dig en grund för hur du kan utöka ditt formulär:

<?php $errors = array(); if (isset($_POST['myform'])) { if (empty($_POST['fullname'])) { $errors['fullname'] = "Du måste ange ett namn"; } if (empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { $errors['email'] = "Ej giltig email"; } if (empty($errors)) { header("Location: http://min.success.sida.com"); } } ?> <!doctype html> <html> <head> <title>Formtest</title> </head> <body> <form name="myform" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>"> Fullständigt namn <input type="text" name="fullname" value="<?php echo isset($_POST['fullname'])) ? $_POST['fullname'] : '' ?>" /> <?php if (isset($errors['fullname'])): ?> <span class="error"><?php echo $errors['fullname'] ?></span> <?php endif; ?> E-post <input type="text" name="email" value="<?php echo isset($_POST['email'])) ? $_POST['email'] : '' ?>" /> <?php if (isset($errors['email'])): ?> <span class="error"><?php echo $errors['email'] ?></span> <?php endif; ?> <input type="submit" value="Skicka" /> </form> </body> </html>

Permalänk
Medlem
Skrivet av Cloudburst:

Detta borde ge dig en grund för hur du kan utöka ditt formulär:

<?php $errors = array(); if (isset($_POST['myform'])) { if (empty($_POST['fullname'])) { $errors['fullname'] = "Du måste ange ett namn"; } if (empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { $errors['email'] = "Ej giltig email"; } if (empty($errors)) { header("Location: http://min.success.sida.com"); } } ?> <!doctype html> <html> <head> <title>Formtest</title> </head> <body> <form name="myform" method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>"> Fullständigt namn <input type="text" name="fullname" value="<?php echo isset($_POST['fullname'])) ? $_POST['fullname'] : '' ?>" /> <?php if (isset($errors['fullname'])): ?> <span class="error"><?php echo $errors['fullname'] ?></span> <?php endif; ?> E-post <input type="text" name="email" value="<?php echo isset($_POST['email'])) ? $_POST['email'] : '' ?>" /> <?php if (isset($errors['email'])): ?> <span class="error"><?php echo $errors['email'] ?></span> <?php endif; ?> <input type="submit" value="Skicka" /> </form> </body> </html>

Jo, det där går ju, men jag tänkte om det gick på ett mer komprimerat sätt, vill nämligen att de ska radas upp, som i "du har glömt a och b", där a och b då är variablerna som är tomma/felaktiga. För här blir det väl ändå så att det kommer stå
Du måste ange ett namn
Ej giltig email
,
eller hur? Vill hellre att man då tar ut de som är felaktiga och bara sätter in dem. Kanske att man kan skapa en array av de fält som är tomma/felaktiga, för att sedan kunna ha du har glömt $fel[0] och $fel[1] i koden, eller liknande? Kan ha fått allt helt fel, men känns som om det borde gå (är iofs rätt ny till php)

EDIT: Nu ser koden ut på det här sättet:

//Sending Email if(empty($name_field) or empty($message) or empty ($email_field) or (!filter_var($email_field, FILTER_VALIDATE_EMAIL))) { fwrite ($handle, $message); fclose($handle); header ("Location: http://www.leosjoberg.com/contact.php?success=3&message=1"); }

Visa signatur

Citera för svar!|Fraktfritt hos INET|Min hemsida
Fractal Design Define R3|Corsair AX 850W|Gigabyte Nvidia GeForce GTX 570|Corsair Vengeance 1600MHz 2x4GB|ASRock P67 Extreme4|Intel Core i5 2500K|2x Samsung Spinpoint F3 1TB|Samsung Blu-Ray läsare
Nikon D7000|Nikon 60mm macro|Nikon 18-70|Nikon 55-300|Nikon 10.5 Fisheye

Permalänk

Den skriver ut det relevanta felmeddelandet brevid det fält som var fel vilket underlättar för användaren att veta vad som var fel. Man kan även göra tex <input class="<?php echo (isset($errors['fullname'])) ? 'error' : '' ?>" /> så den lägger till en class på fältet om det har fel så man kan styla det rött om det är fel.

Du har en array $errors annars om du kan göra vad du vill med. Du kan loopa över den och skriva ut alltihop på ett och samma ställe om du vill det.

Och som du ser (eller om du testar koden) så ser du att den behåller de tidigare värdena, dvs formuläret töms inte.

Permalänk
99:e percentilen
Skrivet av Cloudburst:

Och som du ser (eller om du testar koden) så ser du att den behåller de tidigare värdena, dvs formuläret töms inte.

Vilket är oerhört viktigt! Det ger ett extremt oprofessionellt intryck om man måste fylla i hela formuläret igen bara för att någonting var ogiltigt.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem
Skrivet av Cloudburst:

Den skriver ut det relevanta felmeddelandet brevid det fält som var fel vilket underlättar för användaren att veta vad som var fel. Man kan även göra tex <input class="<?php echo (isset($errors['fullname'])) ? 'error' : '' ?>" /> så den lägger till en class på fältet om det har fel så man kan styla det rött om det är fel.

Du har en array $errors annars om du kan göra vad du vill med. Du kan loopa över den och skriva ut alltihop på ett och samma ställe om du vill det.

Och som du ser (eller om du testar koden) så ser du att den behåller de tidigare värdena, dvs formuläret töms inte.

För tillfället kör jag på

if(empty($name_field)) { $wrong[] = $name_field; } if(empty($message)) { $wrong[] = $message; } if(empty($email_field) or (!filter_var($email_field, FILTER_VALIDATE_EMAIL))) { $wrong[] = $email_field; }

för att sedan skriva ut vektorn $wrong.

Sen kanske det bara är så att jag är trött, men var sparar du värdena för fälten? Det jag är lite osäker till är om detta går som jag har strukturerat det nu, där nästan all php ligger i send.php, då själva formuläret är för att skicka ett mail, vilket är varför jag vill ha utvärderingen i samma fil, men man kanske inte ska det, utan göra utvärderingen på contact.php och bara göra "include send.php"? Sen har jag min tillfälliga lösning för att behålla texten (just nu endast meddelandet, då jag tycker de andra fälten inte brukar vara lika irriterande som när man skrivit en lång text som försvinner...), som är att skriva $message till temp.txt i send.php, och sedan öppna temp.txt och skriva ut det i fältet i contact.php för att sedan radera temp.txt, och jag vet att det är en dum lösning, kunde bara inte komma på något effektivt.

Skrivet av Zuggmate:

Vilket är oerhört viktigt! Det ger ett extremt oprofessionellt intryck om man måste fylla i hela formuläret igen bara för att någonting var ogiltigt.

Men bör man spara alla fält? Sen så är det ju så att jag som nämnt har en separat php-fil som valideringen körs igenom, så vet inte om det är genomförbart om man inte flyttar den till contact.php, men jag är ju ny till php så kan ha oerhört fel!

Visa signatur

Citera för svar!|Fraktfritt hos INET|Min hemsida
Fractal Design Define R3|Corsair AX 850W|Gigabyte Nvidia GeForce GTX 570|Corsair Vengeance 1600MHz 2x4GB|ASRock P67 Extreme4|Intel Core i5 2500K|2x Samsung Spinpoint F3 1TB|Samsung Blu-Ray läsare
Nikon D7000|Nikon 60mm macro|Nikon 18-70|Nikon 55-300|Nikon 10.5 Fisheye

Permalänk
Medlem

Hejsan.

Du skulle ju kunna ta en titt på att använda så kallade session variabler för att spara information tillfälligt.

<?PHP session_start(); /* Låt oss lagra en sträng i en session variabel */ $_SESSION['minStr'] = 'Detta är en session variabel och jag är en sträng!'; /* Vi kan sedan skriva ut innehållet med tillexempel echo() */ echo($_SESSION['minStr']); /* vi kan även spara arrays i sessions variabler */ $minArray = array(); $minArray[] = 'One Missisippi'; $minArray[] = 'Two Missisippi'; $minArray[] = 'Three Missippi'; $_SESSION['payload'] = $minArray; ?>

OBS! Följande funktion är viktig i sammanhanget nämligen session_start()
http://php.net/manual/en/function.session-start.php

Annars kommer du ej kunna använda sessions variabler.

Du kan även spara arrays i sessions variabler!

Ta en titt på följande länk för mer info:
http://php.net/manual/en/reserved.variables.session.php

Förtydligande
Visa signatur

Fractal Design Arc Svart | MSI Z68A-GD55 G3 REV B3 | Intel® Core i7 2600K, 3.4GHz, 8MB | Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE LP | MSI GeForce GTX 670 | Phanteks PH-TC14PE CPU Cooler (vit) | Corsair Power Supply 650W TX M, Modular, ATX, PS/2 | SSD (okänd tillverkare) + 2 äldre SATA2 diskar på 750 Gb, 350 gb. | OS: Microsoft Windows 10 home.

Permalänk
Medlem
Skrivet av BlueEyes:

Hejsan.

Du skulle ju kunna ta en titt på att använda så kallade session variabler för att spara information tillfälligt.

<?PHP session_start(); /* Låt oss lagra en sträng i en session variabel */ $_SESSION['minStr'] = 'Detta är en session variabel och jag är en sträng!'; /* Vi kan sedan skriva ut innehållet med tillexempel echo() */ echo($_SESSION['minStr']); /* vi kan även spara arrays i sessions variabler */ $minArray = array(); $minArray[] = 'One Missisippi'; $minArray[] = 'Two Missisippi'; $minArray[] = 'Three Missippi'; $_SESSION['payload'] = $minArray; ?>

OBS! Följande funktion är viktig i sammanhanget nämligen session_start()
http://php.net/manual/en/function.session-start.php

Annars kommer du ej kunna använda sessions variabler.

Du kan även spara arrays i sessions variabler!

Ta en titt på följande länk för mer info:
http://php.net/manual/en/reserved.variables.session.php

Yes, såg lite om sessioner, men blev lite osäker om en sak... Är sessioner endast inom en viss fil, eller kan jag t ex spara vissa variabler i send.php, och sedan få över dessa variabler till contact.php. Eller går det kanske att lösa inuti send.php? Har ju för tillfället variablerna på detta sätt:

$name_field = $_POST['name']; $email_field = $_POST['email']; $message = $_POST['message']; $website = $_POST['website']; $body = "From: $name_field\n E-Mail: $email_field\n Message: $message\n website: $website"; $temp = "temp.txt"; $handle = fopen($temp, "w"); $wrong = array();

Som du ser så har jag i brist på bättre nu gjort så att jag skriver $message till temp.txt, som sedan öppnas i contact.php, men det är en riktigt fullösning. För övrigt används inte $wrong, utan det var tänkt att jag skulle skriva alla felaktiga variabler till just $wrong, så att jag kunde ha en lista som jag sedan kunde använda i contact.php för att rada upp vilka fält som inte var ifyllda. För övrigt undrar jag fortfarande hur jag på bästa sätt löser problemet med att behålla info i alla fält (till skillnad från att, som nu, skriva $message till en textfil...).

Jag har funderat lite på att köra all verifiering för fälten i contact.php, och om inget är fel så har man något enkelt liknande

else {include: "send.php";}

, men vet inte om det är bra eller inte, samt att jag fick en del problem när jag provade det senast...

Visa signatur

Citera för svar!|Fraktfritt hos INET|Min hemsida
Fractal Design Define R3|Corsair AX 850W|Gigabyte Nvidia GeForce GTX 570|Corsair Vengeance 1600MHz 2x4GB|ASRock P67 Extreme4|Intel Core i5 2500K|2x Samsung Spinpoint F3 1TB|Samsung Blu-Ray läsare
Nikon D7000|Nikon 60mm macro|Nikon 18-70|Nikon 55-300|Nikon 10.5 Fisheye

Permalänk
Medlem
Skrivet av phroggyy:

Yes, såg lite om sessioner, men blev lite osäker om en sak... Är sessioner endast inom en viss fil, eller kan jag t ex spara vissa variabler i send.php, och sedan få över dessa variabler till contact.php. Eller går det kanske att lösa inuti send.php? Har ju för tillfället variablerna på detta sätt:

$name_field = $_POST['name']; $email_field = $_POST['email']; $message = $_POST['message']; $website = $_POST['website']; $body = "From: $name_field\n E-Mail: $email_field\n Message: $message\n website: $website"; $temp = "temp.txt"; $handle = fopen($temp, "w"); $wrong = array();

Som du ser så har jag i brist på bättre nu gjort så att jag skriver $message till temp.txt, som sedan öppnas i contact.php, men det är en riktigt fullösning. För övrigt används inte $wrong, utan det var tänkt att jag skulle skriva alla felaktiga variabler till just $wrong, så att jag kunde ha en lista som jag sedan kunde använda i contact.php för att rada upp vilka fält som inte var ifyllda. För övrigt undrar jag fortfarande hur jag på bästa sätt löser problemet med att behålla info i alla fält (till skillnad från att, som nu, skriva $message till en textfil...).

Jag har funderat lite på att köra all verifiering för fälten i contact.php, och om inget är fel så har man något enkelt liknande

else {include: "send.php";}

, men vet inte om det är bra eller inte, samt att jag fick en del problem när jag provade det senast...

Hejsan.

Du kan komma åt variabler du sparat i session så länge webbläsaren är igång och du inleder med session_start() innan du försöker komma åt variablerna. Oavsett sida du anropar variablerna i så länge du startar session som du ser ovan.

Det räcker med att du anropar session_start() i filen där du inkluderar andra php filer för att komma åt session i dessa.

Det är min erfarenhet i varje fall.
Har någon en annan är dom välkomna att motbevisa mig.

mvh, BlueEyes

Visa signatur

Fractal Design Arc Svart | MSI Z68A-GD55 G3 REV B3 | Intel® Core i7 2600K, 3.4GHz, 8MB | Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE LP | MSI GeForce GTX 670 | Phanteks PH-TC14PE CPU Cooler (vit) | Corsair Power Supply 650W TX M, Modular, ATX, PS/2 | SSD (okänd tillverkare) + 2 äldre SATA2 diskar på 750 Gb, 350 gb. | OS: Microsoft Windows 10 home.

Permalänk
Medlem
Skrivet av BlueEyes:

Hejsan.

Du kan komma åt variabler du sparat i session så länge webbläsaren är igång och du inleder med session_start() innan du försöker komma åt variablerna. Oavsett sida du anropar variablerna i så länge du startar session som du ser ovan.

Det räcker med att du anropar session_start() i filen där du inkluderar andra php filer för att komma åt session i dessa.

Det är min erfarenhet i varje fall.
Har någon en annan är dom välkomna att motbevisa mig.

mvh, BlueEyes

Hmm, har lagt in sessionsvariablerna, och kör en echo i contact.php. Dock tror jag att jag har nu stött på ett problem som jag inte lyckas identifiera i send.php... När jag skickar formuläret så kommer man till send.php, men man skickas aldrig vidare någonstans alls, utan stannar bara på den vita sidan send.php. Har du någon aning om vad som kan vara fel... Om det hjälper så är det bara att kolla på kontaktformuläret, och bara ange ett ogiltigt fält (typ mailadressen) så kommer du till send.php och kan kolla koden där, vet nämligen inte vilken kod jag ska bifoga här, och känns onödigt att bifoga all källkod, så det är bara att ta och kolla på den om du tror att du kan hjälpa mig, skulle uppskattas väldigt mycket!

Visa signatur

Citera för svar!|Fraktfritt hos INET|Min hemsida
Fractal Design Define R3|Corsair AX 850W|Gigabyte Nvidia GeForce GTX 570|Corsair Vengeance 1600MHz 2x4GB|ASRock P67 Extreme4|Intel Core i5 2500K|2x Samsung Spinpoint F3 1TB|Samsung Blu-Ray läsare
Nikon D7000|Nikon 60mm macro|Nikon 18-70|Nikon 55-300|Nikon 10.5 Fisheye

Permalänk
Medlem
Skrivet av phroggyy:

Hmm, har lagt in sessionsvariablerna, och kör en echo i contact.php. Dock tror jag att jag har nu stött på ett problem som jag inte lyckas identifiera i send.php... När jag skickar formuläret så kommer man till send.php, men man skickas aldrig vidare någonstans alls, utan stannar bara på den vita sidan send.php. Har du någon aning om vad som kan vara fel... Om det hjälper så är det bara att kolla på kontaktformuläret, och bara ange ett ogiltigt fält (typ mailadressen) så kommer du till send.php och kan kolla koden där, vet nämligen inte vilken kod jag ska bifoga här, och känns onödigt att bifoga all källkod, så det är bara att ta och kolla på den om du tror att du kan hjälpa mig, skulle uppskattas väldigt mycket!

Hejsan

Prova lägga denna snutt överst i send.php och efter session_start()

<?PHP /* Skriv ut en array på vad som finns i post session och get */ echo('<pre>'); print_r($_POST); print_r($_SESSION); print_r($_GET); echo('</pre>'); /* här stoppar vi scriptet så vi kan kolla in listan - TA BORT ELLER KOMMENTERA NEDAN NÄR VI VILL KÖRA PÅ! */ exit(); ?>

Detta kan hjälpa dig felsöka så du vet vad som faktiskt kommer till send.php.

Ett trick jag använder när något går fel.

Visa signatur

Fractal Design Arc Svart | MSI Z68A-GD55 G3 REV B3 | Intel® Core i7 2600K, 3.4GHz, 8MB | Corsair 16GB (4x4096MB) CL9 1600Mhz VENGEANCE LP | MSI GeForce GTX 670 | Phanteks PH-TC14PE CPU Cooler (vit) | Corsair Power Supply 650W TX M, Modular, ATX, PS/2 | SSD (okänd tillverkare) + 2 äldre SATA2 diskar på 750 Gb, 350 gb. | OS: Microsoft Windows 10 home.