php - PDO fetch() 返回空字符串

标签 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)))
    {
        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'] 只是为了测试它是否从数据库返回一个值,但是它只是返回空值,而查询返回一列,因为它通过了

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 以及 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;
}

关于php - PDO fetch() 返回空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29874477/

相关文章:

mysql - sqoop连接mysql出错

php - 散列密码并将其和盐保存到 mysql pdo utf8 编码

php - 总是用 PHP 准备 SQL 语句有什么问题吗?

php - 从过去一周的 MySQL 中获取所有日期并计算出每天的小时数

PHP 在调用静态方法时使用变量

php - 使用 jquery 在 URL 中传递哈希并进行 mysql 查询

php - 添加另一个条件过程

php - 仅显示当前帖子的分类术语 (Drupal)

mysql - 数据库版本更改后,不会自动使用索引

php - 第二个查询仅显示初始查询的某些行的数据