Avatar billede nemlig Professor
19. marts 2007 - 08:24 Der er 30 kommentarer og
1 løsning

Husk indtastningerne i form

Hej. Jeg har en input form, hvor der sker følgende:
1. Jeg henter nogle felter fra MySQL og smider i nogle input-felter via "value".
2. Når der trykkes submit, åbnes ny fil, hvor der kontrolleres for fejlindtastninger, og hvis ingen fejl, så gemmes rettelserne.
3. Hvis der er fejl, så kan jeg via en "retur knap, rette felterne.

Men systemet husker ikke rettelserne, når jeg går tilbage.
Derfor gør jeg følgende i min input-form:

<input type='text' name='navn' value='"; if($_SESSION['array2'][4] == '') { echo $row['navn']; } else { echo $_SESSION['array2'][4]; }  echo "' class=form size=40>


Og så definerer jeg et array i filen som kaldes ved submit:

$array = array($_POST['navn']);
$_SESSION['array'] = $array;

Det virker, men jeg har det problem, at hvis jeg i formen sletter indholdet i et felt, trykker submit og der konstateres en fejl, så går den tilbage igen, men viser det oprindelige indhold (det som jeg havde fjernet). Det kan jeg også godt forstå, da jeg i "value" tjekker for, om der er indhold i Session-variablen. Indholdet er jeg netop fjernet, hvorfor value sættes til "row[navn]".

Kan ikke gennemskue, hvad der skal gøres, for at den også fanger, hvis jeg har fjernet indholdet i et felt??
Avatar billede showsource Seniormester
19. marts 2007 - 08:51 #1
<?php

if($_SERVER["REQUEST_METHOD"] == "post" && isset($_COOKIE[session_name()])) {
// hvis post og cookies er accepteret, ( og siden er set en gang min., default for PHP at sætte en cookie ved session_start() )

foreach($_POST as $key => $value) {

    if(trim($value) == "") {
    continue;
    }

$_SESSION["posts"][$key] = $value;

}


Tjek her om en bestemt eller flere sessions er sat, og har en gyldig værdi ......


header("Location:". $_SERVER["PHP_SELF"]); // tilbage til fil som der blev postet fra
exit;
}

I din formular kan du bruge en function til at skrive det som tidligere blev skrevet:

echo"<input type='text' name='navn' value='". fieldvalue("navn") ."'>";

function fieldvalue($name) {
    if(isset($_SESSION["posts"][$name])) {
    echo htmlspecialchars($_SESSION["posts"][$name]);
    }
}

Og i bunden af doc med formular, bruge

unset($_SESSION"posts"]);
Avatar billede jakobdo Ekspert
19. marts 2007 - 08:52 #2
Det du skal gøre, et at lave følgende funktion:

foreach($_POST AS $name => $value)
{
$_SESSION['post'][$name] = $value;
}

Den skal kaldes lige i toppen af din POST kode.

Når du så skal bruge data i din form, så skal du bruge: $_SESSION['post']['navn']

Osv...
Avatar billede showsource Seniormester
19. marts 2007 - 08:53 #3
nå,
unset($_SESSION["posts"]);
Avatar billede showsource Seniormester
19. marts 2007 - 08:54 #4
he, enige .....
Avatar billede jakobdo Ekspert
19. marts 2007 - 09:03 #5
Showsource: Tror faktisk det er et trick du har lært mig tidligere, og det virker, så hvorfor opfinde den dybe tallerken! :o)
Avatar billede showsource Seniormester
19. marts 2007 - 09:09 #6
Den kan sikkert blive dybere!
Måske ikke lige i vores verden, men .....
Avatar billede nemlig Professor
19. marts 2007 - 09:15 #7
Det ser spændende ud - jeg kommer først til at arbejde med det senere i dag.
Avatar billede nemlig Professor
19. marts 2007 - 09:58 #8
Lige en ting, så jeg er forberedt, når jeg kommer til at "lege" med koderne:

Jeg har jo 2 filer:
Fil1: Som indeholder formen
Fil2: Som tjekker fejl, evt. returnerer til fil1, hvis fejl, ellers gemmes i MySQL.

Skal jeg slet ikke have noget kode i Fil2. Altså, jeg skal slette mit Session array.
Og når jeg så gemmer i MySQL bruger jeg som nu: $_POST['navn'] osv.

Jeg er ikke helt med på, hvor funktionen "fieldvalue" skal stå i fil1. Skal den stå inde i formen nederst??
Avatar billede jakobdo Ekspert
19. marts 2007 - 10:12 #9
Jo, du skal smide denne kode i fil2:

foreach($_POST as $key => $value) {

    if(trim($value) == "") {
    continue;
    }

$_SESSION["posts"][$key] = $value;

}

Og dette i fil1:

echo"<input type='text' name='navn' value='". fieldvalue("navn") ."'>";

function fieldvalue($name) {
    if(isset($_SESSION["posts"][$name])) {
    echo htmlspecialchars($_SESSION["posts"][$name]);
    }
}
Avatar billede nemlig Professor
19. marts 2007 - 11:08 #10
og i Fil2 sletter jeg mit Session-array og anvender mysql-update på sædvanlig vis med
UPDATE tabelnavn SET navn='".$_POST['navn']."', osv.
Avatar billede jakobdo Ekspert
19. marts 2007 - 11:44 #11
Ja!
Dog vil jeg ikke anbefale at du bruge $_POST['felt_navn'] direkte i en sql.
Det kan udnyttes til SQL injections.
Avatar billede nemlig Professor
19. marts 2007 - 12:08 #12
Undskyld min begrænsede viden.
Men hvad er SQL-injections, og har du et bud på, hvordan det så skal gøres???
Avatar billede nemlig Professor
19. marts 2007 - 13:08 #13
Nu har jeg prøvet, men når jeg indlæser min fil1 med inputfelterne, viser den i navne-inputformen [". fieldvalue("navn") ."] (dog ikke klammerne).
Jeg var i tvivl om, hvor funktionen skulle placeres. Jeg har placeret den lige under input-felterne - altså før "Submit-knappen"
¨
Og føglende kode er placeret i fil2 øverst:

if($_SERVER["REQUEST_METHOD"] == "post" && isset($_COOKIE[session_name()])) {

foreach($_POST as $key => $value) {
    if(trim($value) == "") {
    continue;
    }
$_SESSION["posts"][$key] = $value;
}
header("Location:". $_SERVER["PHP_SELF"]);
}
Avatar billede jakobdo Ekspert
19. marts 2007 - 13:09 #14
http://en.wikipedia.org/wiki/SQL_injection

Og man kan f.eks. bruge:

//Virker til heltal
if(is_numeric($_POST['tal']))
{
$tal = intval($_POST['tal']);
}

//En streng:
$streng = mysql_real_escape_string($_POST['streng']);

Dog kan mysql_real_escape_string() ikke hjælpe mod dem som forsøger at smide select/delete/update ind.
Avatar billede johan.o Nybegynder
19. marts 2007 - 13:19 #15
jakobdo --> Hvorfor virker mysql_real_escape_string ikke mod select/delete/update ?

Mvh. Johan
Avatar billede jakobdo Ekspert
19. marts 2007 - 13:26 #16
Fordi select/delete/update vil jo stadig optræde i SQL'en.

Jeg tænker på hvis select/delete/update kommer med som værdi i POST!

Jeg kan godt se det kan misforståes det jeg skrev. :o)
Ikke at den ikke virker på en SQL, som starter med select/delete/update
Avatar billede nemlig Professor
19. marts 2007 - 13:55 #17
Mon der er et bud på, hvad der går galt jf. min kommentar 4 afsnit oppe.
Avatar billede johan.o Nybegynder
19. marts 2007 - 14:03 #18
Der er ikke umiddelbart noget i vejen med at ord som select/delete/update optræder i en SQL query, det er blot vigtigt at de fratages deres funktionalitet. Det kan gøres ved altid at huske ' omkring værdierne i SQL sætningerne. F.eks.:

mysql_query("SELECT * FROM tbl WHERE id='".$_POST['oVar']."'");

hvis brugeren så skriver f.eks. "DELETE * FROM tbl" ser vores query sådan her ud

mysql_query("SELECT * FROM tbl WHERE id='DELETE * FROM tbl'");

og den er ganske ufarlig da der blot søges efter et id der hedder 'DELETE * FROM tbl'. Så husk altid ' eller " omkring værdierne i SQL sætninger......MEN.....

hvad nu hvis brugeren skriver "' DELETE * FROM tbl '" så ser det således ud

mysql_query("SELECT * FROM tbl WHERE '' DELETE * from tbl ''");

og det er absolut ikke ufarligt og derfor tilføjer vi endnu en sikkerheds feature nemlig mysql_real_escape_string(). Denne funktion 'escaper' ' og " således at de ikke kan 'bryde' din query, men blot tolkes som en del af værdien.

mysql_query("SELECT * FROM tbl WHERE id='".mysql_real_escape_query($_POST['ovar'])."'");

medfører

mysql_query("SELECT * FROM tbl WHERE id='\' DELETE * FROM tbl \''");

og hvis ellers exp.dk tillader alle disse tegn :), så skulle queryen være ganske ufarlig.

Og til sidst er det altid vigtigt at man checker indholdet af de variabler brugerne sender til scriptet. Hvis du kun forventer tal, så check som jakobdo viser, at det kun er tal der sendes, hvis du kun forventer bogstaver fra a-z så check efter det...osv. osv. osv. check check check til du bliver blå i hovedet. Selv den mest simple kode kan blive temmelig omfattende når alle sikkerheds check medtages, men lad være med at springe over, husk det altid.

Mvh. Johan
Avatar billede johan.o Nybegynder
19. marts 2007 - 14:05 #19
nemlig --> Jeg har ikke umiddelbart nogen ide om hvordan du løser dit problem, men håber at ovenstående kan hjælpe dig i forhold til SQL injections.

Og det er muligt at der er små syntaks fejl i ovenstående, men meningen er vist rimelig klar :)

Mvh. Johan
Avatar billede johan.o Nybegynder
19. marts 2007 - 14:19 #20
nemlig --> Jeg bruger normalt en lidt anden fremgangsmåde i forbindelse med form's og php. Dette lille eksempel kan måske hjælpe dig lidt hvis du vil prøve at gribe det an på en anden måde. Men den måde showsource og jakobdo viser er ganske sikkert udemærket så opfat blot dette som et alternativ.

<?php

// --> Define variables <-- //

$oVar="";
$oMsg="";

// --> Check POST data <-- //

if(isset($_POST['oVar'])) {
if($_POST['oVar']!="") {
  if($_POST['oVar']=="Ko" || $_POST['oVar']=="Gnu") {
  $oVar=$_POST['oVar']; }
  else {
  $oMsg="Tsk tsk Ko eller Gnu, hvor svært kan det være :-)"; } }
else {
  $oMsg="Du skal da skrive noget."; } }

// --> Create HTML output <-- //

$oPut="<html>
<body>
<form action='' method='POST'>
<p>Skriv Ko eller Gnu :</p>
<input type='text' name='oVar' value='".$oVar."'>
<input type='submit' value='send'>
</form>
<p>".$oMsg."</p>
</body>
</html>";

// --> Output output <-- //

echo $oPut;

?>

Hvis du har spørgsmål så bare fyr løs :)

Mvh. Johan
Avatar billede johan.o Nybegynder
19. marts 2007 - 14:24 #21
He he...nu sidder jeg lige og 'småtænker' over $_SESSION løsningen og den har selvfølgelig en god lille feature som ovenstående ikke har. Hvis du går væk fra formularen og kommer tilbage igen, så husker den stadig hvad der stod....men det kan vel egentlig både være en fordel og en ulempe....men ganske brugbart i visse tilfælde :)

Mvh. Johan
Avatar billede jakobdo Ekspert
19. marts 2007 - 15:07 #22
Gå lige amok johan.o. Har du bare kode på hylden lige til at tage ned og spamme med? :oD
Avatar billede johan.o Nybegynder
19. marts 2007 - 15:20 #23
he he...ja det blev vist lidt meget, men forhåbentligt kan det bruges til noget :)

Mvh. Johan
Avatar billede nemlig Professor
19. marts 2007 - 17:48 #24
Til Jakobdo eller showsource:
Håber at en af jer vil give en tilbagemelding på mit problem, nemlig at jeg ikke har fået det til at virke. I mit 2. sidste indlæg skriver jeg, hvad jeg har gjort.
Håber meget på, at en af jer lige vil give de sidste tjek.
Og tak for de øvrige kommentarer og inspiration til sikker håndtering af MySQL.
Avatar billede jakobdo Ekspert
19. marts 2007 - 18:02 #25
Nemlig: Hvad er det du siger der ikke virker endnu?
Avatar billede nemlig Professor
19. marts 2007 - 18:43 #26
Jakobdo eller showsource:
Vil en af jer kontakte mig på MSN eller email: nemlig10@hotmail.com
Jeg har et forslag......
Avatar billede nemlig Professor
10. juni 2007 - 16:05 #27
Send I forresten ikke lige et svar, så jeg kan lukke.
Avatar billede jakobdo Ekspert
10. juni 2007 - 19:11 #28
Svar!
Avatar billede showsource Seniormester
12. juni 2007 - 01:57 #29
ingen point til mig, ellers tak
Avatar billede nemlig Professor
11. august 2007 - 17:38 #30
Sorry - havde glemt at lukke.
Avatar billede jakobdo Ekspert
12. august 2007 - 11:48 #31
Takker for point.
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