PDO fetch()返回空字符串

时间:2015-04-26 06:23:25

标签: php mysql pdo mysqli

我非常沮丧。我有两个功能,它们有类似的"指令" ie:从数据库中的users表返回值。

第二个工作正常,但第一个返回空值。

以下是代码:

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 [&#39;密码&#39;]只是为了测试它是否从数据库返回一个值,但它只是返回空,而查询< em> 返回一列,因为它传递了

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']));
}

它会转换该案例的用户名和密码。为什么它在第一个函数中不起作用?

感谢。

2 个答案:

答案 0 :(得分:1)

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

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

这将始终返回null,并带有LIMIT 1或单行结果。

答案 1 :(得分:1)

不,你不应该混淆->fetchLIMIT 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; } 之后,不再需要获取行。

{{1}}