Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 26-11-2008 16:51:10

ALkyD
Membre
Lieu: Limoges
Date d'inscription: 11-07-2007
Messages: 69
Site web

[Résolu] [Zend_Db_Table_Abstract] Erreur avec setDefaultMetadataCache

Salut,

Pour des question de performances, je me suis décidé à cacher les méta-données de mes tables SQL (héritant toutes de Zend_Db_Table_Abstract). Le problème, c'est que je rencontre systématiquement l'erreur suivante quand ZF essaye d'accéder aux cache des méta-données :

Code:

Exception : Primary key column(s) (id_categorie) are not columns in this table (0,1)

La table en question :

Code:

CREATE TABLE `news_categorie` (
  `id_categorie` smallint(3) unsigned NOT NULL auto_increment,
  `libelle_categorie` varchar(100) NOT NULL
  PRIMARY KEY  (`id_categorie`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;

Code:

class Db_Table_News_Categorie extends Zend_Db_Table_Abstract
{
    protected $_primary = 'id_categorie';

    protected $_dependentTables = array('Db_Table_News');

    protected function _setupTableName()
    {
        $this->_name = 'news_categorie';
        parent::_setupTableName();
    }

      ...
}

Je précise sur l'erreur survient alatoirement et avec n'importe quelle table. Dans le bootstrap, j'initialise mon cache et la connexion BDD de la façon suivante :

Code:

// Zend_Cache
$cache = new Zend_Cache_Core();
$cache->setOption('lifetime', null);
$cache->setOption('automatic_serialization', true);
$cache->setOption('caching', true);
$cache->setBackend(new Zend_Cache_Backend_File(array('cache_dir' => '_cache/')));

// Connexion à la base de données
try
{
    $db = new Zend_Db_Adapter_Mysqli($dbConfig);
    $db->getConnection();
    Zend_Db_Table_Abstract::setDefaultAdapter($db);
     Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);
}
catch (Zend_Db_Adapter_Exception $e)
{
    die($e->getMessage());
}

La doc du ZF ne donne pas beaucoup de pistes sur cette erreur... Une idée ?

Merci wink

Dernière modification par ALkyD (26-11-2008 18:08:24)

Hors ligne

 

#2 26-11-2008 18:06:32

ALkyD
Membre
Lieu: Limoges
Date d'inscription: 11-07-2007
Messages: 69
Site web

Re: [Résolu] [Zend_Db_Table_Abstract] Erreur avec setDefaultMetadataCache

Je vais me répondre à moi-même car après deux heures de recherche, j'ai enfin trouvé la solution du problème, qui n'est autre qu'un bug de conception du ZF.

Tout est histoire d'identifiant de cache. En reprenant la table ci-dessus, l'identifiant de cache de Db_Table_News_Categorie est 7b03ae18811a47e6197b4c6483d0daf6 (utilisation de md5 sur le nom de la table).

Etant donné que j'utilise également Zend_Cache pour des données classiques, il y a plusieurs identifiants de cache qui sont utilisés lors de la génération de la page Web. Soit le code suivant :

Code:

if (! $data = $cache->load('toto'))
{
    // A ce moment-là, le dernier identifiant mémorisé par Zend_Cache (variable privée : $_lastId) est 'toto'

   // Traitement SQL
   $table = new Db_Table_News_Categorie();
   ...
   // Utilisation du métacache de données => $_lastId prend l'identifiant 7b03ae18811a47e6197b4c6483d0daf6.

   // Sauvegarde du cache
   $cache->save($data);  
   // Si on ne fournit pas d'identifiant en deuxième paramètre, Zend_Cache utilise $_lastId. 
   // Dans ce cas, il utilise 7b03ae18811a47e6197b4c6483d0daf6, c'est donc normal que ça plante ensuite, 
   // car les mauvaises données sont cachées.
   // Avec $cache->save($data, 'toto'), tout refonctionne.
}

Moralité : toujours mettre l'identifiant de cache à la méthode Zend_Cache::save() wink

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages