Php mysqli_num_rows($result)==0返回错误

Php mysqli_num_rows($result)==0返回错误,php,mysql,mysqli,Php,Mysql,Mysqli,我试图用这个php脚本创建一个更改密码页面。我希望能够告诉用户他们是否输入了正确的用户名和密码,以便进行更改。当我检查行时,无论它是否返回行,我总是得到以下错误: 警告:mysqli_num_rows()要求参数1为mysqli_结果,给定布尔值 这是我的代码: <?php $uname = mysqli_real_escape_string($conn, $_POST['uname']); $currentpw = mysqli_real_escape_string($conn, $_

我试图用这个php脚本创建一个更改密码页面。我希望能够告诉用户他们是否输入了正确的用户名和密码,以便进行更改。当我检查行时,无论它是否返回行,我总是得到以下错误:

警告:mysqli_num_rows()要求参数1为mysqli_结果,给定布尔值

这是我的代码:

<?php

$uname = mysqli_real_escape_string($conn, $_POST['uname']);
$currentpw = mysqli_real_escape_string($conn, $_POST['currentpw']);
$newpw1 = mysqli_real_escape_string($conn, $_POST['newpw1']);
$newpw2 = mysqli_real_escape_string($conn, $_POST['newpw2']);

$sql = "UPDATE USERS
        SET password = '$newpw1'
        WHERE username = '$uname' and password = '$currentpw'";

$result = mysqli_query($conn, $sql);
$row = mysqli_num_rows($result);

    if($row > 0 && $newpw1 == $newpw2){
        mysqli_query($conn, $sql) or die(mysqli_error($conn, $sql));
    }   

    else if($newpw1 != $newpw2){
        echo "Passwords do not match";

    }
    else {
        echo "Username or Password is incorrect";
    }
}

?>
选择查询仅具有

函数的作用是:返回结果集中的行数

所以使用

函数的作用是:返回上一次SELECT、INSERT、UPDATE、REPLACE或DELETE查询中受影响的行数


您需要检查受影响的行数,而不是行数。
num_rows
常量是所选行的数量,而
受影响的_rows
常量用于插入、更新和删除查询

您还应该使用准备好的语句,而不是直接在查询中注入变量

另一件事是,如果可以运行同一查询一次,则尝试运行同一查询两次。那没有多大意义

这里有一个修订版,但仍然缺少一个重要的东西:你在planintext中存储密码!这是一个巨大的安全问题

不要将密码存储为纯文本这根本不安全!PHP有内置的函数,您应该使用这些函数来处理密码的存储,请参阅更安全的函数

if (isset($_POST['newpw1'])) {
    $username = $_POST['uname'];
    $current_password = $_POST['currentpw'];
    $newpw1 = $_POST['newpw1'];
    $newpw2 = $_POST['newpw2'];

    if ($newpw1 === $newpw2) {
        $stmt = $conn->prepare("UPDATE users SET password=? WHERE username=? AND password=?");
        $stmt->bind_param("sss", $newpw1, $username, $current_password);
        $stmt->execute();

        if ($stmt->affected_rows) {
            echo "Password updated successfully!";
        } else {
            echo "Username or password is incorrect";
        }
        $stmt->close();
    } else {
        echo "Passwords do not match";
    }
} else {
    // Form was not sent
}

您需要检查受影响的行,而不是select语句的行数。另外,使用您现在拥有的代码,您似乎尝试运行同一查询两次?您正在更新,如果有疑问,此处将不会返回任何内容。请阅读文档:2个错误:SQL UPDATE没有结果。更重要的是:您将存储明文密码???这绝对是粗心的,在某些国家是非法的。太好了!我从没想过。谢谢你们。