【问题标题】:Call to a member function fetchAll() on boolean在布尔值上调用成员函数 fetchAll()
【发布时间】:2017-09-25 16:57:27
【问题描述】:

我有以下问题。

这个错误一直伴随着我

致命错误:未捕获的错误:调用 C:\xampp\htdocs\certificado\functions.php:49 中布尔值的成员函数 fetchAll() 堆栈跟踪:#0 C:\xampp\htdocs\certificado\index。 php(11): get_info_from_email('amanda_pandoka@...') #1 {main} 在第 49 行的 C:\xampp\htdocs\certificado\functions.php 中抛出

在下面的代码中,我无法理解错误。有人可以帮我吗?

    function connect() {
    $socket = new PDO('mysql:host=' . @$host . ';dbname=' . @$nomedobancodedados,
        @$usuario, @$senha);
    $socket->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    return $socket;
}

function get_info_from_email($email) {

    if (!$email)
        return false;

    global $db;

    $sql = "
        SELECT
            id,
            name,
            email,
            type,
            data,
            file
        FROM
            attendee
        WHERE 1=1
            AND email = '{$email}'
    ";
    if ($info = $db->query($sql))
        return false;

    if ($info = $info->fetchAll())
        return false;

    return $info;

    }

【问题讨论】:

    标签: php pdo


    【解决方案1】:
    if ($info = $db->query($sql))
        return false;
    

    这表示:如果$db->query($sql) 的结果可以存储在$info 中并且不是falsenull 或空字符串或数组,请立即停止并返回false。所以基本上,如果您的查询成功执行并正确返回带有结果的PDOStatement,您的函数将在此处停止。

    if ($info = $info->fetchAll())
        return false;
    

    这是你得到错误的地方。完全到达此代码的事实意味着查询无法执行(否则,它会更早返回false)。所以基本上,你在false 上调用fetchAll()。试着看看这里的错误是什么(在这个if-statement 之前做一个print_r($db->errorInfo());

    顺便说一句,如果fetchAll() 调用成功,这个if-statement 也会导致你的函数返回false,这可能不是你想要的。此外,通过将$db->query() 直接与函数调用中提供的电子邮件地址一起使用,您的代码可能会受到SQL 注入攻击。作为一项规则,如果您不能 100% 控制其中的内容,则永远不要信任任何变量。您应该改用准备好的语句。

    作为另一条规则,总是在代码块上使用大括号(if/elseif/elsefor/foreach/while/dotry/catch/finally),因为如果有一天你决定代码块应该做两件事而不是一件事,你就不需要再考虑它们了,如果可以的话,调试代码会更容易直观地查看您的代码正在尝试做什么。

    此代码(未经测试)应该可以按照您想要的方式工作:

    function get_info_from_email($email) {
        if (!$email) {
            return false;
        }
    
        global $db;
    
        $stmt = $db->prepare("
            SELECT
                id,
                name,
                email,
                type,
                data,
                file
            FROM
                attendee
            WHERE 1=1
                AND email = :email
        ");
    
        // return false if the query cannot be executed
        if (!$stmt->execute(array(':email' => $email))) {
            return false;
        }
    
        // return false if there was an **error** retrieving the query results
        if (($info = $stmt->fetchAll()) === false) {
            return false;
        }
    
        return $info;
    }
    

    【讨论】:

    • 我做了一个 print_r($db->e​​rrorInfo());并且它与您放置的代码一起返回了错误 Array ([0] => 00000 [1] => [2] =>)
    • 这意味着没有错误。你的原始代码返回了什么?
    • 返回在数据库中找不到邮件!
    • 好的,那么新函数返回的结果是否正确?
    • 是根据Print_r($db->e​​rrorInfo());它返回一个结果,它只是不与数据库冲突以生成扩展名为 GD 的证书
    【解决方案2】:

    这样继续

     function get_info_from_email($email) {
    if (!$email) {
        return false;
    }
    
    global $db;
    
    $sql = $db->prepare("
        SELECT
            id,
            name,
            email,
            type,
            data,
            file
        FROM
            attendee
        WHERE 1=1
            AND email = :email
    ");
    print_r($db->errorInfo());
    // return false if the query cannot be executed
    if (!$sql->execute(array(':email' => $info))) {
        return false;
    }
    
    // return false if there was an **error** retrieving the query results
    if (($info = $sql->fetchAll()) === false) {
        return false;
    }
    
    return $info;
    

    }

    【讨论】:

    • array(':email' => $info) 应该是array(':email' => $email)
    猜你喜欢
    • 2016-05-26
    • 2017-06-07
    • 2017-05-03
    • 1970-01-01
    • 2021-05-23
    • 2018-12-17
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多