当前位置: 首页 > 知识库问答 >
问题:

mysqli_num_rows($结果)==0返回错误[重复]

濮献
2023-03-14

我试图用这个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";
    }
}

?>

注意:我确实在手之前建立了一个连接,只是似乎没有必要在这里进行连接。此外,如果我输入了正确的信息,它将根据需要更改密码,但仍会显示错误消息

共有2个答案

谢诚
2023-03-14

选择query only havemysqli\u num\u rows()

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

所以使用mysqli_affected_rows($conn)

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

黄泰宁
2023-03-14

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

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

您遇到的另一件事是,您试图运行相同的查询两次,如果它可以运行一次的话。那没什么意义。

这是一个修订版,尽管仍然缺少一件重要的事情:你把密码存储在纯文本中!这是一个巨大的安全问题!

不要以纯文本形式存储密码!这一点都不安全!PHP有内置函数,您应该使用这些函数来处理密码的存储,请参阅password_hash()函数,它更安全

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
}
  • http://php.net/mysqli-stmt.affected-rows
 类似资料:
  • 问题内容: 它应该返回1000,但是为什么返回5? 问题答案: 是。如果你用它乘,它会溢出类型(因为这的最大值可容纳是比少了很多),你会得到的。 然后,将结果除以,您将得到。 为了解决此问题,您需要明确指定乘法的结果将是-这是因为Java中的所有数字运算符都会产生整数,除非明确指示要产生其他数字类型。 只需在一些操作数上附加a 就足够了:

  • 问题内容: 当我比较具有相同下划线字符串的两个StringBuilder对象时,即使value应该为true也会返回。 问题答案: 这是因为不会覆盖类中的方法。 您将必须将两个对象都转换为,然后进行比较 这将为您提供正确的结果。显然,您必须注意 null 检查等。 根据合同,如果覆盖equals,则也必须覆盖它们,但是由于可变,因此其值的任何更改都会影响对象的哈希码。如果用作键,可能会导致存储的值

  • 我必须创建聚合,计算日期范围中包含的文档数量。我的查询如下所示: 间隔:604800000等于7天。 结果,我重新强调了这些: 您可以要求我的buckets从29/12/2016开始,但作为范围查询,不包括此日期。我希望我的桶应该从01/01/2017开始,正如我在范围查询中指出的那样。此问题仅发生在间隔天数大于1的查询中。在任何其他间隔的情况下,它工作得很好。我试了一天,几个月和几个小时,效果很

  • 我有一个有82,535行的表,其中65,087行按ID是唯一的。当我拉取整个结果集82,535并复制到Excel并删除重复项时,它显示有17,448个重复项。但是当我使用下面的查询时,我得到了不同的结果: 此查询返回值17364 我确定唯一的的数目是65,087

  • 我是JS的学生。我有一段代码返回了一个错误。 这是返回的语法错误。你们能解释一下我做错了什么吗?

  • 我通过这个简单的演示来再现这个问题: -o0编译并运行: