webForumDet fria alternativet

Jag kan inte uppdatera databasen

9 svar · 894 visningar · startad av PollyJuice

PollyJuiceMedlem sedan mars 2006124 inlägg
#1

Hej,

jag försöker skapa ett script som uppdaterar antal timmar man arbetat på ett projekt. Tyvärr så funkar inte det jag har skrivit. Kan någon tala om vad jag gjort för fel?

Javascript-koden:

function redigeraTimmar()
{
	a = xmlhttp.responseXML.documentElement.getElementsByTagName("projekt");
	for (i=0;i<a.length;i++)
	{
	namnet = a[i].getElementsByTagName("namn");
	kalle = namnet[0].firstChild.nodeValue;
	if(kalle == info)
		{
	tiden = a[i].getElementsByTagName("antaltimmar");
	hej = "<form name='form2' method='post' action='sparatimmar.php'>";
	hej += "<label>L&auml;gg till timmar:</label><br>";
	hej += "<input id='namn' type='text' value='" + info + "' size='30'/>";
	hej += "<input id='timmar' type='text' value='" + tiden[0].firstChild.nodeValue + "' size='30'/>";
	hej += "<input id='send' type='submit' value='L&auml;gg till timmar' /></form>";
    document.getElementById('rightcontainer').innerHTML=hej;
		}
	}
}

och så PHP-koden:

<?php
$namnet= $_POST['namn'];
$timmarna= $_POST['timmar'];

$con = mysql_connect("host","användarnamn","lösenord");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("databasnamn", $con);

mysql_query("UPDATE projekt SET 'timmar' = $timmarna WHERE 'namn' = '$namnet'");

mysql_close($con);

?>
The_HulkMedlem sedan juni 20031 837 inlägg
#2

du har inget name-attribut i dina input-taggar.
t.ex

<input id='namn' name='namn' type='text' value='" + info + "' size='30'/>";
@ndersMedlem sedan juni 200032 969 inlägg
#3

Och:

  1. Du ska inte ha apostrofer runt fältnamnen i SQL-frågan.
  2. Du får inte in värdena i SQL-frågan som du har det nu. Jag hade gjort så här:
mysql_query("UPDATE projekt SET timmar = " . $timmarna . " WHERE namn = '" . $namnet . "'");
  1. Du måste skydda dig mot SQL injection.

mvh

PollyJuiceMedlem sedan mars 2006124 inlägg
#4

Tack, änglar! Nu funkar det!

@ndersMedlem sedan juni 200032 969 inlägg
#5

Får du något felmeddelande?

Skriv ut SQL-frågan så du kan se om det är något knas med värdena.

drewMedlem sedan mars 2007845 inlägg
#6

Jag hade skrivit SQL-frågan så här.

mysql_query("UPDATE projekt SET timmar = $timmarna WHERE namn = '$namnet'");

Om du använder vanliga citationstecken (") runt strängen så tolkar php innehållet och du får dit innehållet i variablerna.
Om du använder enkla citationstecken ('), apostrofer, så tolkas strängen inte utan strängen skickas som den är, med variabelnamnen istället för innehållet.

@ndersMedlem sedan juni 200032 969 inlägg
#7

Bra där, drew. Jag kan inte php egentligen - jag bara fuskar. :)

nitro2k01Medlem sedan aug. 20039 342 inlägg
#8
$timmarna = mysql_real_escape_string($timmarna);
$namnet = mysql_real_escape_string($namnet);

mysql_query("UPDATE projekt SET timmar = '$timmarna' WHERE namn = '$namnet'");

Använd mysql_real_escape_string för att skydda dig mot SQL-injektioner, på alla fält, även sådana som du antar bara kommer innehålla nummer, såsom $timmarna i detta fall! Sätt enkel-fnuttar runt alla strängar i frågan, även sådana som du antar bara kommer innehålla nummer!

Kontrollera utöver det att $timmarna är ett nummer, och be användaren fylla i ett annat värde annars.

PollyJuiceMedlem sedan mars 2006124 inlägg
#9

Kan man skriva

$namnet= mysql_real_escape_string($_POST['namn']);

?

Jag har inte tänkt på säkerhetsfrågorna överhuvudtaget, men det skulle definitivt kunna knuffa upp mitt betyg.

drewMedlem sedan mars 2007845 inlägg
#10

Man ska inte köra mysql_real_escape_string() på fält som ska innehålla nummer. Man ska använda intval() om det är ett heltal eller floatval() om den har decimaler.
Enkelfnuttar runt tal kan ge felmess från databasen eller hela frågan kan ignoreras. Sätt inte fnuttar runt tal, försäkra dig om att det verkigen är siffror istället.

Säkerheten är mycket viktig, frågan är inte om någon försöker hacka sig in utan när det händer.

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