连接到与Zend框架两个不同的数据库(connecting to two different dat

2019-07-20 19:05发布

我这里这是在Zend的FW完全用一个中等大小的内部网站上。 对于企业内部网的数据库位于另一台服务器上。 现在我需要一些新的功能扩展的企业内部网。 为了做到这一点,我需要连接到另一个数据库在同一台服务器(和同DBMS)上。

现在的问题是:什么是做到这一点的最好方法是什么? 我应该创建一个新的Zend_Config对象和新的Zend_Db_Adapter会? 或者我应该利用现有的一个,并与试图“用otherdbname;” 声明在同一会话中连接到新的数据库?

还是有更好的方法来做到这一点?

Answer 1:

一种选择是注册2数据库从内处理bootstrap.php ,每一个连接。 例如:

$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');
    ...
}


Answer 2:

我认为这取决于你有多久切换数据库。 使用两个不同的适配器将更加清晰地两个数据库之间的区分和将是我的偏好。

当你的一个适配器上的交换数据库,你一定也很难追查哪个数据库是当前活动 -请记住,您的数据库连接是最有可能被模块,其控制人及其各自的模型之间传递一个单身。

第三个选择是整个应用程序中使用显式表名。 MySQL的示例提供了db_name.table_name -syntax以解决在同一服务器上在不同的数据库中的表。 默认的数据库不要紧这种方式和Zend_Db_TableZend_Db_Select支持此语法开箱。

编辑:

我要补充的是选项2,如果你的数据库用户对所有要使用数据库,表和列相应的访问权限3只工作。 选项1会留下,唯一的选择,如果你的数据库需要在每个数据库的不同用户。



Answer 3:

我使用这个的Config.ini你可以,你也可以用它:

  [生产]  #调试输出  phpSettings.display_startup_errors = 0  phpSettings.display_errors = 0  #include路径  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 “/布局/脚本”  #查看  resources.view.encoding = “UTF-8”  resources.view.basePath = APPLICATION_PATH “/视图/”  #数据库  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 =真  #会议  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” 

你可以用它来生产,测试和开发环境,如果你需要连接到另一个数据库在同一时间,你可以双击像数据库的配置:

resources.db2.adapter = "pdo_mysql"
resources.db2.params.host = "localhost"
resources.db2.params.username = "root"
resources.db2.params.password = ""
resources.db2.params.dbname = "world"
resources.db2.isDefaultTableAdapter = true

那么你可以加载在bootstap或任何你喜欢的地方:)其也容易



Answer 4:

最好的方法之一是:

创建新模型表上的数据库中的任何表:

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
    }
}


Answer 5:

从我发现在这里 ,为了一个Zend应用程序中使用不同的数据库,你可以按照这两种可能的方法之一,根据您的需要:

- 具有相同的主机/用户对两个数据库

您可以指定要使用初始化数据库$_schema模型中的变量,如下所示:

class Customer extends Zend_Db_Table_Abstract
{
    protected $_name   = 'customer';
    protected $_schema = 'db_name';

    ....
}

- 具有不同的主机/用户对两个数据库

application.ini你必须写两个数据库的配置如下:

resources.multidb.local.adapter                 = pdo_mysql
resources.multidb.local.host                    = localhost
resources.multidb.local.username                = user
resources.multidb.local.password                = ******
resources.multidb.local.dbname                  = db_name_1
resources.multidb.local.default                 = true

resources.multidb.remote.adapter                = pdo_mysql
resources.multidb.remote.host                   = remote_host
resources.multidb.remote.username               = user
resources.multidb.remote.password               = ******
resources.multidb.remote.dbname                 = db_name_2
resources.multidb.remote.default                = false

添加_initDbRegistry块引导将数据库添加到注册表,这样你就可以访问它们:

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

    /**
     * Add databases to the registry
     * 
     * @return void
     */
    public function _initDbRegistry()
    {
        $this->bootstrap('multidb');
        $multidb = $this->getPluginResource('multidb');
        Zend_Registry::set('db_local', $multidb->getDb('local')); //db_local is going to be the name of the local adapter
        Zend_Registry::set('db_remote', $multidb->getDb('remote')); //db_remote is going to be the name of the remote adapter
    }

}

现在,您可以指定要使用的各型号的适配器,如下所示:

class Customer extends Zend_Db_Table_Abstract
{
    protected $_name    = 'customer';
    protected $_schema  = 'db_name_1';
    protected $_adapter = 'db_local'; //Using the local adapter

    ....
}

class Product extends Zend_Db_Table_Abstract
{
    protected $_name    = 'product';
    protected $_schema  = 'db_name_2';
    protected $_adapter = 'db_remote'; //Using the remote adapter

    ....
}


文章来源: connecting to two different databases with Zend Framework