使用 FETCH_CLASS returns false 获取 PDO
PDO fetch with FETCH_CLASS returns false
我在User.php
中有一个简单的class:
class User {
private $id;
private $username;
private $password;
private $email;
private $first_name;
private $last_name;
private $active;
// Getters and setters generated by NetBeans...
}
我的数据库 table 名为 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) "y$wTCajtRU1xXf6Z65dZYjk.mx3tClFLujshS49SvYIuGW/lDZSH3nK"
[2]=>
string(60) "y$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
class 实例?
谢谢。
您不能将 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();
}
此外,请注意,您永远不应该捕获错误异常来报告它们。它使您的代码变脏、无法维护和不安全。
我在User.php
中有一个简单的class:
class User {
private $id;
private $username;
private $password;
private $email;
private $first_name;
private $last_name;
private $active;
// Getters and setters generated by NetBeans...
}
我的数据库 table 名为 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) "y$wTCajtRU1xXf6Z65dZYjk.mx3tClFLujshS49SvYIuGW/lDZSH3nK"
[2]=>
string(60) "y$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
class 实例?
谢谢。
您不能将 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();
}
此外,请注意,您永远不应该捕获错误异常来报告它们。它使您的代码变脏、无法维护和不安全。