PDO:在非对象上调用成员函数fetch()

时间:2013-09-06 05:58:51

标签: php mysql pdo

感到有点愚蠢地问这样的问题,但这个代码块让我发疯。

function __construct() {
    $db = new db();
    $this->db = $db->pdo;
}

function getEmployeeDetails() {
    $eid = $this->db->quote($this->eid);
    try {
        $sql = $this->db->query("
            SELECT email, cnumber
            FROM employees
            WHERE EID = $eid
        ");
        $r = $sql->fetch();
        $this->email = $r[0];
        $this->cnumber = $r[1];
    }
    catch (PDOException $e) {
        throw new Exception("failed");
    }
}

它不会抛出异常但在try块内失败 - "在非对象上调用成员函数fetch()"。

  1. 语句对象的var_dump返回' false'。为什么?
  2. 我尝试在MySql中独立运行查询。它返回1行。

1 个答案:

答案 0 :(得分:6)

很难判断你是否已经这样做了,但是默认情况下PDO不会抛出异常,除了连接失败。你必须特别添加:

$this->db = $db->pdo;
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

如果没有这个,查询期间发生的错误将导致->query()返回false,而这显然不是具有->fetch()方法的对象。您还可以将此属性指定为构造函数调用的一部分。

此外,您可以使用预准备语句而不是->quote()

$stmt = $this->db->prepare("SELECT email, cnumber
    FROM employees
    WHERE EID = ?");
$stmt->execute(array($this->eid));
$r = $stmt->fetch();