0

メイン フォーラム クラス、フォーラム ボード クラス、スレッド クラスなど、大量のクラスがあります。これらは、私の Web サイトのコンテキストにおけるモデルと考えることができます。

以前の Web 開発者が使用していたセットアップでは、これらのクラスのそれぞれに新しい mysqli 接続が作成され、クラスのインスタンス化で接続されます。つまり、スレッド ページには、フォーラム、スレッド、およびユーザー用の 3 つの異なる接続があります。これは明らかに理想的ではなく、最適でさえないと思います。

以前のプロジェクトでは、使用していたクラスにデータベース クラスの新しいインスタンスを渡すだけで済みましたが、複数のクラスをインスタンス化する必要があり、データベース インスタンスを各クラスに渡すと失敗するため、これは理想的ではありません。目的。

これらの各クラスでは、データベース呼び出しが行われるため、データベースオブジェクト/インスタンスは各クラス内で必要であり、3 回以上インスタンス化する必要はありません。

たとえば、threads クラスでは次のようにすることができます。

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

これを達成する方法を知っている人はいますか?

4

1 に答える 1

3

ファクトリ パターンのようにデータを取得できる 1 つのデータベース コントローラーが望ましいです。以下の例では、コントローラーを 1 つだけ作成して、コンポーネントが必要に応じて使用できるようにすることができます。

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 に答える