0

我有大量的课程:一个主论坛课程、一个论坛板课程和一个线程课程。这些可以被认为是我网站上下文中的模型。

以前的 Web 开发人员使用的设置在这些类中的每一个中创建一个新的 mysqli 连接,并在类的实例化时连接。这意味着在主题页面中,论坛、主题和用户有 3 个不同的连接。这显然不是理想的,我认为甚至不是最佳的。

我在以前的项目中工作,我可以简单地将数据库类的一个新实例传递给我正在使用的类,但这并不理想,因为我需要实例化多个类并将一个数据库实例传递给每个类会失败目的。

在这些类中的每一个中,都会进行数据库调用,因此每个类中都需要数据库对象/实例,而不必分别实例化它 3 次以上。

例如,在线程类中,您可以:

function get_threads($board_id) {
    return $this->con->query("some query");
}

有谁知道我该如何实现这一目标?

4

1 回答 1

3

我更喜欢一个数据库控制器,您可以从工厂模式中获取数据。在下面的示例中,您可以只创建一个控制器并让您的组件根据需要使用它。

ex: $threads = new ThreadClass($mysqlConnection);

我希望这有帮助

# 1. mysql source or "socket" using PDO
class SimpleDatabaseSocket {

    protected static $dbh = false;

    public function connect($database, $user, $pass, $host) {
        $dsn = "mysql:dbname={$database};host={$host}";
        self::$dbh = new PDO($dsn, $user, $pass);
        self::$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

}

# 2. always use an interface which defines required logic
interface SimpleDatabaseInterface {

    public function onRunQuery($query);
}

# 3. create the accessible controller for inherited & ancillary logic
class SimpleDatabaseController extends SimpleDatabaseSocket implements SimpleDatabaseInterface {

    private $host = "";
    private $base = "";
    private $usr = "";
    private $pwd = "";
    private $table = "";

    # when we create the controller, you MUST pass the connection params
    public function __construct($host, $usr, $pwd, $base) {
        $this->setUsr($usr);
        $this->setPwd($pwd);
        $this->setBase($base);
        $this->setHost($host);
    }

    # mysql host/ip
    public function setHost($host) {
        $this->host = $host;
    }

    # mysql database
    public function setBase($base) {
        $this->base = $base;
    }

    # mysql username
    public function setUsr($usr) {
        $this->usr = $usr;
    }

    # mysql password
    public function setPwd($pwd) {
        $this->pwd = $pwd;
    }
    # allow this controller to switch tables dynamically.
    public function onChangeTable($table) {
        $this->table = $table;
    }

    # connect to the database
    protected function onConnect() {
        $this->connect($this->base, $this->usr, $this->pwd, $this->host);
    }

    # connects to the DB and runs a custom query
    public function onRunQuery($query) {
        try {
            if (!self::$dbh)
                $this->onConnect();
            $result = self::$dbh->query($query);
            $out = $result->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {

        }
        return $out;
    }

}

# exmaple usage
$mysql = new SimpleDatabaseController("HOSTNAME","USERNAME","PASSWORD","DATABASE");
$result = $mysql->onRunQuery("SELECT * FROM TABLE LIMIT 0,2");
print("<pre>" . print_r($result, true) . "</pre>");
于 2012-10-13T04:44:45.247 回答