2010-01-25 16 views
1

J'essaie d'apprendre ZF, mais a une erreur étrange après 20 minutes :)Zend Framework: Erreur 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' 

Qu'est-ce que cette erreur? J'ai des informations de DB dans mon fichier de configuration:

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

Des suggestions?

EDIT:

Ceci est mon fichier modèle /app/models/DbTable/Bands.php:

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

action du contrôleur Index:

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

EDIT Tous les codes:

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(); 
    } 
} 

configs/application.ini, base de données et le mot de passe fourni changé:

[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 

modèles/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

Pouvez-vous afficher le code dans lequel vous instanciez l'adaptateur db? Le code avant et y compris 'Zend_Db :: factory (/ * vos paramètres de configuration * /)' (je présume) –

+0

Vous êtes ici, la fonction :) fonction statique publique setupDatabase() { $ config = self :: $ registry-> configuration; $ db = Zend_Db :: factory ($ config-> db-> adaptateur, $ config-> db-> toArray()); $ db-> query ("SET NAMES 'utf8'"); self :: $ registry-> base de données = $ db; Zend_Db_Table :: setDefaultAdapter ($ db); PS Je ne sais pas comment inclure du code dans le commentaire, quelqu'un peut-il le réparer? –

+0

En outre, les informations de configuration que vous affichez, les informations littérales? Si oui, je ne suppose pas que le nom de votre base de données est 'name', n'est-ce pas? Changez cela pour représenter le nom de votre base de données. (avec nom d'utilisateur et mot de passe pour les informations d'identification bien sûr) –

Répondre

0

Remplacer

public static function setupDatabase()

Avec

protected function _initDatabase()

... et essayez à nouveau

Je suppose que vous êtes tout simplement pas appeler la méthode statique que vous avez défini. Mais lorsque vous créez une méthode protégée commençant par _init, elle est automatiquement exécutée lors de l'amorçage.

PS .:
Vous voulez probablement vraiment attribuer un mot de passe à l'utilisateur root de votre base de données, même s'il s'agit d'un serveur de test. Juste pour être sauvé. Si quelqu'un est capable d'accéder à votre serveur de test, vous pouvez exposer des informations précieuses sur le client si vous n'avez pas de mot de passe. root est le premier utilisateur qu'ils vont essayer. Mieux encore, serait d'attribuer un combo utilisateur/passe différent à chaque base de données individuelle.

+0

Vous voyez, je fournir des données correctes: 'resources.db.adapter = pdo_mysql resources.db.host = localhost resources.db.username = racine resources.db.password = resources.db.dbname = zend ' –

+0

Toujours le même :) –

0

Il semble que vous n'êtes pas en cours d'exécution l'application avec la valeur correcte dans le var environnement APPLICATION_ENV puis il essaie de charger une autre partie du fichier de configuration au lieu de development:production

Vérifiez que vous exécutez votre application web sous l'environnement correct var

  • Pour Apache mis cela à l'intérieur de votre <virtualhost>

    SetEnv développement APPLICATION_ENV

  • Vous pouvez également essayer de forcer de APPLICATION_ENV var dans votre index.php

1

Pour conclure enfin peut-être cette discussion avec la solution correcte, voici le mien:

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 

La chaîne params était manquante.