2010-01-25 4 views
1

Я пытаюсь научиться ZF, но получил странную ошибку после 20 минут :)Zend Framework: Zend_Db Ошибка

Fatal error: Uncaught exception 'Zend_Db_Adapter_Exception' with message 'Configuration array must have a key for 'dbname' that names the database instance' 

Что означает эта ошибка? Я получил информацию о DB в файле конфигурации:

resources.db.adapter=pdo_mysql 
resources.db.host=localhost 
resources.db.username=name 
resources.db.password=pass 
resources.db.dbname=name 

Любые предложения?

EDIT:

Это мой файл модели /app/models/DbTable/Bands.php:

class Model_DbTable_Bands extends Zend_Db_Table_Abstract 
{ 
    protected $_name = 'zend_bands'; 
} 

Индекс действия контроллера:

public function indexAction() 
{ 
    $albums = new Model_DbTable_Bands(); 
    $this->view->albums = $albums->fetchAll(); 
} 

EDIT Все коды:

bootstrap.php

protected function _initAutoload() 
{ 
    $autoloader = new Zend_Application_Module_Autoloader(array(
     'namespace' => '', 
     'basePath' => dirname(__FILE__), 
    )); 
    return $autoloader; 
} 

protected function _initDoctype() 
{ 
    $this->bootstrap('view'); 
    $view = $this->getResource('view'); 
    $view->doctype('XHTML1_STRICT'); 
} 

public static function setupDatabase() 
{ 
    $config = self::$registry->configuration; 
    $db = Zend_Db::factory($config->db); 
    $db->query("SET NAMES 'utf8'"); 
    self::$registry->database = $db; 
    Zend_Db_Table::setDefaultAdapter($db); 
     Zend_Db_Table_Abstract::setDefaultAdapter($db); 
} 

IndexController.php

class IndexController extends Zend_Controller_Action 
{ 

    public function init() 
    { 
     /* Initialize action controller here */ 
    } 

    public function indexAction() 
    { 
     $albums = new Model_DbTable_Bands(); 
     $this->view->albums = $albums->fetchAll(); 
    } 
} 

конфиги/application.ini, изменили базу данных и при условии пароль:

[development : production] 
phpSettings.display_startup_errors = 1 
phpSettings.display_errors = 1 
db.adapter = PDO_MYSQL 
db.params.host = localhost 
db.params.username = root 
db.params.password = pedro 
db.params.dbname = test 

модели/DbTable/Bands.php

class Model_DbTable_Bands extends Zend_Db_Table_Abstract 
{ 
    protected $_name = 'cakephp_bands'; 

    public function getAlbum($id) 
    { 
     $id = (int)$id; 
     $row = $this->fetchRow('id = ' . $id); 
     if (!$row) { 
      throw new Exception("Count not find row $id"); 
     } 
     return $row->toArray();  
    } 
} 
+0

Можете ли вы показать код, в котором вы создаете экземпляр адаптера db? Код до и в том числе 'Zend_Db :: factory (/ * ваши настройки конфигурации * /)' (я полагаю) –

+0

Вот вы, функция :) public static function setupDatabase() { $ config = self :: $ registry-> конфигурации; $ db = Zend_Db :: factory ($ config-> db-> adapter, $ config-> db-> toArray()); $ db-> query ("SET NAMES 'utf8'"); self :: $ registry-> database = $ db; Zend_Db_Table :: setDefaultAdapter ($ db); } \t PS Я не знаю, как включить код в комментарий, может ли кто-нибудь его исправить? –

+0

Кроме того, есть информация о конфигурации, которую вы показываете, буквальная информация? Если да, я не предполагаю, что имя вашей базы данных является «именем»? Измените это, чтобы представить имя вашей базы данных. (вместе с именем пользователя и паролем для учетных данных, конечно) –

ответ

0

Заменить

public static function setupDatabase()

С

protected function _initDatabase()

... и попробуйте еще раз

Я полагаю, вы просто не вызвав статический метод, который вы определили. Но когда вы создаете защищенный метод, начинающийся с _init, он автоматически запускается при начальной загрузке.

PS .:
Возможно, вы действительно хотите назначить пароль для пользователя root вашей базы данных, даже если это тестовый сервер. Просто чтобы спастись. Если кто-то может получить доступ к вашему серверу тестирования, вы можете предоставить ценную информацию о клиенте, если у вас нет пароля. root - первый пользователь, которого они попробуют. Еще лучше было бы назначить другую комманду user/pass для каждой отдельной базы данных.

+0

Вы видите, я обеспечиваю правильные данные: 'resources.db.adapter = PDO_MySQL resources.db.host = локальный resources.db.username = корень resources.db.password = resources.db.dbname = Зенд ' –

+0

По-прежнему то же самое :) –

0

Кажется, что вы не используете приложение с правильным значением в APPLICATION_ENV среде вар, а затем он пытается загрузить другую часть файла конфигурации вместо development:production

Убедитесь, что вы работаете в веб-приложение под правильная среда вар

  • Для Apache поместить это внутри своего развития <virtualhost>

    SetEnv APPLICATION_ENV

  • Также вы можете попробовать, чтобы заставить де APPLICATION_ENV вар в вашем index.php

1

, может быть, наконец, завершить эту дискуссию с правильным решением, вот мое:

application.ini:

resources.db.adapter = mysqli 
resources.db.params.dbname = zftutorial 
resources.db.params.host = localhost 
resources.db.params.username = juuro 
resources.db.params.password = test 

Неисправна строка params.

Смежные вопросы