使用fetch_CLASS的PDO获取返回false


PDO fetch with FETCH_CLASS returns false

我在User.php:中有一个简单的类

class User {
    private $id;
    private $username;
    private $password;
    private $email;
    private $first_name;
    private $last_name;
    private $active;
    // Getters and setters generated by NetBeans...
}

我的数据库表名为users:

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
`email` varchar(100) NOT NULL,
`first_name` varchar(100) DEFAULT NULL,
`last_name` varchar(100) DEFAULT NULL,
`active` int(10) unsigned DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
UNIQUE KEY `username_UNIQUE` (`username`),
UNIQUE KEY `email_UNIQUE` (`email`)

还有我的UserDAO.php文件的一部分:

...
require_once './db/DBConn.php';
require_once './user/User.php';
...
public static function getById($id) {
    try {
        $db = DBConn::getInstance();
        $query = "SELECT * FROM users WHERE id=:id";
        $stmt = $db->getConn()->prepare($query);
        $stmt->execute(array('id' => $id));
        $user = $stmt->fetch(PDO::FETCH_CLASS, "User");
        var_dump($user);
        return $user;
    } catch (PDOException $e) {
        echo "<br/>ERROR: User fetching by ID failed!<br/>";
        return 0;
    }
}
...

因此,当我调用getById(1)(或使用任何其他有效参数)时,函数执行所有内容,然后var_dump($user)输出bool(false)

如果我只放fetch()而不是fetch(PDO::FETCH_CLASS, "User")var_dump将给出以下内容:

array(14) {
  ["id"]=>
  string(2) "1"
  [0]=>
  string(2) "1"
  ["username"]=>
  string(4) "abcd"
  [1]=>
  string(4) "abcd"
  ["password"]=>
  string(60) "$2y$10$wTCajtRU1xXf6Z65dZYjk.mx3tClFLujshS49SvYIuGW/lDZSH3nK"
  [2]=>
  string(60) "$2y$10$wTCajtRU1xXf6Z65dZYjk.mx3tClFLujshS49SvYIuGW/lDZSH3nK"
  ["email"]=>
  string(13) "test@test.com"
  [3]=>
  string(13) "test@test.com"
  ["first_name"]=>
  string(7) "John"
  [4]=>
  string(7) "John"
  ["last_name"]=>
  string(13) "Johnson"
  [5]=>
  string(13) "Johnson"
  ["active"]=>
  string(1) "0"
  [6]=>
  string(1) "0"
}

我也试过fetch(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE,"User")。没有什么变化。

我做错了什么?为什么我不能用fetch创建一个User类实例?

谢谢。

不能将PDO::FETCH_CLASS与fetch一起使用。你必须事先打一个setFetchMode()电话:

public static function getById($id) {
    $db = DBConn::getInstance();
    $query = "SELECT * FROM users WHERE id=:id";
    $stmt = $db->getConn()->prepare($query);
    $stmt->execute(array('id' => $id));
    $stmt->setFetchMode( PDO::FETCH_CLASS, 'User');
    return $stmt->fetch();
}

此外,请注意,您永远不应该捕捉错误异常来报告它们。它使您的代码变得肮脏、不可维护和不安全。