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
<?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
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
nå,
unset($_SESSION["posts"]);
Skrevet man. d. 19. marts 2007 kl. 08:54:47| #4
Skrevet man. d. 19. marts 2007 kl. 09:03:06| #5
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
Den kan sikkert blive dybere!
Måske ikke lige i vores verden, men .....
Skrevet man. d. 19. marts 2007 kl. 09:15:41| #7
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Nemlig: Hvad er det du siger der ikke virker endnu?
Skrevet man. d. 19. marts 2007 kl. 18:43:01| #26
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
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
ingen point til mig, ellers tak
Skrevet lør. d. 11. august 2007 kl. 17:38:39| #30
Sorry - havde glemt at lukke.
Skrevet søn. d. 12. august 2007 kl. 11:48:52| #31