Avatar billede hrole Mester
30. oktober 2009 - 18:14 Der 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.
Avatar billede michael_stim Ekspert
30. oktober 2009 - 18:36 #1
Giver ingen mening, men OK.

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).
Avatar billede hrole Mester
30. oktober 2009 - 18:57 #2
hvilket giver ingen mening?
Avatar billede michael_stim Ekspert
30. oktober 2009 - 19:05 #3
At når alle sammen er korrekt udfyldte, så slettes de.
Avatar billede hrole Mester
30. oktober 2009 - 19:40 #4
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.
30. oktober 2009 - 19:49 #5
Hvis du sender koden for siden saa vil det vaere nemmere at give konkrete anvisninger.
Avatar billede hrole Mester
30. oktober 2009 - 20:07 #6
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>

<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" /></td>
</tr>
<tr>
  <td>Fornavn:</td>
  <td><input name="fornavn" id="fornavn" type="text" /></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>
<?php
if (isset($_POST['submitted'])) {
require_once('xxx.php');

    if (preg_match('/^[[:alpha:][:space:]æøåÆØÅ\.\-]{2,40}$/', $_POST['fornavn'])) {
        $fornavn = ucwords($_POST['fornavn']);
        } else {
        $fornavn = FALSE;
        echo '<p>Fornavn forkert indtastet.<br /></p>'; }
   
    if (preg_match('/^[[:alpha:][:space:]æøåÆØÅ\.\-]{2,50}$/', $_POST['efternavn'])) {
        $efternavn = ucwords($_POST['efternavn']);
        } else {
        $efternavn = FALSE;
        echo '<p>Efternavn forkert indtastet.<br /></p>'; }

    if ($fornavn && $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')");

        }
    } else { echo '<p>Du mangler at udfylde et eller flere felter</p>'; }
}
mysql_close;
?>
Avatar billede intenz Novice
31. oktober 2009 - 14:42 #7
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>
Avatar billede intenz Novice
31. oktober 2009 - 14:45 #8
hov,
$errors['fornavn'] = "Efternavn forkert indtastet.";

skulle selvfølgelig være:
$errors['efternavn'] = "Efternavn forkert indtastet.";
31. oktober 2009 - 14:52 #9
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.

<html>
<head>
  <title></title>
</head>

<body>

<?
  $fornavn = FALSE;
  $efternavn = FALSE;
  if($_POST['gem'])
  {
    if (preg_match('/^[[:alpha:][:space:]æøåÆØÅ\.\-]{2,50}$/', $_POST['fornavn']))
      $fornavn = ucwords($_POST['fornavn']);
    else echo '<p>Fornavn forkert indtastet.<br /></p>';

    if (preg_match('/^[[:alpha:][:space:]æøåÆØÅ\.\-]{2,50}$/', $_POST['efternavn']))
      $efternavn = ucwords($_POST['efternavn']);
    else echo '<p>Efternavn forkert indtastet.<br /></p>';

    if(!$fornavn || !$efternavn) echo '<p>Du mangler at udfylde et eller flere felter</p>';
  }
?>
<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"
        <?
          if ($efternavn && !$fornavn)
          echo "value=" . $efternavn;
        ?> >
      </td>
    </tr>
    <tr>
      <td>Fornavn:</td>
      <td><input name="fornavn" id="fornavn" type="text"
        <?
          if (!$efternavn && $fornavn) echo "value=" . $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>
<?
  if ($fornavn && $efternavn)
  {
    //******min mysql kode
    $link = mysql_connect ('christianjorgensen.be.mysql', 'christianjoygen', 'dnyBKKbe') or die(mysql_erorr());
    mysql_select_db('christianjoygen') or die('Could not select database');
    mysql_query("INSERT INTO hrole VALUES ('$fornavn', '$efternavn')");
    mysql_close;    //******min sql
  }
?>
Avatar billede intenz Novice
31. oktober 2009 - 14:55 #10
Men hvis du trykker refresh med din løsning bliver resultatet lagt ind i databasen igen. Du skal bruge en redirect for at løse det problem.

Mit var også et svar
01. november 2009 - 22:34 #11
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.
Avatar billede intenz Novice
01. november 2009 - 23:13 #12
Enig. Vis noget respekt for at folk bruger tid på at hjælpe dig.
Avatar billede hrole Mester
01. november 2009 - 23:36 #13
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.
Avatar billede hrole Mester
02. november 2009 - 17:41 #14
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?
Avatar billede intenz Novice
03. november 2009 - 19:03 #15
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.
03. november 2009 - 21:48 #16
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.
Avatar billede hrole Mester
03. november 2009 - 23:08 #17
intenz: Det er iorden! Og tak for forklaringen.

Christian_Belgien: Jo. Jeg opretter en tråd med 15 point til dig.
Avatar billede hrole Mester
03. november 2009 - 23:26 #18
Tråd med point til Christian_Belgien:
http://www.eksperten.dk/spm/891615
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester