PHP SQL 查询未使用 bind_param 返回任何内容(返回 false)

PHP SQL Query is not returning anything using bind_param (returning false)

我有一个注册 PHP 函数可以像这样注册用户

//Function to create a new user
public function register($firstName, $lastName, $email, $state, $city, $password, $zipCode, $isHMan, $skills, $experience)
{
    $password = md5($password);
    $stmt = $this->conn->prepare("INSERT INTO handyman(firstName, lastName, email, state, city, password, zipCode, isHMan, skills, experience) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
    $stmt->bind_param("ssssssssss", $firstName, $lastName, $email, $state, $city, $password, $zipCode, $isHMan, $skills, $experience);
    $result = $stmt->execute();
    $stmt->close();
    if ($result) {
        return true;
    } else {
        return false;
    }
}

此函数在调用时完美运行,所有内容都已插入我的杂工 table(包括 md5 散列密码)。我的问题是我的登录功能。这是函数:

public function login($email, $password) {
    $password1 = md5($password);
    $stmt = $this->conn->prepare("SELECT * FROM `handyman` WHERE email = ? AND password = ?");
    $stmt->bind_param("ss", $email, $password1);
    $result = $stmt->execute();
    $stmt->close();
    if (mysqli_num_rows($result) != 0) {
        echo "results acquired";
        return true;
    } else {
        echo "no results";
        return false;
    }
}

当我 运行 时,我收到此警告:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given.

并且程序没有输出任何结果。
在 Whosebug 上进行搜索后,人们说这是由 SQL 查询中的错误引起的,并且 $result 变量实际上返回了一个错误的布尔值。我使用我数据库中的电子邮件和密码将查询直接输入到我的数据库中,并且它完美地执行了。我一辈子都弄不明白哪里出了问题。我的值和 SQL 查询似乎是正确的。我猜它可能与 bind_param 函数有关,但我不知道是什么。任何帮助将不胜感激。

您混合了程序风格 mysqli 函数和面向对象的函数。

您需要将您的代码调整为:

public function login($email, $password) {
    $password1 = md5($password);  // don't do this btw
    $stmt = $this->conn->prepare("SELECT * FROM `handyman` WHERE email = ? AND password = ?");
    $stmt->bind_param("ss", $email, $password1);
    $stmt->execute();
    $stmt->store_result();
    if ($stmt->num_rows != 0) {
        echo "results acquired";
        return true;
    } else {
        echo "no results";
        return false;
    }
}

注意:要检查 num_rows,您需要先调用 store_result

您还需要更改注册方法,因为它会从执行中查看失败布尔值:

public function register($firstName, $lastName, $email, $state, $city, $password, $zipCode, $isHMan, $skills, $experience)
{
    $password = md5($password); // ahem .. no
    $stmt = $this->conn->prepare("INSERT INTO handyman(firstName, lastName, email, state, city, password, zipCode, isHMan, skills, experience) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
    $stmt->bind_param("ssssssssss", $firstName, $lastName, $email, $state, $city, $password, $zipCode, $isHMan, $skills, $experience);
    $stmt->execute();
    $stmt->store_result();
    if ($stmt->affected_rows) {
        return true;
    } else {
        return false;
    }
}

注意:使用affected_rows也需要调用store_result。不要检查 execute 的 bool 结果,因为它用于 sql.

中的失败

密码:

请查看 password_hash()password_verify() 以了解您的存储和登录程序。 md5 不安全,而且过时了。它超出了本 Q/A 的范围,无法提供这些功能的完整工作用法。不过请务必调查一下。