0

そのような質問をするのは少しばかげている気がしますが、このコードブロックは私を夢中にさせます.

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 行を返します。
4

1 に答える 1

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();
于 2013-09-06T06:13:05.023 に答える