11

ここには、Zend FW で完全に書かれた中規模のイントラネット サイトがあります。イントラネットのデータベースは別のサーバーにあります。ここで、イントラネットをいくつかの新しい機能で拡張する必要があります。これを行うには、同じサーバー (および同じ DBMS) 上の別のデータベースに接続する必要があります。

問題は次のとおりです。これを行うための最良の方法は何ですか? 新しい Zend_Config オブジェクトと新しい Zend_Db_Adapter を作成する必要がありますか? または、既存のものを使用して、「use otherdbname;」を試してください。同じセッション内で新しいデータベースに接続するステートメント?

またはそれを行うためのさらに良い方法はありますか?

4

5 に答える 5

11

1 つのオプションは、bootstrap.php接続ごとに 1 つずつ、内から 2 つのデータベース ハンドルを登録することです。例えば:

$parameters = array(
                    'host'     => 'xx.xxx.xxx.xxx',
                    'username' => 'test',
                    'password' => 'test',
                    'dbname'   => 'test'
                   );
try {
    $db = Zend_Db::factory('Pdo_Mysql', $parameters);
    $db->getConnection();
} catch (Zend_Db_Adapter_Exception $e) {
    echo $e->getMessage();
    die('Could not connect to database.');
} catch (Zend_Exception $e) {
    echo $e->getMessage();
    die('Could not connect to database.');
}
Zend_Registry::set('db', $db);

$parameters = array(
                    'host'     => 'xx.xxx.xxx.xxx',
                    'username' => 'test',
                    'password' => 'test',
                    'dbname'   => 'test'
                   );
try {
    $db = Zend_Db::factory('Pdo_Mysql', $parameters);
    $db->getConnection();
} catch (Zend_Db_Adapter_Exception $e) {
    echo $e->getMessage();
    die('Could not connect to database.');
} catch (Zend_Exception $e) {
    echo $e->getMessage();
    die('Could not connect to database.');
}
Zend_Registry::set('db2', $db);

コントローラーで(例):

public function init()
{
     $this->db = Zend_Registry::get('db');
     $this->db2 = Zend_Registry::get('db2');
}

public function fooAction()
{
    $data = $this->db2->fetchAll('select foo from blah');
    ...
}
于 2009-10-04T13:11:18.730 に答える
3

これは、データベースを切り替える頻度に依存すると思います。2 つの異なるアダプターを使用すると、2 つのデータベースがより明確に区別され、私の好みになります。

単一のアダプターでデータベースを切り替える場合、現在アクティブなデータベースを追跡するのに苦労することは間違いありません。データベース接続は、モジュール、コントローラー、およびそれぞれのモデル間で渡されるシングルトンである可能性が高いことに注意してください。 .

3 番目のオプションは、アプリケーション全体で明示的なテーブル名を使用することです。たとえば、MySQL はdb_name.table_name-syntax を提供して、同じサーバー上の異なるデータベース内のテーブルをアドレス指定します。デフォルトのデータベースはこのように重要ではなく、この構文をすぐにサポートしますZend_Db_TableZend_Db_Select

編集:

オプション 2 と 3 は、データベース ユーザーが使用するすべてのデータベース、テーブル、および列に対して適切なアクセス権を持っている場合にのみ機能することを追加する必要があります。データベースがデータベースごとに異なるユーザーを必要とする場合は、オプション 1 が唯一の選択肢になります。

于 2009-10-04T13:21:21.017 に答える
3

私はこのConfig.iniを使用しています。あなたもそれを使うことができます:

[製造]
#デバッグ出力
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
# インクルードパス
includePaths.library = APPLICATION_PATH "/../library"
# ブートストラップ
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "ブートストラップ"
# フロントコントローラー
resources.frontController.controllerDirectory = APPLICATION_PATH "/コントローラー"
resources.frontController.env = APPLICATION_ENV
# レイアウト
#resources.layout.layout = "レイアウト"
#resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
# ビュー
resources.view.encoding = "UTF-8"
resources.view.basePath = APPLICATION_PATH "/views/"
# データベース
resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "ルート"
resources.db.params.password = ""
resources.db.params.dbname = "世界"
resources.db.isDefaultTableAdapter = true
# セッション
resources.session.save_path = APPLICATION_PATH "/../data/session"
resources.session.remember_me_seconds = 864000
【テスト:本番】
#デバッグ出力
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
# データベース
resources.db.params.dbname = "myproject_testing"
【開発:生産】
#デバッグ出力
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
# データベース
resources.db.params.dbname = "myproject_development"

次のようにデータベースの構成を2倍にすると同時に別のDBに接続する必要がある場合は、本番環境、テスト環境、および開発環境に使用できます。

resources.db2.adapter = "pdo_mysql"
resources.db2.params.host = "localhost"
resources.db2.params.username = "ルート"
resources.db2.params.password = ""
resources.db2.params.dbname = "世界"
resources.db2.isDefaultTableAdapter = true

次に、ブートストラップまたは好きな場所にロードできます:)そしてそれも簡単です

于 2009-10-04T18:55:38.390 に答える
3

最良の方法の1つは次のとおりです。

データベース上の任意のテーブルの新しいモデル テーブルを作成します。

class Article extends Zend_Db_Table_Abstract  
{    
    protected $_name = 'id';
    public  function __construct()  {
        $adaptor = new Zend_Db_Adapter_Pdo_Mysql(array(
            'host'     => 'localhost',
            'username' => 'username',
            'password' => 'password',
            'dbname'   => 'database'

        ));
        $this->_db = $adaptor;
        parent::__construct();
    }

    // your functions goes here
    public function add($data) {
        // any syntax
    }
}
于 2013-06-01T08:16:23.953 に答える