MHZMedlem sedan apr. 200555 inlägg
Hur ska man göra för att få det rätt? 'userID' och 'updateUser' ger rätt värde men det skriver inte till mysql databasen.
include "conn.php";
$userID = intval($_GET['id']);
$updateUser = $_POST['username'];
$sql = "UPDATE members SET user = '$updateUser' where id = $userID";
metalboyMedlem sedan jan. 2005870 inlägg
Har du mer kod? I den koden du visar exekverar du aldrig SQL-frågan.
MHZMedlem sedan apr. 200555 inlägg
Ja nu såg jag. Är nybörjare som du förstår. Tackar :)
$sql = "UPDATE members SET user = '$updateUser', pass = '$updatePass' where id = $userID";
$result = mysql_query($sql);
header("Location: register.php?action=user");
exit;
cascaMedlem sedan feb. 20003 262 inlägg
Du borde verkligen inte passa POST-data direkt in i SQL-satsen. Vad händer om nån postar:
'; DROP TABLE members; #
i $_POST['username']?
metalboyMedlem sedan jan. 2005870 inlägg
Jag tycker att du ska läsa på om PDO och/eller mysqli. mysql-funktionerna i PHP är deprecated. Det betyder att de kommer att tas bort ur PHP i någon relativt närstående version.
Det är kanske en lite högre inlärningströskel, speciellt för PDO som är enbart objektorienterad, men det är det värt. Dels för att framtidssäkra din kod, men också ur säkerhetssynpunkt då PDO och mysqli har stöd för prepared statements som ger skydd mot SQL injections som casca gav prov på här ovanför.
Edit:
http://www.php.net/pdo
http://www.php.net/mysqli
MHZMedlem sedan apr. 200555 inlägg
Vad tror ni om denna variant?
function DoSafe($string)
{
$string = mysqli_real_escape_string($conn, $string);
return $string;
}
$userID = intval($_GET['id']);
$updateUser = DoSafe($_POST['username']);
$updatePass = DoSafe($_POST['userpass']);
$updateNiva = DoSafe($_POST['userniva']);
$updateMail = DoSafe($_POST['usermail']);
$sql = "UPDATE members SET user = '$updateUser', pass = '$updatePass', niva = '$updateNiva', email = '$updateMail' where id = $userID";
$result = $conn->query($sql);
header("Location: register.php?action=user");
exit;
metalboyMedlem sedan jan. 2005870 inlägg
Klart mycket säkrare, dock borde det generera ett felmeddelande. Du behöver deklarera $conn som global för att kunna använda den i funktionen DoSafe, alternativt skicka med $conn som argument till funktionen. Jag skulle föredra att skicka med $conn som argument till funktionen.
Eftersom $conn är en instans av klassen mysqli kan du använda den som ett objekt.
function DoSafe($conn, $string) {
return $conn->real_escape_string($string);
}
Läs gärna på om prepared statements i PHP-manualen. Då skulle du slippa DoSafe-funktionen, eftersom prepare fixar så att datat är säkert.
Med ett prepared statement skulle det kunna se ut så här:
$stmt = $conn->prepare('UPDATE members SET user=?, pass=?, niva=?, email=? WHERE id=?');
$stmt->bind_param('ssssi', $_POST['username'], $_POST['userpass'], $_POST['userniva'], $_POST['usermail'], $_GET['id']);
$stmt->execute();
http://php.net/manual/en/mysqli.prepare.php
Edit: En liten miss i bind_param()
MHZMedlem sedan apr. 200555 inlägg
En fråga. Detta gäller väl enbart vid update, skapande av ny user mm där man kan skriva till databasen. När man tex läser ut users behövs det väl inte?
ex
include "conn.php";
$id = intval($_GET['id']);
$sql = 'SELECT * FROM members WHERE id = ?';
if($stmt = $conn->prepare($sql))
{
$stmt->bind_param('i',$id);
$stmt->execute();
$stmt->store_result();
$num_of_rows = $stmt->num_rows;
$stmt->bind_result($id, $user, $pass, $niva, $email);
while ($stmt->fetch())
{
echo 'ID: '.$id.'<br>';
echo 'Namn: '.$user.'<br>';
echo 'Lösenord: '.$pass.'<br>';
echo 'Nivå: '.$niva.'<br>';
echo 'E-Mail: '.$email.'<br>';
}
$stmt->free_result();
$stmt->close();
}
$conn->close();
Och svaret på hela frågan blir då
$userID = intval($_GET['id']);
$updateUser = $_POST['username'];
$updatePass = $_POST['userpass'];
$updateNiva = $_POST['userniva'];
$updateMail = $_POST['usermail'];
$stmt = $conn->prepare('UPDATE members SET user=?, pass=?, niva=?, email=? WHERE id=?');
$stmt->bind_param('ssssi', $updateUser, $updatePass, $updateNiva, $updateMail, $userID);
$stmt->execute();
header("Location: register.php?action=user");
exit;
Är jag rätt nu :)
metalboyMedlem sedan jan. 2005870 inlägg
Det viktiga är att du inte skickar in data direkt från användaren till SQL-frågan, oavsett om SQL-frågan är en SELECT, UPDATE, INSERT, DELETE eller vad det nu är. Kommer datat från något som användaren kan påverka (som POST, GET eller COOKIE) så måste du se till att datat är säkert och i det format som du förväntar dig (heltal när det ska vara heltal till exempel).
Sen spelar det inte så stor roll vilken metod du väljer för att säkra upp data från användaren. Prepared statements tycker jag är användbart i många fall, men i vissa fall kanske det blir onödigt komplicerat.
Vid en snabb överblick ser det ut som att dina kodblock ska fungera. Eventuellt kanske du vill kontrollera vad prepare respektive execute returnerar så att det fungerar som det är tänkt :)