无法在课堂内使用PDO

时间:2014-11-15 16:22:22

标签: php mysql class pdo

我是一个简单的类,需要数据库访问的用户。我还需要在其他几个类中访问数据库,所以我的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"是没有意义的。每个功能,所以我做错了什么?

4 个答案:

答案 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