【问题标题】:PDO fetch() returning empty stringPDO fetch() 返回空字符串
【发布时间】:2015-04-26 06:23:24
【问题描述】:

我变得非常沮丧。我有两个具有相似“指令”的函数,即:从数据库中的用户表返回值。

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

代码如下:

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

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

它确实会为这种情况转换用户名和密码。为什么它在第一个功能中不起作用?

谢谢。

【问题讨论】:

  • 如果你在 phpMyAdmin 之类的东西中使用它,是否有数据返回?

标签: php mysql pdo mysqli


【解决方案1】:

不,您不应该混淆 -&gt;fetchColumn-&gt;fetch 以及 LIMIT 1

发生的情况是您已经-&gt;fetch() 第一行。在调用-&gt;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;
}

【讨论】:

  • 我会试试这个。谢谢 :) 你可以使用 count($data) 而不是使用 empty($data) 吗?另外,如果您说的是这种情况,为什么它与我的 ValidateFacebookUser() 函数完美配合,它与有问题的函数具有相同的基本结构?
  • @zuc0001 是的,您可以直接在$data 上使用count,因为找不到行时它将为空。我的建议是完全不要依赖fetchColumn 必须使用count(),因为您实际上是在获取列值而不是计数COUNT(id),您正在比较'fetched_password' &lt;=0
  • 我已经实现了你的代码,但是它仍然返回 $data['password'] 为空。它正在返回该列,只是没有获取该密码值!
  • @zuc0001 我不知道你有什么输入,在阅读最后一个带有var_dump()if 块之前确保$data 不为空。
  • 我发现了错误!我创建的一个名为 $core->input() 的函数使用 PDO quote(),它将文本包装在“”中。因此它返回不正确。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-12-18
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 2016-07-23
    相关资源
    最近更新 更多