![]() |
php loop formulär variabler problem
Hej!
Jag tor jag har målat in mig i en hörna lite gran och vill höra om der fins någon som har ett förslag. Jag har i ett formulär loopat fram en serie fält. for ( $x=1; $x <= 8; $x ++) { echo' <input type="text" name="ingrediens'.$x.'" style="width:165px;height:13px;margin:2px;"/><br> ';} sen vill jag loopa igenom dem igen när formen är skickad för att se om de är i fyllda och är de ifyllda ska de läggas i i DB. Hur får jag fram värdet i variablen $ingrediens1 till $ingrediens8 undrar jag då. Jag har extract $_POST. for ( $x=1; $x <= 8; $x ++) { $xingrediens=$ingrediens.$x; //problemet......... if(!empty($xingrediens)){ $sql = "INSERT INTO tblIngrediens SET ingrediens='$xingrediens'"; mysql_query($sql) or die("Det har uppstått ett fel:" . mysql_error()); }//end if }//end for loop Är jag på helt fel spår eller? |
Citat:
Citat:
$sql = "INSERT INTO tblIngrediens SET ingrediens='".mysql_real_escape_string($xingredien s)."'"; |
Tack för svaret
Varför är det Livsfarligt? vad gör mysql_real_escape_string. |
Det finns lyckligtvis bättre sätt att jobba med många fält. Du kan ha input-fält med samma namn deklarerat som en array.
<form> <input type="text" name="ingrediens[]"> <input type="text" name="ingrediens[]"> <input type="text" name="ingrediens[]"> </form> foreach ($_POST['ingrediens'] as $value) { // Gör vad du ska med ingrediensen som nu är i $value. Exempelvis if (trim($value) != '') { $value = mysql_real_escape_string($value); // Skapa insert/update/whatever } } Mysql-api:et är kanske inte det optimala heller. Kolla mysqli-apiet eller PDO. Om du loopande ska lägga in data i en databas borde du också förbereda (prepare) ett sql-statement som då får bättre prestanda och slipper riskera att missa mysql_real_escape_string edy. Exempel med PDO mot MySQL: $dsn = 'mysql:dbname=receptdb;host=localhost'; $dbUser = 'receptanv'; $dbPassword = 'hemligtlösenord'; $dbh = new PDO($dsn, $dbUser, $dbPassword); $stmt = $dbh->prepare('INSERT tblIngrediens (ingrediens) VALUES(:ingrediens)'; foreach ($_POST['ingrediens'] as $value) { $stmt->execute(array(':ingrediens', trim($value)); } Sen antar jag att du i verkligheten har en del annat som kopplar ihop ingredienserna mot ett recept. Men det lägger inte jag mig i ;) Innan du fortsätter så läs mer om PDO på http://se2.php.net/manual/en/book.pdo.php |
Utan att vara elak är det lite läskigt att du behöver fråga om vad mysql_real_escape_string() gör eller varför din kod ovan är farlig. Du behöver troligen läsa på lite om sql injections och säkerhet så slipper du problem i framtiden.
Men kör med PDO och prepared statements enligt ovan så är du mer säker. |
Ska jag göra, jag får läsa på lite imorgon. Tack för hjälpen.
|
Om man skickar data angiven av användare rakt in i databasen går det att utifrån skicka vilka kommandon man vill till databasen.
T.ex. om någon skriver följande i formuläret: '; DELETE FROM tblIngrediens WHERE 'a'='a Så kommer följande skickas till databasen: INSERT INTO tblIngrediens SET ingrediens=''; DELETE FROM tblIngrediens WHERE 'a'='a' Det kallas SQL injection. http://en.wikipedia.org/wiki/SQL_injection mysql_real_escape_string() byter ut t.ex. ' mot \' så att databasen vet att ' är en del av texten, och inte avslut på strängen. Man bör absolut använda mysql_real_escape_string() även om det bara är admin som har tillgång till formuläret. Tillägg: Se även http://se2.php.net/manual/en/functio...ape-string.php |
Bra sammanfattning. Jag brukar dock använda mig av pdo:s prepared statements enligt ovan. Då görs detta automatiskt när värden binds mot sql-satsens platshållare. Om man inte använder prepared statements så används pdo:s quote(). Enligt exemplet ovan:
$dbh = new PDO($dsn, $dbUser, $dbPassword); $quoted_value = $dbh->quote($value); |
Citat:
Tycker det är lite överdrivet att säga att det är läskigt att Fia inte har koll på säkerheten. Att inte tänka på säkerheten är ett av de absolut vanligaste misstagen nybörjare gör, oavsett språk. Det är ingenting de flesta bryr sig om i början och det kanske inte är så allvarligt egentligen. Fia, lek lite med koden och ha kul och börja sedan läsa på om säkerheten när du känner att du vill börja programmera lite mer på allvar. Det finns mer än bara sql injections du bör tänka på då. |
Dålig formulering från min sida kanske. Jag sa ju att jag inte var elak. Däremot är det ett stort problem att alla tutorials för nybörjare totalt ignorerar säkerhet. Det är inte nybörjarnas fel.
Jo metoden spelar roll. Använder du konsekvent prepared statements i PDO så slipper du komma ihåg saker som mysql_real_escape_string() på varje inkommande variabel, vare sig det är saker som kommer genom $_GET, $_POST, $_COOKIE eller $_SERVER eller från annan källa. Det är väl ett plus om något! Det gäller att välja rätt väg från början så att man kan vara lite lat :) Därför la jag också med ett komplett exempel på hur man går tillväga med PDO:s prepared statements. Åt andra hållet ska man alltid använda htmlspecialchars() m fl metoder innan man visar data som kommer från extern källa på en webbsida. Att första leka lite och sen tänka på säkerheten gör det kanske lite roligare i i början men är kanske inte alltid så bra. Det är faktiskt bara några enkla regler man behöver ha i åtanke för att täcka det mesta - inte allt men det viktigaste. Gör man det från början är man såå tacksam när man ska mecka i sina gamla grejer som börjat leva sina egna liv. Bra vanor grundlägger man inte genom att börja med slarv ;) |
Alla tider är GMT +2. Klockan är nu 05:04. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson