我正在尝试使用此php脚本创建一个更改密码页面。我希望能够告诉用户他们是否输入了正确的用户名和密码,以便可以对其进行更改。当我检查行时,无论它是否返回行,我总是会收到此错误:
警告:mysqli_num_rows()期望参数1为mysqli_result,给出布尔值
这是我的代码:
<?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";
}
}
?>
注意:我确实在没有必要的情况下进行连接,只是在这里不需要连接。另外,如果我输入正确的信息,它将根据需要更改密码,但仍然显示错误消息
答案 0 :(得分:1)
选择查询仅具有mysqli_num_rows()
mysqli_num_rows()函数返回结果集中的行数。
所以用
mysqli_affected_rows($conn)
mysqli_affected_rows()函数返回上一个SELECT,INSERT,UPDATE,REPLACE或DELETE查询中受影响的行数。
答案 1 :(得分:1)
您需要检查受影响的行数,而不是行数。 num_rows
常量是选定的行数,而affected_rows
常量用于插入,更新和删除查询。
您还应该使用准备好的语句,而不是直接在查询中插入变量。
您遇到的另一件事是,如果同一查询可以运行一次,则尝试运行两次。那没有多大意义。
这是一个修订版本,尽管仍然缺少一个重要事项:您将密码存储在planintext中!这是一个巨大的安全问题!
不要以纯文本格式存储密码!这绝对不是安全的! 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
}