【发布时间】:2021-12-11 16:20:51
【问题描述】:
我正在尝试在我的网站上更改用户信息部分,除了更改用户名部分之外,一切正常。
在这一部分中,我必须检查是否没有使用新用户名,然后更改它(如果尚未使用)。
当我启动我的代码时,它没有在 (echo "username deja utiliser") 之后输入 (else if) 语句。
//change.php
$newUsername = $_POST['changeUsername'];
$newNom = $_POST['changeNom'];
$currentId = $_SESSION['id'];
$currentName = $_SESSION['name'];
//fonction that doesn't work
if(empty($newUsername)){
echo "username is empty";
}else if ($stmt = $con->prepare('SELECT username from users where USERNAME = ? ')) {
$stmt->bind_param('s', $newUsername);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
$stmt->bind_result($checkUsername);
$stmt->fetch();
if ($checkUsername === $newUsername) {
echo "username deja utiliser";
}else if($stmt = $con->prepare("UPDATE users SET USERNAME = '$newUsername' WHERE ID = ? ")){
$stmt->bind_param('s', $currentId);
$stmt->execute();
echo "les valeur on été modifier";
session_regenerate_id();
$_SESSION['name'] = $newUsername;
}else{
echo "les valeurs n'ont pas été modifier";
}
}
}
//function that works
if(empty($newNom)){
echo "nom is empty";
}else if($stmt = $con->prepare("UPDATE users SET NOM = '$newNom' WHERE ID = ? ")){
$stmt->bind_param('s', $currentId);
$stmt->execute();
echo "les valeur on été modifier";
}else{
echo "les valeurs n'ont pas été modifier";
}
//editProfile.php
<form action="change.php" method="POST">
<table>
<tr>
<td>Username:</td>
<td>
<label for="username"></label>
<input type="text" name="changeUsername" placeholder="<?php echo $_SESSION['name'] ?>" id="changeUsername">
</td>
</tr>
<tr>
<td>Nom:</td>
<td>
<label for="nom"></label>
<input type="text" name="changeNom" placeholder="<?php echo $nom ?>" id="changeNom">
</td>
</tr>
</table>
<input type="submit" value="modfier">
</form>
【问题讨论】:
-
警告! 您很容易受到 SQL 注入攻击,因为您没有正确使用准备好的语句。您不应该将 any 变量直接注入到您的查询中。出于某种原因,您正在混合注入变量并使用占位符(
?)。您应该在 all 查询中为 all 参数使用占位符。您还应该使用正确的类型。我假设$currentId是一个整数,所以$stmt->bind_param('s', $currentId);应该是$stmt->bind_param('i', $currentId); -
谢谢 Magnus,你是对的 ($currentId),我改变了它。但是请您解释一下如何纠正我准备好的陈述以及如何纠正我的错误?
-
啊,你的第一个准备好的陈述开始得很好;只是为了使第二个和第三个准备好的语句不安全。
-
您已经知道如何参数化这些值。只需确保对查询中使用的所有变量都执行此操作:
USERNAME = ? WHERE ID = ?,然后以正确的顺序添加更多->bind_param(...)。 -
我假设您的第一个查询应该只是检查
COUNT(1)的值,而不是麻烦绑定名称值以进行比较。 stackoverflow.com/a/9406106/2943403 关于if ($checkUsername === $newUsername) {,我的法语有点生疏——这是否应该检查$newUsername是否与$_SESSION['name']中的名称相同? ...不应该在第一个查询之前进行无查询检查吗?