30. oktober 2009 - 18:14Der er
17 kommentarer og 1 løsning
mysql og sticky form
Hej, Jeg har en form hvor der kan tastes oplysninger som efterfølgende indsættes i en mysql db. Jeg ønsker at hvis et af felterne ikke er korrekt udfyldt slettes det, men de øvrige felter beholder den indtastede værdi. Når formen submittes, hvis felterne er korrekte udfyldte, skal alle felterne slettes. I første omgang er det ikke decideret kode jeg ønsker, men snarere forslag til hvordan det kan lade sig gøre.
Det er bare at checke alle felter en og en eller i et array om de er rigtigt udfyldte. Er de det, så slettes de. Er de ikke, slettes det element eller de elementer der ikke matcher (med f ex array_compare).
Det kan jeg godt forstå du ikke synes giver mening. Jeg fik ikke forklaret mig tydeligt nok. Hvis alle felter er korrekt udfyldt indsættes de i databasen. Hvis ikke skrives fejlmeddelelse med hvilke felter der er forkert udfyldt, og der indsættes intet i databasen. (Så langt er jeg nået, nedenstående har jeg brug for hjælp til.) De felter der blev korrekt udfyldt står stadig i formen, mens de felter der var ukorrekte er blanke. Når de blanke udfyldes korrekt og formen submittes, sættes oplysningerne ind i databasen og indtastningsfelterne ryddes.
Du har ret. Det er en større omgang, så her kommer den skrabede version: <script type="text/javascript"> function setForm(data) { var ar = data.split("#"); document.getElementById("efternavn").value = ar[0]; document.getElementById("fornavn").value = ar[1]; document.getElementById("hiddenid").value = ar[2]; document.getElementById("gem").value = " Ret "; } </script>
Du bør lave din validering inden der udskrives noget på siden, så den måde kan du redirecte siden hvis det hele er udfyldt korrekt.
Hvis du har mange felter kan du bruge et array til at holde fejlmeddelelserne. Det er nemmere at håndtere.
Herudover kan du bruge value="<?php echo $_POST['value']" så værdierne bliver i formen efter post. Du bør derfor også vente med at lave f.eks. ucwords til du er sikker på, at det er klar til at blive gemt i databasen. Jeg kan ikke lige gennemskue hvad dit javascript skal bruges til, men den sætter også value, så den skal måske slås fra efter man har posted første gang.
Jeg har skrevet din kode om (ikke testet), håber den forklarer det bedre end jeg kan med ord. Ellers må du stille spørgsmål :)
----- <?php if (isset($_POST['submitted'])) { require_once('xxx.php');
$errors = array(); // bruges til at holde errors
if (!preg_match('/^[[:alpha:][:space:]æøåÆØÅ\.\-]{2,40}$/', $_POST['fornavn'])) { $errors['fornavn'] = "Fornavn forkert indtastet."; }
if (!preg_match('/^[[:alpha:][:space:]æøåÆØÅ\.\-]{2,50}$/', $_POST['efternavn'])) { $errors['fornavn'] = "Efternavn forkert indtastet."; }
if (count($errors) == 0) { // er der sat nogle errors? $fornavn = ucwords($_POST['fornavn']); $efternavn = ucwords($_POST['efternavn']);
if ($id > 0) { // Opdater en post $query_ret = mysql_query("UPDATE 'xxx' SET Fornavn='$fornavn', Efternavn='$efternavn' WHERE Id ='$id'"); } else { // Indsæt en ny post $query_indtast = mysql_query("INSERT INTO 'xxx' (Fornavn, Efternavn) VALUES ('$fornavn', '$efternavn')"); } header('Location: DinForm.php'); // redirect til success siden } } ?> <script type="text/javascript"> function setForm(data) { var ar = data.split("#"); document.getElementById("efternavn").value = ar[0]; document.getElementById("fornavn").value = ar[1]; document.getElementById("hiddenid").value = ar[2]; document.getElementById("gem").value = " Ret "; } </script> <?php if (!empty($errors)) { print "Du mangler at udfylde et eller flere felter<br />"; foreach($errors as $value) { echo $value."<br />"; } } ?> <form action="<?php $_SERVER['PHP_SELF'].'land='.$land.'&by='.$by ?>" method="post" name="indtast" id="indtast" > <table> <tr> <td>Efternavn:</td> <td><input name="efternavn" id="efternavn" type="text" value="<?php echo $_POST['efternavn']?>" /></td> </tr> <tr> <td>Fornavn:</td> <td><input name="fornavn" id="fornavn" type="text" value="<?php echo $_POST['fornavn']?>" /></td> </tr> <tr> <td><input type="hidden" name="submitted" value="TRUE" /><input type="hidden" name="id" id="hiddenid" value="0" /></td> <td><input type="submit" name="gem" id="gem" value=" Gem "/><input type="reset" name="slet" id="slet" value=" Slet alt " /></td> </tr> </table> </form>
Jeg er kommet til et omtrent tilsvarende resultat as intenz, foerst validere og saa indfylde formen. Jeg har ikke sammenligned vores loesninger i detaljer. Her er mit forslag. Den sidste gruppe er min egen mysql forbindelse - jeg lavede en tabel or kontrollerede at de vaerdier jeg indfylder bliver postet i databasen hvis de valideres og kun hvis de valideres.
I min loesning, hvis fornavn er korrekt men efternavn ikke saa bliver fornavn staaende og vice versa, men hvis begge vaerdier er korrekt saa slettes de fra formen og postes i databasen.
Jeg haaber at hvis du tager det bedste fra de to loesninger saa faar du in applikation til at virke.
hrole, saa du mit (og intenz's) svar? Hvis du finder at de svarer paa dit spoergsmaal saa luk spoergsmaalet ved at uddele points. Det giver god orden, og saa staar spoergsmaalet ikke laengere som aabent i min liste af indlaeg.
Tak for jeres forslag. Jeg har først her til aften haft mulighed for at kikke på dem.
Jeg er ked af hvis i føler jer stødte over jeg først svarer nu - det er bestemt ikke min mening, men jeg var ikke klar over jeg havde en tidsfrist på ca. 2 døgn til at besvare og uddele point.
Jeg kan godt se det er smartere at validere først. Jeg tror jeg vælger at benytte lidt kode fra begge jeres forslag, og så er det vel fair I begge to får point. 15 til hver?
intenz: javascriptdelen bruges hvis en af posterne skal rettes. mht. din redirect er jeg lidt i tvivl. I øjeblikket har jeg hele koden i én fil. hvordan skal den deles op hvis jeg benytter mig af redirect?
Først og fremmest beklager mit sidste indlæg. Der var nogle andre ting der gik mig på, og det gik så lige udover dig (så faktisk også først efterfølgende, at der ikke var gået særlig lang tid). Det er selvfølgelig ikke i orden at skrive sådan.
Du behøver ikke, at dele det op for at bruge redirect'en. Du skal bare sørge for at den bliver kørt inden der kommer noget output til skærmen (altså den skal være øverst i filen, inden HTML mv.).
Det eneste den gør er, at sende brugeren videre til en anden side. Det kan være en anden side med f.eks. "Dit data er blevet gemt" eller andet. Eller du kan bare redirecte til den formular de sidder og indtaster. Det gør så, at alle felter automatisk bliver slettet (altså den bliver 'som ny'). Det er en god ide at bruge redirects til sådan noget, ellers kan brugeren bare trykke F5 og genindlæse siden og indsætte indholdet igen i databasen, selvom det er det samme indhold.
hrole, er tiden saa ikke inde til at lukke spoergsmaalet? Hvis du accepterer begge svar saa giver systemet os hver halfdelen af de 15 points (hvordan man deler det ulige antal ved jeg ikke men det er lige meget.) Hvis Du vil give to gange 15 points saa synes systemet at vaere at du giver en af os alle 15 points og saa opretter du et nyt spoergsmaal der hedder "Points til [navn]." Saa kan [navn] smide et svar og du kan give dine points.
Men siden spoergsmaalet synes at vaere besvaret og du velsagtens ikke forventer indput fra andre saa vil det vaere godt at faa "ryddet op" ved at lukke spoergsmaalet. Saa er vi klar til de naeste spoergsmaal.
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.