PDO fetch() 返回空字符串

PDO fetch() returning empty string

我感到非常沮丧。我有两个具有相似 "instructions" 的函数,即:来自数据库中用户 table 的 return 值。

第二个工作正常,但是第一个 return 是一个空值。

代码如下:

public function ValidateUser($username, $password)
{
    $stmt = "SELECT password FROM users WHERE username = :username LIMIT 1";
    if(!($grabUser = $this->db->prepare($stmt)))
    {
        return null;
    }
    $grabUser->bindParam(":username", $username, PDO::PARAM_STR);
    $grabUser->execute();
    $data = $grabUser->fetch();

    if(count($grabUser->fetchColumn()) <= 0)
    {
        return null;
    }
    echo $data['password'].'s';
    if(!password_verify($password,$data['password']))
    {
        return null;
    }
    return $this->core->encrypt($data['password']);
}

我试图在页面上显示 $data['password'] 只是为了测试它是否 return 是数据库中的值,但它只是 returning空,而查询 return 列,因为它传递了

if(count($grabUser->fetchColumn()) <= 0)
{
    return null;
}

条件。

$username和$password变量都设置好了,所以没问题。

以防万一你问,这是 正常工作的功能:

public function ValidateFacebookUser($email, $fid)
{
    $stmt = "SELECT username, password FROM users WHERE email_address = :email AND connected_fb = '1' AND connected_fb_id = :fb LIMIT 1";
    if(!($grabUser = $this->db->prepare($stmt)))
    {
        return null;
    }
    $grabUser->bindParam(":email", $email, PDO::PARAM_STR);
    $grabUser->bindParam(":fb", $fid, PDO::PARAM_INT);
    $grabUser->execute();
    $data = $grabUser->fetch();

    if(count($grabUser->fetchColumn()) <= 0)
    {
        return null;
    }
    return array($data['username'], $this->core->encrypt($data['password']));
}

它确实会为该案例提供用户名和密码。为什么它在第一个函数中不起作用?

谢谢。

查看 fetchColumn() 的手册。您可以看到这会获取下一个结果集。因此,如果您已经调用了 fetch(),根据您的代码,应该没有下一个结果集:

$data = $grabUser->fetch();
if(count($grabUser->fetchColumn()) <= 0)
{
   return null;
}

这将始终 return null,结果为 LIMIT 1 或单行结果。

不,您不应该混淆 ->fetchColumn->fetch 以及 LIMIT 1

您已经 ->fetch() 第一行了。在调用 ->fetchColumn() 之后,没有更多的行可以获取。

public function ValidateUser($username, $password)
{
    $stmt = "SELECT password FROM users WHERE username = :username LIMIT 1";
    if(!($grabUser = $this->db->prepare($stmt))) {
        return null;
    }
    $grabUser->bindParam(":username", $username, PDO::PARAM_STR);
    $grabUser->execute();
    $data = $grabUser->fetch(); // fetch once

    // no need to add ->fetchColumn checking
    $ret = null;
    if(!empty($data['password']) && password_verify($password,$data['password'])) {
        $ret = $this->core->encrypt($data['password']);
    }

    return $ret;
}