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ä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ä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 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 Och:
- Du ska inte ha apostrofer runt fältnamnen i SQL-frågan.
- 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 . "'");
- Du måste skydda dig mot SQL injection.
mvh
Tack, änglar! Nu funkar det!
@ndersMedlem sedan juni 200032 969 inlägg 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 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 Bra där, drew. Jag kan inte php egentligen - jag bara fuskar. :)
$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.
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 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.