Oprettet man. d. 19. marts 2007 kl. 08:24:27

nemlig
nemlig (5.151 point. Point ude: 0)

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??

Skrevet man. d. 19. marts 2007 kl. 08:51:30| #1

showsource
showsource (32.621 point)
<?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"]);

Skrevet man. d. 19. marts 2007 kl. 08:52:03| #2

jakobdo
jakobdo (181.727 point)
www.codebreaker.dk
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...

Skrevet man. d. 19. marts 2007 kl. 08:53:34| #3

showsource
showsource (32.621 point)
nå,
unset($_SESSION["posts"]);

Skrevet man. d. 19. marts 2007 kl. 08:54:47| #4

showsource
showsource (32.621 point)
he, enige .....

Skrevet man. d. 19. marts 2007 kl. 09:03:06| #5

jakobdo
jakobdo (181.727 point)
www.codebreaker.dk
Showsource: Tror faktisk det er et trick du har lært mig tidligere, og det virker, så hvorfor opfinde den dybe tallerken! :o)

Skrevet man. d. 19. marts 2007 kl. 09:09:54| #6

showsource
showsource (32.621 point)
Den kan sikkert blive dybere!
Måske ikke lige i vores verden, men .....

Skrevet man. d. 19. marts 2007 kl. 09:15:41| #7

nemlig
nemlig (5.151 point)
Det ser spændende ud - jeg kommer først til at arbejde med det senere i dag.

Skrevet man. d. 19. marts 2007 kl. 09:58:33| #8

nemlig
nemlig (5.151 point)
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??

Skrevet man. d. 19. marts 2007 kl. 10:12:43| #9

jakobdo
jakobdo (181.727 point)
www.codebreaker.dk
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]);
    }
}

Skrevet man. d. 19. marts 2007 kl. 11:08:26| #10

nemlig
nemlig (5.151 point)
og i Fil2 sletter jeg mit Session-array og anvender mysql-update på sædvanlig vis med
UPDATE tabelnavn SET navn='".$_POST['navn']."', osv.

Skrevet man. d. 19. marts 2007 kl. 11:44:29| #11

jakobdo
jakobdo (181.727 point)
www.codebreaker.dk
Ja!
Dog vil jeg ikke anbefale at du bruge $_POST['felt_navn'] direkte i en sql.
Det kan udnyttes til SQL injections.

Skrevet man. d. 19. marts 2007 kl. 12:08:57| #12

nemlig
nemlig (5.151 point)
Undskyld min begrænsede viden.
Men hvad er SQL-injections, og har du et bud på, hvordan det så skal gøres???

Skrevet man. d. 19. marts 2007 kl. 13:08:14| #13

nemlig
nemlig (5.151 point)
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"]);
}

Skrevet man. d. 19. marts 2007 kl. 13:09:21| #14

jakobdo
jakobdo (181.727 point)
www.codebreaker.dk
http://en.wikipedia.org/ (...)

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.

Skrevet man. d. 19. marts 2007 kl. 13:19:43| #15

johan.o
johan.o (23.338 point)
jakobdo --> Hvorfor virker mysql_real_escape_string ikke mod select/delete/update ?

Mvh. Johan

Skrevet man. d. 19. marts 2007 kl. 13:26:21| #16

jakobdo
jakobdo (181.727 point)
www.codebreaker.dk
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

Skrevet man. d. 19. marts 2007 kl. 13:55:38| #17

nemlig
nemlig (5.151 point)
Mon der er et bud på, hvad der går galt jf. min kommentar 4 afsnit oppe.

Skrevet man. d. 19. marts 2007 kl. 14:03:24| #18

johan.o
johan.o (23.338 point)
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

Skrevet man. d. 19. marts 2007 kl. 14:05:05| #19

johan.o
johan.o (23.338 point)
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

Skrevet man. d. 19. marts 2007 kl. 14:19:42| #20

johan.o
johan.o (23.338 point)
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

Skrevet man. d. 19. marts 2007 kl. 14:24:57| #21

johan.o
johan.o (23.338 point)
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

Skrevet man. d. 19. marts 2007 kl. 15:07:38| #22

jakobdo
jakobdo (181.727 point)
www.codebreaker.dk
Gå lige amok johan.o. Har du bare kode på hylden lige til at tage ned og spamme med? :oD

Skrevet man. d. 19. marts 2007 kl. 15:20:21| #23

johan.o
johan.o (23.338 point)
he he...ja det blev vist lidt meget, men forhåbentligt kan det bruges til noget :)

Mvh. Johan

Skrevet man. d. 19. marts 2007 kl. 17:48:53| #24

nemlig
nemlig (5.151 point)
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.

Skrevet man. d. 19. marts 2007 kl. 18:02:19| #25

jakobdo
jakobdo (181.727 point)
www.codebreaker.dk
Nemlig: Hvad er det du siger der ikke virker endnu?

Skrevet man. d. 19. marts 2007 kl. 18:43:01| #26

nemlig
nemlig (5.151 point)
Jakobdo eller showsource:
Vil en af jer kontakte mig på MSN eller email: nemlig10@hotmail.com
Jeg har et forslag......

Skrevet søn. d. 10. juni 2007 kl. 16:05:32| #27

nemlig
nemlig (5.151 point)
Send I forresten ikke lige et svar, så jeg kan lukke.

Skrevet søn. d. 10. juni 2007 kl. 19:11:36| #28


Skrevet tir. d. 12. juni 2007 kl. 01:57:52| #29

showsource
showsource (32.621 point)
ingen point til mig, ellers tak

Skrevet lør. d. 11. august 2007 kl. 17:38:39| #30

nemlig
nemlig (5.151 point)
Sorry - havde glemt at lukke.

Skrevet søn. d. 12. august 2007 kl. 11:48:52| #31


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Brugerliste med link til profil

Oprettet den 26. maj 2012 kl. 14.29
sayn giver 30 point for svar | Giv et svar »

php curl driller

Oprettet den 26. maj 2012 kl. 08.31
PHPnQrd giver 200 point for svar | Giv et svar »

Array i array

Oprettet den 25. maj 2012 kl. 08.32
sebster giver 60 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger