我是一个简单的类,需要数据库访问的用户。我还需要在其他几个类中访问数据库,所以我的class.user.php如下所示:
include "config.php"
class User {
public $db;
public function __construct(PDO $db){
$this->db = $db;
global $db;
}
function LastLogin(){
// global $db; // if I uncomment this, it works for this function.
$pdo = $db->prepare("SELECT last_login FROM users WHERE username = ?");
$pdo->execute(array($username));
while($r = $pdo->fetchObject()){
echo $r->last_login;
}
}
}
Config.php看起来像这样:
$dsn = "mysql:host=localhost;dbname=db;charset=utf8";
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$db = new PDO($dsn,'user','pass', $opt);
所以,让我说我有一个名为userdetails.php的页面,我想知道用户上次登录的时间。
$user = new User($db);
$user->LastLogin();
这会产生如下错误消息:
Notice: Undefined variable: db in /home/www/class.user.php on line 12
Fatal error: Call to a member function prepare() on a non-object in/home/www/class.user.php on line 12
所以我在课堂上使用pdo时遇到了问题。键入" global $ db"是没有意义的。每个功能,所以我做错了什么?
答案 0 :(得分:2)
如评论中所述,请删除以下行:
global $db;
此外,您也不需要传递PDO
。
而不是试图将其引用为
$db->prepare(....)
您想将其引用为:
$this->db->prepare(....)
因为你将它实例化为在类中可访问的变量。
答案 1 :(得分:1)
global $db
是问题所在。松开它,这一切都应该有效。
答案 2 :(得分:1)
试试这个
include "config.php"
class User {
public $db;
public function __construct($db){
$this->db = $db;
}
function LastLogin(){
$pdo = $this->db->prepare("SELECT last_login FROM users WHERE username = ?");
$pdo->execute(array($username));
while($r = $pdo->fetchObject()){
echo $r->last_login;
}
}
}
global $db
绝对不是必需的,并且是不好的做法,因为它会破坏类的封装。
据我所知,__construct(PDO $db)
中的类型提示PDO实际上并不合法。
虽然你有$db
的属性并且使用正确的句柄加载它,但是要使用它chnage this
$pdo = $db->prepare("SELECT last_login FROM users WHERE username = ?");
要
$pdo = $this->db->prepare("SELECT last_login FROM users WHERE username = ?");
所以你正确使用/解决它。
答案 3 :(得分:1)
从构造函数中删除global $db
。
在$this->db
$db
代替function LastLogin