Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 06-08-2010 12:43:38

Seubeu
Membre
Date d'inscription: 28-09-2009
Messages: 19

[Résolu] Message: Cannot refresh row as parent is missing

Bonjour a tous,

Malgré pas mal de recherches je n'arrive pas a trouvé d'où vient mon problème sur un bête Save();

Voila ma table :

Code:

CREATE TABLE `Items` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(45) default NULL,
  `language` varchar(5) default NULL,
  `Type_id` int(11) NOT NULL,
  `ISBN` varchar(45) NOT NULL,
  `referent` int(11) default NULL,
  `year` varchar(6) default NULL,
  `authors` varchar(45) NOT NULL,
  `price` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `UNIQUE` (`ISBN`),
  KEY `fk_Tools_Types` (`Type_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;

Ma Classe Table :

Code:

class Model_DbTable_ToolsTable extends Zend_Db_Table_Abstract
{
    protected $_name = 'Items';
    protected $_primary='id';  // j'ai rajouté ces 2 lignes apres des recherches sur les fofo mais rien de mieux
    protected $_sequence=true; //
}

Et mon insert tout bete :

Code:

    public function addTool ($data)
    {
       $newTool = $this->ToolsTable->createRow($data);
       return $newTool->save();
    }

L'insert se fait bien dans la base de donnée mais l'exception est lancée juste apres :

#0 /usr/share/Zend/Db/Table/Row/Abstract.php(497): Zend_Db_Table_Row_Abstract->_refresh()
#1 /usr/share/Zend/Db/Table/Row/Abstract.php(438): Zend_Db_Table_Row_Abstract->_doInsert()
#2 /home/sebdev/public_html/library/App/ToolService.php(88): Zend_Db_Table_Row_Abstract->save()
#3 /home/sebdev/public_html/application/controllers/ToolsController.php(69): App_Toolservice->addTool(Array)
#4 /home/sebdev/public_html/application/controllers/ToolsController.php(41): ToolsController->postBack()
#5 /usr/share/Zend/Controller/Action.php(513): ToolsController->addAction()
#6 /usr/share/Zend/Controller/Dispatcher/Standard.php(289): Zend_Controller_Action->dispatch('addAction')
#7 /usr/share/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#8 /usr/share/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
#9 /usr/share/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#10 /home/sebdev/public_html/public/index.php(34): Zend_Application->run()
#11 {main}

En regardant avec un Profiler je me suis rendu compte qu'il lance une requete juste apres l'insert pour son refresh :

0.00816     INSERT INTO `Items` (`id`, `name`, `language`, `Type_id`, `ISBN`, `referent`, `year`, `authors`, `price`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)     array('1'=>'', '2'=>'qsdgqs', '3'=> ... )
0.00041    SELECT `Items`.* FROM `Items` WHERE (`Items`.`id` = 0) LIMIT 1    NULL

QUESTION : Pourquoi cherche-t-il donc a lister mes items où id = 0 ???

Solution pourrie : Ajouté un item factice avec un id=0....


Merci de votre aide pour une bien meilleure solutions smile

Dernière modification par Seubeu (11-08-2010 17:09:42)

Hors ligne

 

#2 06-08-2010 17:22:53

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Résolu] Message: Cannot refresh row as parent is missing

Hello,

Après le INSERT, un SELECT est toujours réalisé au cas où un trigger viendrait modifier un champs (ou plusieurs).

Par contre je pencherais pour supprimer tes 2 lignes (trouvées par recherche) car dans ce cas tu empêche Zend_Db_Table_Abstract::_setupPrimaryKey() de faire son travail.

Code:

class Model_DbTable_ToolsTable extends Zend_Db_Table_Abstract
{
    protected $_name = 'Items';
}

Si tu trouves des pertes de perf, il faut mieux activer un cache des métadonnées.

@+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#3 06-08-2010 17:35:46

Seubeu
Membre
Date d'inscription: 28-09-2009
Messages: 19

Re: [Résolu] Message: Cannot refresh row as parent is missing

Salut merci de ta réponse.

Cependant même en supprimant ces lignes le problème reste le même.
Je comprend l'intérêt du refresh, néanmoins il devrait faire un select sur le LastInsertID et pas 0 comme c'est le cas ici. Je ne comprends pas pourquoi il ne récupère pas le last ID. :'(

Je continu d'avancer avec ma soluss pourrie (une entrée dans la BDD avec un ID=0) mais c'est nul. Ça fonctionne (aucune erreur apparente) mais c'est nul.

Si quelqu'un a une idée d'où vient le problème ou peut m'aider a débug je suis preneur !


Merci.

Seb.


PS : Une petite précision qui n'a certainement aucune importance mais j'utilise un ServiceLayer pour déclarer mes fonctions CRUD.

Dernière modification par Seubeu (06-08-2010 17:39:58)

Hors ligne

 

#4 09-08-2010 10:48:03

Seubeu
Membre
Date d'inscription: 28-09-2009
Messages: 19

Re: [Résolu] Message: Cannot refresh row as parent is missing

UP

Hors ligne

 

#5 10-08-2010 15:27:24

maryooman
Membre
Date d'inscription: 15-02-2010
Messages: 106

Re: [Résolu] Message: Cannot refresh row as parent is missing

Code:

public function addTool ($data)
    {
       $newTool = $this->ToolsTable->createRow($data);
       return $newTool->save();
    }

je suppose que $data viens d'un formulaire qui contient une ligne ID en 'hidden'

Et bien retire la en faisant :

Code:

public function addTool ($data)
    {
       $newTool = $this->ToolsTable->createRow($data);

       $newTool ->name= $form['name'];
       $newTool ->language= $form['language'];
       etc ....

       return $newTool->save();
    }

il faut lister tous tes champs, SANS mettre l'id

++

Dernière modification par maryooman (10-08-2010 15:31:01)

Hors ligne

 

#6 11-08-2010 17:09:03

Seubeu
Membre
Date d'inscription: 28-09-2009
Messages: 19

Re: [Résolu] Message: Cannot refresh row as parent is missing

Rah Mortel ! Quelle connerie je n'y avais pas pensé ! Merci beaucoup !!!

Plutôt que de me taper tous les champs du form j'ai fais comme ca :

Code:

 public function addTool ($data)
    {
       if(isset($data['id'])) unset ($data['id']);
       $newTool = $this->ToolsTable->createRow($data);
       return $newTool->save();
    }

Merci encore ! smile

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