Zend_Log_Writer_Db - 调用未定义的方法Zend_Config :: insert()

时间:2012-02-28 16:58:22

标签: php database zend-framework logging undefined

我正在运行php 5.2.12和Zend Framework 5.0.2

在我的Bootstrap.php中,我初始化我们的数据库连接,并初始化我们的记录器......将它们放在注册表中。

但是,当我尝试在IndexController.php中记录信息时,它会给出以下消息: “*致命错误:在第137行的/usr/local/zendsvr/share/ZendFramework/library/Zend/Log/Writer/Db.php中调用未定义的方法Zend_Config :: insert()*”

在这篇文章的底部,你会发现Zend Framework的类文件db.php和被调用的_write函数。

我认为问题是我从application.ini获取数据库连接选项...并且我的application.ini中没有为数据库定义insert()函数。但我真的不知道如何在配置中添加一个,或者我应该如何做到这一点。

bootstrap.php中

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

    protected function _initConfig()
    {
        Zend_Registry::set('config', new Zend_Config($this->getOptions()));
    }

    protected function _initDatabases()
    {    
        $this->bootstrap('multidb');
        $resource = $this->getPluginResource('multidb');

        $databases = Zend_Registry::get('config')->resources->multidb;

        foreach ($databases as $name => $adapter)
        {
            $db_adapter = $resource->getDb($name);

            Zend_Registry::set($name, $db_adapter);
        }

    }

    protected function _initLog()
    {
        $db             = Zend_Registry::get('config')->resources->multidb->as400;

        $columnMapping  = array('ILGID'     => 'id',        //1 numeric
                                'ILGLVL'    => 'priority',  //2 numeric
                                'ILGDTE'    => 'date',      //yymmdd
                                'ILGTME'    => 'time',      //hhmmss
                                'ILGPGM'    => 'program',   //40 alnum
                                'ILGURL'    => 'url',       //2100
                                'ILGUSR'    => 'user',      //30
                                'ILGMSG'    => 'message');  //1000

        $writer         = new Zend_Log_Writer_Db($db, 'dwhlib.intralog', $columnMapping);
        $logger         = new Zend_Log($writer);


        $date = new Zend_Date();
        date_default_timezone_set('America/Chicago');


        $logger->setEventItem('id'      , 1);
        $logger->setEventItem('date'    , $date->get('Ymd'));
        $logger->setEventItem('time'    , $date->get('Hms'));
        $logger->setEventItem('program' , 'testProgramName');                   $logger->setEventItem('url'     , $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
        $logger->setEventItem('user'    , gethostbyaddr($_SERVER['REMOTE_ADDR']));


        Zend_Registry::set('logger', $logger);
    }

}

的application.ini

resources.multidb.as400.adapter = "db2"
resources.multidb.as400.host = "i5"
resources.multidb.as400.username = "removedUsername"
resources.multidb.as400.password = "removedPassword"
resources.multidb.as400.dbname = "*LOCAL"
resources.multidb.as400.default = true

IndexController.php

include("/www/zendserver/htdocs/development/application/models/as400.php");
class IndexController extends Zend_Controller_Action
{
    public function init()
    {       
        Zend_Registry::get('logger')->info("this is a test message");
    }

    public function indexAction()
    {
        // action body
    }
}

as400.php

Class default_Model_As400 extends Zend_Db {


    public static function ExecuteSelect($sql, $mode = Zend_Db::FETCH_ASSOC, $log = false)
    {
        $stmt = self::getStmt($sql);
        $stmt->setFetchMode($mode);
        $stmt->execute();

        if($log === true) {
            Zend_Registry::get('logger')->info($sql);
        }

        $rows = $stmt->fetchAll();

        return $rows;
    }

    private static function getStmt($sql){
        $db = Zend_Registry::get('config')->resources->multidb->as400;

        $abstractAdapter = new Zend_Db_Adapter_Db2($db);

        return new Zend_Db_Statement_DB2($abstractAdapter, $sql);
    }

    public function insert($libAndFile, $arrData){
        echo "this was hit!!";
    }
}

db.php中

class Zend_Log_Writer_Db extends Zend_Log_Writer_Abstract
{
    public function __construct($db, $table, $columnMap = null)
        {
            $this->_db    = $db;
            $this->_table = $table;
            $this->_columnMap = $columnMap;
        }


    protected function _write($event)
    {
        if ($this->_db === null) {
            require_once 'Zend/Log/Exception.php';
            throw new Zend_Log_Exception('Database adapter is null');
        }

        if ($this->_columnMap === null) {
            $dataToInsert = $event;
        } else {
            $dataToInsert = array();
            foreach ($this->_columnMap as $columnName => $fieldKey) {
                $dataToInsert[$columnName] = $event[$fieldKey];
            }
        }

        $this->_db->insert($this->_table, $dataToInsert);
    }
}

1 个答案:

答案 0 :(得分:2)

  • 正在发生的事情:您正在insert()个实例上调用名为Zend_Config的方法。
  • 您想要的内容:通过insert()调用方法Zend_Db_Adapter

_initLog()引导程序方法有问题:

$db = Zend_Registry::get('config')->resources->multidb->as400;
$writer = new Zend_Log_Writer_Db($db, 'dwhlib.intralog', $columnMapping);

Zend_Log_Writer_Db期望Zend_Db适配器作为第一个构造函数参数。要解决此问题,因为您已在注册表中注册了数据库适配器,所以应该执行以下操作:

$dbName = Zend_Registry::get('config')->resources->multidb->as400;
$db = Zend_Registry::get($dbName);
$writer = new Zend_Log_Writer_Db($db, 'dwhlib.intralog', $columnMapping);