0

複数のデータベース接続用に次のコードがあります。それは良いデザインではありません。すべてが静的です。しかし、それを改善する方法がわかりません。クエリの準備などの機能を追加できますが、現在は良い/クリーンなデザインが必要です。マルチトンのデザインパターンを作ってみました。要件は、最初に 1 つのデータベースに接続し、次に他のすべての mysql クライアントのデータベースの詳細を取得し、次にループして各データベースに接続し、何かを行うようなものです。したがって、複数の接続が必要です。

<?php

class db_class{

private static $instance = array();

private function __construct(){ }

public static function get_instance($type , $db_detail_array=array()){
    $host = $db_detail_array['host'];
    $username = $db_detail_array['username'];
    $database = $db_detail_array['database'];
    $password = $db_detail_array['password'];
    if(empty($host) or empty($username) or empty($database) or empty($password)){
        return;
    }

    if(empty(self::$instance[$type])) {
            self::$instance[$type] = new mysqli($host, $username, $password, $database);
        if (@self::$instance[$type]->connect_errno) {
            echo self::$last_err = "Connect failed";
        }
        }
}

static function fetch_assoc($query,$type){
    $db_query = self::run_query($query,$type);
    $rows = array();
    while($row = @$db_query->fetch_assoc()){
        $rows[] = $row;
    }
    $db_query->free();
    return($rows);
}

static function escape($type,$value){
    $value = self::$instance[$type]->real_escape_string($value);
    return($value);
}

static function run_query($query,$type){
    self::$instance[$type]->ping();
    $db_query = self::$instance[$type]->query($query);
    if(self::$instance[$type]->error){
        echo self::$last_err = self::$instance[$type]->error;echo "<p>$query, $type</p>";
        return;
    }
    return($db_query) ;
}

static function num_rows($query,$type){
    $db_query = self::run_query($query,$type);
    $num_rows = $db_query->num_rows;
    return($num_rows);
}

static function disconnect($type){
    @self::$db_obj[$type]->close();
}

}
?>
4

1 に答える 1

1

PDOをご覧ください。

これは、共通の効果的なインターフェイスを公開する統合データベース オブジェクトです。

mysql 以外のサーバータイプもサポートしています。

地味に使っても満足です。

于 2013-05-14T07:45:07.057 に答える