Avatar billede hrole Mester
17. oktober 2009 - 11:43 Der er 19 kommentarer og
1 løsning

Indsætte mysql data i form via javascript

Hej,

Jeg har nu bøvlet med at finde en løsning på mit problem vha. php, som resten af siden er skrevet i, og det kan jeg ikke få til at fungere. Uden jeg har stor viden om javascript er det mit indtryk at det er her løsningen skal findes. Men ret mig hvis jeg tager fejl.
Jeg har en form hvor der tastes en række oplysninger fx fornavn, efternavn, by osv. Når formen submittes lagres disse data i en mysql database. På samme side kan man se de sidste fem lagrede poster. Hvis man opdager en tastefejl i en af disse ønsker jeg at man kan klikke på et link ud for den post man vil rette i, hvorefter alle oplysningerne sættes ind i formen, man retter og submitter igen hvorefter databasen opdateres. Selve databasen vælges udfra en række $_GET-værdier, som der ikke må pilles ved. Med det mener jeg at url'en i form action ikke må ændres, der må altså ikke tilføjes flere $_GET-værdier.
Essensen af problemet er derfor:
Hvordan indsætter jeg en allerede eksisterende post fra databasen i formen? Resten mht. at opdatere posten kan jeg selv klare med php.
Håber jeg fik forklaret problemet grundugt nok.
Avatar billede virtual1ty Nybegynder
17. oktober 2009 - 12:57 #1
Hvis du allerede har hentet et udtræk fra databasen, og gemt det i en variabel ved navn $data for eksempel, burde du kunne lave noget i denne stil:

<input type="text" name="fornavn" value=<?php echo $data['fornavn']; ?>>

Eller det er måske ikke det du søger? Er ikke sikker på jeg har forstået dit spørgsmål helt 100%.
Avatar billede hrole Mester
17. oktober 2009 - 16:40 #2
Jeg skal prøve at uddybe. Her er koden (skrabet version for overblikkets skyld):
Indtast:
<form action="<?php 'side.php?by='.$by.'&land='.$land ?>" 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" /></td>
  <td><input type="submit" name="gem" id="gem" value=" Gem " /></td>
</tr>
</table>
</form>
<?
require_once ('forbind_til_database.php'); // forbind til databsen

if (isset($_POST['submitted'])) { // når der trykkes gem lagres oplysningerne fra formen i databasen

$_POST['fornavn'] = $fornavn;
$_POST['efternavn'] = $efternavn;

if ($fornavn && $efternavn) {
$query_indtast = mysql_query("INSERT INTO `$tabel` (Fornavn, Efternavn) VALUES ('$fornavn', '$efternavn')");
    } else {
echo "Du glemte at udfylde for- og/eller efternavn"; }
}

Sidste fem indtastninger:

$query_sidste = mysql_query("SELECT * FROM `$tabel` ORDER BY Id DESC LIMIT 5"); // vælg de sidste fem indtastninger

while ($row = mysql_fetch_assoc($query_sidste)) {
echo $row['Fornavn'].' '.$row['Efternavn'].'<a href="side.php?by='.$_GET['by'].'&land='.$_GET['land'].'" >ret</a>'.'<br />'; // link her!!!
}

mysql_close;
?>

Det jeg havde tænkt mig var at ved tryk på linket ud for en af de sidste fem indtastninger fik man indsat værdierne i formen og kunne herefter rette og gemme igen. Hver enkelt indtastning får et unikt id, så der ikke kommer dobbelt indtastninger.
Jeg har tidligere forsøgt med dit forslag med en value, men kan ikke lige gennemskue hvordan det skulle løses uden brug af $_GET, som ikke er en mulighed.
Avatar billede virtual1ty Nybegynder
17. oktober 2009 - 17:10 #3
Kunne man ikke lave noget ala:

1. Hent de sidste 5 poster fra databasen
2. Brug deres unikke ID til at linke til f.eks. ret.php?id=<id>
3. På siden ret.php henter du så oplysningerne fra databasen udfra id'et i linket og fylder felterne med dataene fra databasen.
4. Brugeren retter sine data og trykker Gem, hvorpå dataene bliver opdateret i databasen.
Avatar billede hrole Mester
17. oktober 2009 - 17:30 #4
De oplysninger der skal rettes skulle meget gerne indsættes på "hovedsiden" (side.php), men det kunne måske omgåes vha php. Men det er vigtigt at der ikke ændres i url'en hvilket man vel bliver nødt til med det du nævner under pkt. 2. - eller kan det lade sig gøre på en anden måde?
Avatar billede tjens Nybegynder
17. oktober 2009 - 21:07 #5
Her er en javascript demo, af hvordan du laver links, der skriver i dine form-felter.
Jeg har indført et hidden id felt i formen: Du skal jo vide om det er en opret eller ændring i den php-side der modtager ændringen.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"    "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Fill Form</title>

<script type="text/javascript">
function setForm(data) {
    var ar = data.split("#");
    document.getElementById("fornavnID").value = ar[0];
    document.getElementById("efternavnID").value = ar[1];
    document.getElementById("hiddenID").value = ar[2];
    document.getElementById("gemID").value = "ændre " + ar[0] + " " + ar[1];
}
</script>
</head>
<body>
<div>
<form action="side.php" method="post" name="indtast" id="indtastID" >
<table>
<tr>
  <td>Efternavn:</td>
  <td><input name="efternavn" id="efternavnID" type="text" /></td>
</tr>
<tr>
  <td>Fornavn:</td>
  <td><input name="fornavn" id="fornavnID" type="text" /></td>
</tr>
<tr>
  <td><input type="hidden" name="id" id="hiddenID" value="0" type="text" /></td>
  <td><input type="hidden" name="submitted" value="TRUE" /></td>
  <td><input type="submit" name="gem" id="gemID" value=" Gem " /></td>
</tr>
</table>
</form>
Hans Hansen <a href="#" onclick="setForm('Hans#Hansen#101');" return false;> (ret)</a><br>
Jens Jensen <a href="#" onclick="setForm('Jens#Jensen#102');" return false;> (ret)</a><br>
</div>
</body>
</html>
Avatar billede hrole Mester
19. oktober 2009 - 23:33 #6
tjens: jeg kan nu ikke lige få det til at fungere, men vil kikke nærmere på det...
Avatar billede tjens Nybegynder
20. oktober 2009 - 09:58 #7
Hvis du gemmer ovenstående direkte i en .html-fil vil jeg da mene, at det virker:
Jeg har testet i FF, MSIE6 og 8, Chrome og Opera.
Avatar billede hrole Mester
20. oktober 2009 - 18:11 #8
du har ret! JEg har blot problemer med at få det tilpasset min kode (se ovenstående).
Avatar billede hrole Mester
20. oktober 2009 - 18:17 #9
det er specielt etablering til databasen og udtræk af rækkerne jeg er i tvivl om, men antager det skal ske her:
function setForm(data) {
    var ar = data.split("#");
    document.getElementById("fornavnID").value = ar[0];
    document.getElementById("efternavnID").value = ar[1];
    document.getElementById("hiddenID").value = ar[2];
    document.getElementById("gemID").value = "ændre " + ar[0] + " " + ar[1];
}
Avatar billede tjens Nybegynder
20. oktober 2009 - 18:31 #10
Nej, du skal slet ikke lave noget i javascript delen.

Dit eksisterende while-loop på query_sidste data skal bare have echo-delen tilpasset til at spytte linier ud som bliver som denne:
Hans Hansen <a href="#" onclick="setForm('Hans#Hansen#101');" return false;> (ret)</a><br>
Avatar billede hrole Mester
20. oktober 2009 - 18:52 #11
Hmm, IE melder fejl (5 stk.) i følgende linie (tegn 13):

Koden:
echo $row['Fornavn'].' '.$row['Efternavn'].'<a href="#" onclick="setForm('.$row['Fornavn'].'#'.$row['Efternavn'].'#'.$row['Id'].');" return false;> (ret)</a>'.'<br />';

Vis kilde:
mads Madsen<a href="#" onclick="setForm(mads#Madsen#58);" return false;> (ret)</a><br />mads Madsen<a href="#" onclick="setForm(mads#Madsen#57);" return false;> (ret)</a><br />mads Madsen<a href="#" onclick="setForm(mads#Madsen#56);" return false;> (ret)</a><br />mads Madsen<a href="#" onclick="setForm(mads#Madsen#55);" return false;> (ret)</a><br />mads Madsen<a href="#" onclick="setForm(mads#Madsen#54);" return false;> (ret)</a><br />
Avatar billede tjens Nybegynder
20. oktober 2009 - 19:08 #12
Der er da også en fejl i mine linier:

Det anførselstegn der afslutter onclick attributten skal stå efter return false;:

mads Madsen<a href="#" onclick="setForm(mads#Madsen#57);  return false;"> (ret)</a><br>

Mærkeligt at det ikke har givet fejl i min egen test.
Avatar billede hrole Mester
20. oktober 2009 - 19:31 #13
Jeg får stadig samme fejlmeddelelser, desværre.
Avatar billede hrole Mester
20. oktober 2009 - 20:10 #14
Er der ikke en fejl i denne?

<td><input type="hidden" name="id" id="hiddenID" value="0" type="text" /></td>
Avatar billede tjens Nybegynder
20. oktober 2009 - 20:21 #15
Der mangler apostrof om parameteren så det bliver en string:

onclick="setForm(mads#Madsen#57); return false;"
skal ændres til
onclick="setForm( 'mads#Madsen#57' ); return false;"

Så håber jeg bare at PHP ikke driller for meget når der skal outputtes apostroffer :-)
Avatar billede hrole Mester
20. oktober 2009 - 20:27 #16
Hmm, jeg havde:
echo $row['Fornavn'].' '.$row['Efternavn'].'<a href="#" onclick="setForm('.$row['Fornavn'].'#'.$row['Efternavn'].'#'.$row['Id'].');" return false;> (ret)</a>'.'<br />';

og får fejl hvis jeg ændre til
echo $row['Fornavn'].' '.$row['Efternavn'].'<a href="#" onclick="setForm(''.$row['Fornavn'].'#'.$row['Efternavn'].'#'.$row['Id'].'');" return false;> (ret)</a>'.'<br />';
Avatar billede hrole Mester
20. oktober 2009 - 20:28 #17
der er i ovenstående tilføjet en apostrof efter ( og før )
Avatar billede tjens Nybegynder
20. oktober 2009 - 20:40 #18
Det var det jeg mente med PHP drilleri:

Skal du ikke have 3 i træk for at få en apostrof i strengen og samtidig afslutte den?

Vis show source fra browseren også.
Avatar billede hrole Mester
20. oktober 2009 - 20:43 #19
De skal selvfølgelig escapes:
echo $row['Fornavn'].' '.$row['Efternavn'].'<a href="#" onclick="setForm(\''.$row['Fornavn'].'#'.$row['Efternavn'].'#'.$row['Id'].'\');" return false;> (ret)</a>'.'<br />';

Så virker det. Mange tak for hjælpen tjens, smid svar.
Avatar billede tjens Nybegynder
20. oktober 2009 - 20:47 #20
SVAR.

PS: i stedet for link, kan du evt lave en knap der står 'ret' på.
onclick bliver det samme.
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