SoulGodMedlem sedan aug. 20051 200 inlägg Jag kan inte uppdatera min databas, och anar att jag missar något i min kod ....
if(mysql_real_escape_string($_GET['do']) == "update") {
$titel = mysql_real_escape_string($_POST['titel']);
$nyhet = mysql_real_escape_string($_POST['nyhet']);
$id = $_GET['id'];
$laggTill = "UPDATE nyhet WHERE ID = $id SET titel='$titel', nyhet='$nyhet'";
mysql_query($laggTill) or die("Det gick inte att lägga till information!");
// När allt är sparat, skicka vidare till nyheter
header('Location: nyhet.php');
}
Om jag struntar i update, och testar att skriva ut $titel, $nyhet, $id så skriver den ut allt rätt .... va gör jag fel?
Du sätter SET före du kör WHERE:
"UPDATE nyhet SET titel='$titel', nyhet='$nyhet' WHERE ID = $id"
@ndersMedlem sedan juni 200032 969 inlägg Ditt felmeddelande "Det gick inte..." är inte speciellt informativt för dig. Skriv ut det riktiga felmeddelandet istället med mysql_error().
http://php.net/manual/en/function.mysql-error.php
GunnarDMedlem sedan juni 20014 290 inlägg Gammalt hederligt tips som många missar :)
Vid felsökning sätt in raden:
echo mysql_error();
Efter mysql_query() så får du reda på eventuella felmeddelande från MySQL i klartext, eller sätt det i die() uttrycket.
SoulGod skrev:
....va gör jag fel?
Dels det som voigtann1 säger och dels att $id inte är skyddad mot sqlinjektioner.
Varför kör du mysql_real_eascape_string() på din $_GET['do'] == "update" men inte på den variabel som verkligen kan ställa till stora problem!?
SoulGodMedlem sedan aug. 20051 200 inlägg Tack , det var jag som var trög ...
Och jag hade faktiskt missat det, korkat nog ..
Tur att ni underbara människor är vakna :)
Slutgiltiga blev följande
if(mysql_real_escape_string($_GET['do']) == "update") {
$titel = mysql_real_escape_string($_POST['titel']);
$nyhet = mysql_real_escape_string($_POST['nyhet']);
$id = mysql_real_escape_string($_GET['id']);
// $laggTill = "UPDATE nyhet WHERE ID = $id SET titel='$titel', nyhet='$nyhet'";
$laggTill = "UPDATE nyhet SET titel='$titel', nyhet='$nyhet' WHERE ID = $id";
mysql_query($laggTill) or die("Det gick inte att lägga till information!");
// När allt är sparat, skicka vidare till nyheter
header('Location: nyhet.php');
}
Fortfarande helt onödigt att använda mysql_real_escape_string() på din $_GET['do'], bättre om du läser på lite om det och gör rätt från början, så blir koden bättre optimerad och snyggare.
Bättre och mycket snyggare om du kör en funktion, t.ex. den här:
function safesql($value){
$value = trim($value);
if(get_magic_quotes_gpc()){
$value = stripslashes($value);
}
// check if this function exists
if(function_exists("mysql_real_escape_string")){
$value = mysql_real_escape_string($value);
}else{
// for PHP version < 4.3.0 use addslashes
$value = addslashes($value);
}
return $value;
}
Så är det bara att köra det här där du samlar in GET/POST-data:
$id = safesql($_POST['id']);
Blir dessutom himla lätt att ändra om det skulle behövas, eftersom en ändring i funktionen får effekt på alla dina sidor.
GunnarDMedlem sedan juni 20014 290 inlägg Och om man inte vill ändra allt för mycket så kan man göra:
$_POST['id'] = safesql($_POST['id']);
dwmediaMedlem sedan nov. 2006188 inlägg Själv kör jag en närliggades system som MickeA
Jag gjorde min så här
function db_escape($post)
{
if (is_string($post)) {
if (get_magic_quotes_gpc()) {
$post = stripslashes($post);
}
return mysql_real_escape_string($post);
}
foreach ($post as $key => $val) {
$post[$key] = db_escape($val);
}
return $post;
}
Sedan kör jag överst i typ submit
$_POST = db_escape($_POST);
Så kan du bara använda vanlig post också.