0

因此,在 php 中,我试图在创建类时连接到数据库的数据库类中获取一个公共变量。像这样——

<?php

class database {    

    public $_link;


    public function __construct (){
       $this->_link = new PDO("mysql:host=localhost; dbname=swinkidc_student", "swinkidc_student", "");
    }


}

和...

<?php

class user{

    private $db;


    public function __construct() {
        $this->db = new database;
    }

    /**
     * Returns the ID of a user.
     * @param string $user
     * @return mixed
     */
    public function getUserID($user){
        $query =  $_link->prepare("SELECT `user_id` FROM `users` WHERE `username` = :user");
        $query->bindParam(":user", $user);
        $query->execute();       
        $result = $query->fetch(PDO::FETCH_ASSOC);
        return $result['user_id']; 
    }

    /**
     * Checks if given user is active.
     * @param string $user
     * @return bool Returns true/false if user is active.
     */
    public function isUserActive($user){

    }

}

如果我在用户中扩展数据库,我显然可以参考 _link 如果我将其设为私有并且它将起作用,但是,我认为我不应该仅仅为了获得类似的东西而继承..

每当我尝试有关时,我都会得到:致命错误:在第 18 行的 /home/swinkidc/public_html/studentreach/core/authentication/user.php 中的非对象上调用成员函数 prepare()

如前所述,如果我尝试继承方式它会起作用,我只是觉得这不是做这种事情的好方法。

请问有什么建议吗?

谢谢!

4

4 回答 4

1

link实际上是 的属性 database而不是 的属性user。因此使用:

$query =  $this->db->_link->...
于 2013-05-14T15:25:10.040 回答
0

最好反转依赖关系并包装 $db。

class database {

    private $_link;

    public function __construct(\PDO $pdo) {
        $this->_link = $pdo;
    }

    public function getLink() {
        return $this->_link;
    }

    //other useful stuff

}

class user {

    private $_db;

    public function __construct(\database $db) {
        $this->_db = $db;
    }

    public function getDB() {
        return $this->_db;
    }

    /**
     * Returns the ID of a user.
     * @param string $user
     * @return mixed
     */
    public function getUserID($user) {
        $query = $this->getDB()->getLink()->prepare("SELECT `user_id` FROM `users` WHERE `username` = :user");
        $query->bindParam(":user", $user);
        $query->execute();
        $result = $query->fetch(PDO::FETCH_ASSOC);
        return $result['user_id'];
    }

    /**
     * Checks if given user is active.
     * @param string $user
     * @return bool Returns true/false if user is active.
     */
    public function isUserActive($user) {

    }

}

用法

$user = new \user(new \database(new \PDO("mysql:host=localhost; dbname=swinkidc_student", "swinkidc_student", "")));

现在您可以在课堂之外配置您的数据库连接。

于 2013-05-14T15:38:23.307 回答
0

在 User 类中尝试如下:

<?php

class user{

    private $db;


    public function __construct() {
        $this->db = new database;
    }

    /**
     * Returns the ID of a user.
     * @param string $user
     * @return mixed
     */
    public function getUserID($user){
        $query =  $this->db->_link->prepare("SELECT `user_id` FROM `users` WHERE `username` = :user");
        $query->bindParam(":user", $user);
        $query->execute();       
        $result = $query->fetch(PDO::FETCH_ASSOC);
        return $result['user_id']; 
    }

    /**
     * Checks if given user is active.
     * @param string $user
     * @return bool Returns true/false if user is active.
     */
    public function isUserActive($user){

    }

}

这可以作为 _link不是User的属性,而是database的属性,并且,如果您扩展类数据库,它可以从链接中的方法访问(至少在 Java 中,我不知道相同的方式是否适用于 PHP),但如果您只是实例化它,则不会。这只是基本的 OOP。

祝你好运。

于 2013-05-14T15:25:33.553 回答
0

你只是错过了$this->db->之前的:

$query =  $this->db->_link->prepare("SELECT `user_id` FROM `users` WHERE `username` = :user");

现在,它应该可以工作了;您正在尝试直接访问它。首先通过 访问数据库链接持有对象,$this->db然后才访问属性$_link

如果您需要$_link作为变量,因为它更短,请将对象分配$this->db->_link$_link

$_link = $this->db->_link;

在 getUserID 函数的开头,它也会起作用。

于 2013-05-14T15:25:17.197 回答