【问题标题】:mysqli in PHP - bind_result always returning nullPHP中的mysqli - bind_result总是返回null
【发布时间】:2015-11-25 01:24:33
【问题描述】:

我的 PHP 代码中有以下函数/方法,我想根据密码或令牌和电子邮件检查一些用户内容。

function login($email, $password, $token) {

    if (isset($email)) {

        if (isset($password) && strlen($password) > 0) {
            $stmt = $this->con->prepare("SELECT users.user_id, logins.email, logins.token, users.firstname, users.lastname, users.username
                                     FROM users
                                     INNER JOIN logins
                                         ON users.login_id = logins.login_id
                                     WHERE logins.email=? AND logins.password=?");
            $stmt->bind_param("ss", $email, $password);

        } elseif ($token && strlen($token) > 0) {
            $stmt = $this->con->prepare("SELECT users.user_id, logins.email, logins.token, users.firstname, users.lastname, users.username
                                     FROM users
                                     INNER JOIN logins
                                         ON users.login_id = logins.login_id
                                     WHERE logins.email=? AND logins.token=?");
            $stmt->bind_param("ss", $email, $token);

        } else {
            return $this->error_login_failure;
        }

        $stmt->execute();
        $stmt->store_result();
        $stmt->bind_result($rUserId, $rEmail, $rToken, $rFirstname, $rLastname, $rUsername);
        $stmt->fetch();


        if ($rUserId != null || strlen($rUserId) > 0) {
            $stmt->close();

            $newToken = $this->insertNewToken($email, $password, $rToken);
            if ($newToken == null) {

                return $this->error_login_failure;
            } else {
                $returnValues = array();
                $returnValues['userId'] = $rUserId;
                $returnValues['email'] = $rEmail;
                $returnValues['token'] = $rToken;
                $returnValues['firstname'] = $rFirstname;
                $returnValues['lastname'] = $rLastname;
                $returnValues['username'] = $rUsername;

                return $returnValues;
            }

        } else {
            $stmt->close();

            return $this->error_login_failure;
        }

    } else {
        return $this->error_login_failure;
    }
}

问题是,当我传递令牌(不为空)时,我没有得到任何返回。我调试了一下,发现所有输入参数都正确,代码到达“elseif ($token && strlen($token) > 0) {”。 但是当我尝试获取返回的数据时,什么都没有返回。如果我传入密码,则不会发生这种情况,只有当它使用令牌尝试第二个“if”时才会发生这种情况。

如果我以令牌作为参数的第二个 SQL 查询并在终端中手动运行它,它也可以工作。我似乎无法找出问题所在。

任何帮助将不胜感激。

【问题讨论】:

标签: php mysql mysqli


【解决方案1】:

我看到的密码和令牌之间的唯一区别是 isset 命令。尝试像我在下面那样添加它,看看是否可以解决它。除此之外,我会验证列名是否正确。

function login($email, $password, $token) {

    if (isset($email)) {

        if (isset($password) && strlen($password) > 0) {
            $stmt = $this->con->prepare("SELECT users.user_id, logins.email, logins.token, users.firstname, users.lastname, users.username
                                     FROM users
                                     INNER JOIN logins
                                         ON users.login_id = logins.login_id
                                     WHERE logins.email=? AND logins.password=?");
            $stmt->bind_param("ss", $email, $password);

        } elseif (isset($token) && strlen($token) > 0) {
            $stmt = $this->con->prepare("SELECT users.user_id, logins.email, logins.token, users.firstname, users.lastname, users.username
                                     FROM users
                                     INNER JOIN logins
                                         ON users.login_id = logins.login_id
                                     WHERE logins.email=? AND logins.token=?");
            $stmt->bind_param("ss", $email, $token);

        } else {
            return $this->error_login_failure;
        }

        $stmt->execute();
        $stmt->store_result();
        $stmt->bind_result($rUserId, $rEmail, $rToken, $rFirstname, $rLastname, $rUsername);
        $stmt->fetch();


        if ($rUserId != null || strlen($rUserId) > 0) {
            $stmt->close();

            $newToken = $this->insertNewToken($email, $password, $rToken);
            if ($newToken == null) {

                return $this->error_login_failure;
            } else {
                $returnValues = array();
                $returnValues['userId'] = $rUserId;
                $returnValues['email'] = $rEmail;
                $returnValues['token'] = $rToken;
                $returnValues['firstname'] = $rFirstname;
                $returnValues['lastname'] = $rLastname;
                $returnValues['username'] = $rUsername;

                return $returnValues;
            }

        } else {
            $stmt->close();

            return $this->error_login_failure;
        }

    } else {
        return $this->error_login_failure;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2011-09-26
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    相关资源
    最近更新 更多