Zend_Log_Writer_Db - вызов неопределенного метода Zend_Config :: insert () - PullRequest
2 голосов
/ 28 февраля 2012

Я использую php 5.2.12 и Zend Framework 5.0.2

В моем Bootstrap.php я инициализирую соединение с базой данных и инициализирую наш регистратор ... помещая оба файла в реестр.

Однако, когда я пытаюсь записать информацию в IndexController.php, выдается следующее сообщение: «* Неустранимая ошибка: вызов неопределенного метода Zend_Config :: insert () в / usr / local / zendsvr / share / ZendFramework /library / Zend / Log / Writer / Db.php в строке 137 * "

В нижней части этого поста вы найдете файл класса 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);
    }

}

приложения.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 Ответ

2 голосов
/ 28 февраля 2012
  • Что происходит: вы вызываете метод с именем 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);
...