webForumDet fria alternativet

Kan inte uppdatera databas

PHPur PHP

8 svar · 1 232 visningar · startad av SoulGod

Medlem sedan aug. 20051 200 inlägg
Frågan#1

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?

Medlem sedan juni 20019 519 inlägg
#2

Du sätter SET före du kör WHERE:

"UPDATE nyhet SET titel='$titel', nyhet='$nyhet' WHERE ID = $id"
Medlem sedan juni 200032 969 inlägg
#3

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

Medlem sedan juni 20014 290 inlägg
#4

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.

Medlem sedan feb. 20034 441 inlägg
#5

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

Medlem sedan aug. 20051 200 inlägg
#6

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');
 }
Medlem sedan feb. 20034 441 inlägg
#7

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.

Medlem sedan juni 20014 290 inlägg
#8

Och om man inte vill ändra allt för mycket så kan man göra:

$_POST['id'] = safesql($_POST['id']);
Medlem sedan nov. 2006188 inlägg
#9

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å.

128 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)