我正在尝试使用Zend Framework连接到两个数据库。它是如何扔给我以下错误
#0 C:xamppphpzflibraryZendDbStatement.php(300): Zend_Db_Statement_Pdo->_execute(Array)
#1 C:xamppphpzflibraryZendDbAdapterAbstract.php(479): Zend_Db_Statement->execute(Array)
#2 C:xamppphpzflibraryZendDbAdapterPdoAbstract.php(238): Zend_Db_Adapter_Abstract->query(Object(Zend_Db_Select), Array)
#3 C:xamppphpzflibraryZendDbAdapterAbstract.php(736): Zend_Db_Adapter_Pdo_Abstract->query(Object(Zend_Db_Select), Array)
#4 C:xampphtdocsne11133_multiDBapplicationmodelsDbTableCandyEligible.php(15): Zend_Db_Adapter_Abstract->fetchAll(Object(Zend_Db_Select))
#5 C:xampphtdocsne11133_multiDBapplicationmodelsIndex.php(179): Application_Model_DbTable_CandyEligible->test()
#6 C:xampphtdocsne11133_multiDBapplicationcontrollersIndexController.php(22): Application_Model_Index->getTest()
#7 C:xamppphpzflibraryZendControllerAction.php(516): IndexController->indexAction()
#8 C:xamppphpzflibraryZendControllerDispatcherStandard.php(295): Zend_Controller_Action->dispatch('indexAction')
#9 C:xamppphpzflibraryZendControllerFront.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#10 C:xamppphpzflibraryZendApplicationBootstrapBootstrap.php(97): Zend_Controller_Front->dispatch()
#11 C:xamppphpzflibraryZendApplication.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#12 C:xampphtdocsne11133_multiDBpublicindex.php(26): Zend_Application->run()
#13 {main}
因此,我在statement.php中查看了该函数,发现似乎没有任何DB参数被传入。不幸的是,我不知道为什么,在寻找解决方案时也没有太多,所以我希望这里的人能帮我一把。以下是与此相关的代码(出于安全目的,已更改名称)
application.ini-Am正在使用dev
[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
resources.layout.layout = "layout"
resources.multidb.candy.adapter = PDO_MYSQL
resources.multidb.candy.host = local
resources.multidb.candy.username = name
resources.multidb.candy.password = pass
resources.multidb.candy.dbname = db
resources.multidb.vt3.adapter = PDO_MYSQL
resources.multidb.vt3.host = not_local
resources.multidb.vt3.username = name
resources.multidb.vt3.password = pass
resources.multidb.vt3.dbname = db2
[staging : production]
resources.multidb.candy.adapter = PDO_MYSQL
resources.multidb.candy.host = local
resources.multidb.candy.username = name
resources.multidb.candy.password = pass
resources.multidb.candy.dbname = db
resources.multidb.vt3.adapter = PDO_MYSQL
resources.multidb.vt3.host = not_local
resources.multidb.vt3.username = name
resources.multidb.vt3.password = pass
resources.multidb.vt3.dbname = db2
[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.multidb.candy.adapter = PDO_MYSQL
resources.multidb.candy.host = local
resources.multidb.candy.username = name
resources.multidb.candy.password = pass
resources.multidb.candy.dbname = db
resources.multidb.vt3.adapter = PDO_MYSQL
resources.multidb.vt3.host = not_local
resources.multidb.vt3.username = name
resources.multidb.vt3.password = pass
resources.multidb.vt3.dbname = db2
[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1
resources.multidb.candy.adapter = PDO_MYSQL
resources.multidb.candy.host = 192.168.1.34
resources.multidb.candy.username = name
resources.multidb.candy.password = pass
resources.multidb.candy.dbname = db
resources.multidb.candy.default = FALSE
resources.multidb.vt3.adapter = PDO_MYSQL
resources.multidb.vt3.host = 192.168.1.32
resources.multidb.vt3.username = name
resources.multidb.vt3.password = pass
resources.multidb.vt3.dbname = db2
resources.multidb.vt3.default = TRUE
引导
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
public function __init()
{
$options = array(
'layout'=>'layout',
'layoutPath'=>'/application/layouts',
);
$layout = Zend_Layout::startMvc($options);
}
public function _initDbRegistry()
{
$this->bootstrap('multidb');
$multidb = $this->getPluginResource('multidb');
Zend_Registry::set('db_candy', $multidb->getDb('candy'));
Zend_Registry::set('db_vt3', $multidb->getDb('vt3'));
}
}
数据库模型
<?php
class Application_Model_DbTable_CandyEligible extends Zend_Db_Table_Abstract
{
protected $_name = 'table_name';
protected $_adapter = 'db_candy';
public function test()
{
$select = $this->_db->select();
$select->from($this->_name);
try{
$results = $this->_db->fetchAll($select);
}catch(Exception $exc){
echo '<pre>'.$exc->getTraceAsString().'</pre>';
}
return $result;
}
}
由于这至少是一个功能,可以查看它是否连接到数据库,并且我可以读取它们,因此控制器(和索引模型)只是在回显结果
我是这样做的:在引导中
$multiDb = $this->getPluginResource('multidb');
Zend_Registry::set('multidb', $multiDb);
然后,对于使用candy数据库的模型,我创建像这样的父类
abstract class App_Db_CandyTable extends App_Db_Table
{
public function __construct($config = array(), $definition = null)
{
// use dns connection
$multiDbResource = Zend_Registry::get('multidb');
$adapter = $multiDbResource->getDb('candy');
parent::__construct($adapter);
}
}
也就是说,您从App_Db_CandyTable继承了模型类,它将自动选择适当的连接
我不认为$_adapter是Zend-Table类的属性。
我认为您可以通过重写_setupDatabaseAdapter函数来设置表的适配器:
protected function _setupDatabaseAdapter()
{
$db = Zend_Registry::get('db_candy');
$this->_db = $db;
parent::_setupDatabaseAdapter();
}