Php 返回空字符串的PDO fetch()

Php 返回空字符串的PDO fetch(),php,mysql,pdo,mysqli,Php,Mysql,Pdo,Mysqli,我感到非常沮丧。我有两个具有类似“说明”的函数,即:从数据库中的用户表返回值 第二个可以正常工作,但是第一个返回空值 代码如下: public function ValidateUser($username, $password) { $stmt = "SELECT password FROM users WHERE username = :username LIMIT 1"; if(!($grabUser = $this->db->prepare($stmt)))

我感到非常沮丧。我有两个具有类似“说明”的函数,即:从数据库中的用户表返回值

第二个可以正常工作,但是第一个返回空值

代码如下:

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']);
}
public函数ValidateUser($username,$password)
{
$stmt=“从用户名=:用户名限制1”的用户中选择密码”;
如果(!($grabUser=$this->db->prepare($stmt)))
{
返回null;
}
$grabUser->bindParam(“:username”,$username,PDO::PARAM_STR);
$grabUser->execute();
$data=$grabUser->fetch();
if(count($grabUser->fetchColumn())core->encrypt($data['password']);
}
我试图在页面上显示$data['password'],只是为了测试它是否从数据库返回值,但是它只是返回空值,而查询返回一列,因为它通过了

if(count($grabUser->fetchColumn()) <= 0)
{
    return null;
}
if(count($grabUser->fetchColumn())db->prepare($stmt)))
{
返回null;
}
$grabUser->bindParam(“:email”,$email,PDO::PARAM_STR);
$grabUser->bindParam(“:fb”,$fid,PDO::PARAM_INT);
$grabUser->execute();
$data=$grabUser->fetch();
if(count($grabUser->fetchColumn())core->encrypt($data['password']);
}
在这种情况下,它会转换用户名和密码。为什么它在第一个函数中不起作用

谢谢。

有关详细信息,请参阅手册。您可以看到,这将获取下一个结果集。因此,如果您已经调用了
fetch()
,那么根据您的代码,应该不会有下一个结果集:

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

如果(count($grabUser->fetchColumn())否,则不应将
->fetchColumn
->fetch
以及
限制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;
}

如果您在phpMyAdmin中使用它,是否有返回的数据?我将尝试一下。谢谢:)而不是使用空($data)您可以使用count($data)吗?另外,如果您所说的是这样的话,为什么它与我的ValidateFacebookUser()函数完美配合,它与有问题的函数具有相同的基本结构?@zuc001是的,您可以直接在
$data
上使用
count
,因为如果找不到行,它将是空的。我的建议是不要依赖于
fetchColumn
必须使用
count()。但它返回的是列,只是没有获取密码值@ZUC001我不知道您在那里有什么输入,请确保
$data
在读取最后一个
之前不为空,如果
使用
var\u dump()
阻塞。我发现了错误!我使用PDO quote()创建了一个名为$core->input()的函数,该函数将文本包装为“”。因此,它是不正确的。
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;
}