【问题标题】:PDO - "Call to a member function fetch() on a non-object"PDO - “在非对象上调用成员函数 fetch()”
【发布时间】:2015-04-10 12:58:41
【问题描述】:

我知道当查询返回 false 时通常会发生错误,但这一次是没有理由的! (或者只是我犯了一个大错误)

    if(!$security_SenderId){
        $getbaseticketqry = $this->db->prepare("SELECT * FROM `tickets` WHERE `ticket_safeid` = '?'");
        $getbaseticket = $getbaseticketqry->execute(array($ticket_safeid));
    }else{
        $getbaseticketqry = $this->db->prepare("SELECT * FROM `tickets` WHERE `ticket_safeid` = '?' AND `ticket_sender` = '?'");
        $getbaseticket = $getbaseticketqry->execute(array($ticket_safeid, $security_SenderId));
    }

    if($getbaseticket === false){
        return false;
    }else{
        $baseticket = $getbaseticket->fetch(PDO::FETCH_ASSOC);
    }

我在以数组形式返回支持票证信息的函数中有这些行,但正如我所说,当我尝试获取票证信息时会发生错误。我试图通过启用 pdo 调试模式和db->errorInfo() 在 fetch line 之前检查 mysql 错误,但它不起作用。

这可能是什么问题?

编辑:

<?php
error_reporting(E_ALL); ini_set('display_errors', 1);

class TICKET_MANAGER
{
    function __construct($dbhost, $dbname, $dbuser, $dbpass) {
        try{
            $this->db = new PDO("mysql:host=$dbhost;dbname=$dbname;charset=utf8", $dbuser, $dbpass);
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }catch(PDOException $e){
            die('Connection failed: ' . $e->getMessage() );
        }
    }

    function viewTicket($ticket_safeid, $security_SenderId = false)
    {
        try{
            if(!$security_SenderId){
                $getbaseticketqry = $this->db->prepare("SELECT * FROM `tickets` WHERE `ticket_safeid` = ?");
                $getbaseticket = $getbaseticketqry->execute(array($ticket_safeid));
            }else{
                $getbaseticketqry = $this->db->prepare("SELECT * FROM `tickets` WHERE `ticket_safeid` = ? AND `ticket_sender` = ?");
                $getbaseticket = $getbaseticketqry->execute(array($ticket_safeid, $security_SenderId));
            }
        }catch(PDOException $e){
            die('Mysql error: ' . $e->getMessage() );
        }
        ...

    }

    ...
}

【问题讨论】:

  • 你是如何使用TICKET_MANAGER类的?
  • 我已经为工单管理分离了文件(viewticket.php、newticket.php 等)。我将该类文件包含在 viewticket.php 中,并创建了一个新的 TICKET_MANAGER 实例,然后我只使用 viewTicket() 函数来获取票信息和回复。它从 $_POST 获取 ticket_safeid,从 session 获取 senderId。我确信 safeid 和 senderId 可以正常工作。
  • "and senderId from session" - 你在使用会话本身吗?
  • 我将登录用户的 id 作为发件人 id 来获取他自己的票。 se是什么意思?
  • 如果你使用会话php.net/manual/en/session.examples.basic.php,这就是我的意思

标签: php mysql pdo


【解决方案1】:

这是您所有 '?' 周围的引号 - 删除它们。

阅读手册

来自手册:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");

异常应该告诉你这个错误

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)

并在您连接到数据库后立即使用。


-http://php.net/manual/en/pdo.error-handling.php

try {
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

查询:

try {

// your query

}
    catch(PDOException $e){
     print  $e->getMessage();
    }

error reporting 添加到文件顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:错误报告只能在暂存阶段完成,而不能在生产阶段完成。

【讨论】:

  • 删除单引号不起作用。此外,我已经按照您所说的在 db 连接之后尝试了 setAttribute() 的操作,但它也没有引发任何错误。
  • @ibrahimduran Plus,只是为了确保。您的连接实际上是 PDO 而不是 mysqli_,对吗?你也在使用类吗?用您如何使用原始问题下的异常来更新您的问题,以免覆盖您的原始代码。
  • 我没有使用类进行数据库连接,我已经编辑了我的帖子,请查看。
  • 其他功能(newTicket 等)也可以正常工作。我只有这个功能有问题。
猜你喜欢
  • 2011-10-16
  • 2016-03-25
  • 2011-03-21
  • 2012-08-21
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多