Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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 :
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 :
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 :
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
Dernière modification par Seubeu (11-08-2010 17:09:42)
Hors ligne
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.
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.
@+
Hors ligne
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
UP
Hors ligne
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 :
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
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 :
public function addTool ($data) { if(isset($data['id'])) unset ($data['id']); $newTool = $this->ToolsTable->createRow($data); return $newTool->save(); }
Merci encore !
Hors ligne
Pages: 1