2012-02-28 18 views
2

私は私のbootstrap.phpのではPHP 5.2.12と5.0.2 Zend FrameworkのZend_Log_Writer_Dbは - 未定義のメソッドのZend_Configに呼び出し::挿入()

を実行しています、私は私達のデータベース接続を初期化し、私たちのロガーを初期化します。..両方をレジストリに入れる。 "*致命的なエラー:/ usr/local/zendsvr/share /内の未定義のメソッドZend_Config :: insert()を呼び出すとエラーが発生します: " "

この投稿の最後には、Zend Frameworkのクラスファイルdb.phpと_write関数が呼び出されています。この記事の末尾には、ZendFramework /ライブラリ/ Zend/Log/Writer/Db.phpがあります。

問題は、私の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); 
    } 
} 

答えて

2
  • あなたがZend_Configインスタンス上insert()と呼ばれるメソッドを呼び出しています。
  • 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); 
関連する問題