感到有点愚蠢地问这样的问题,但这个代码块让我发疯。
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()"。
答案 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();