检查字段是否为空,如果没有更改 mysql 表中的值 [duplicate]

Check if fields are empty if not change value in mysql table [duplicate]

提问人:Jermey 提问时间:10/26/2021 最后编辑:CommunityJermey 更新时间:1/19/2022 访问量:339

问:

我正在尝试在我的网站上更改用户信息部分,除了更改用户名部分外,一切都有效。

在这一部分中,我必须检查newUsername是否未被采用,然后更改它(如果尚未采用)。

当我启动我的代码时,它不会在 (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>
php html 表单 mysqli

评论

0赞 M. Eriksson 10/26/2021
警告!由于您没有正确使用准备好的语句,因此您很容易受到 SQL 注入攻击。不应将任何变量直接注入查询中。出于某种原因,您混合了注入变量并使用占位符 (the )。应将占位符用于所有查询中的所有参数。您还应该使用正确的类型。我假设这是一个整数,所以应该是?$currentId$stmt->bind_param('s', $currentId);$stmt->bind_param('i', $currentId);
0赞 Jermey 10/26/2021
谢谢马格努斯,你是对的($currentId),我改变了它。但是你能解释一下我如何纠正我准备好的陈述以及如何纠正我的错误吗?
0赞 mickmackusa 10/26/2021
啊,你的第一份准备好的声明开始得很好;只是为了使第二和第三份准备好的语句不安全。
0赞 M. Eriksson 10/26/2021
您已经知道如何参数化值。只需确保对查询中使用的所有变量都执行此操作:然后按正确的顺序添加更多变量即可。USERNAME = ? WHERE ID = ?->bind_param(...)
1赞 mickmackusa 10/26/2021
我假设您的第一个查询应该只是检查一个值 1,而不是费心绑定一个名称值进行比较。stackoverflow.com/a/9406106/2943403关于,我的法语有点生疏——这应该检查是否与中的名字相同吗?...无查询检查不应该出现在第一个查询之前吗?COUNT(1)if ($checkUsername === $newUsername) {$newUsername$_SESSION['name']

答:

0赞 Jermey 10/27/2021 #1

最后,我找到了一些有效的东西。这段代码对SQL注入安全吗?

//check if the username is taken 
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($username);
        $stmt->fetch();
        if ($username === $newUsername) {
            $checkUsername = true;
        }
    }
}

//change the username
if (empty($newUsername)) {
    echo "username is empty";
} else if ($checkUsername != true) {
    if ($stmt = $con->prepare("UPDATE users SET USERNAME = ? WHERE ID = ? ")) {
        $stmt->bind_param('si', $newUsername, $currentId);
        $stmt->execute();
        echo "les valeur on été modifier";
        session_regenerate_id();
        $_SESSION['name'] = $newUsername;
    } else {
        echo "les valeurs n'ont pas été modifier";
    }
} else {
    echo "username deja utiliser ";
}

评论

0赞 Shane Bishop 10/27/2021
看起来您正在问一个关于 SQL 注入的新问题;如果是这样,请作为一个单独的问题询问您的代码是否安全,不会受到 SQL 注入的影响。