- 1
[Opened] [Résolu] erreur avec saveToDao
Posted by fredo59 on 12/06/2009 19:34
Bonjour,
j'ai l'erreur
[notice 8] Trying to get property of non-object /var/www/jelix-1.1/temp/jtest/compiled/daos/modules/users~users~mysql.php 267 [notice 8] Trying to get property of non-object /var/www/jelix-1.1/temp/jtest/compiled/daos/modules/users~users~mysql.php 268
Les lignes 267 et 268 correspondent dans users~users~mysql.php à
$record->created = $newrecord->created; $record->modified = $newrecord->modified;
dans la fonction suivante :
public function insert ($record){ $query = 'INSERT INTO `'.$this->_conn->prefixTable('pgi2_users').'` ( `id`,`nom`,`prenom`,`mail`,`droit`,`uid`,`deleted`,`created`,`modified` ) VALUES ('.($record->id === null ? 'NULL' : intval($record->id)).', '. ($record->nom === null ? 'NULL' : $this->_conn->quote($record->nom,false)). ', '.($record->prenom === null ? 'NULL' : $this->_conn->quote($record->prenom,false)). ', '.($record->mail === null ? 'NULL' : $this->_conn->quote($record->mail,false)).', '. ($record->droit === null ? 'NULL' : intval($record->droit)).', '. ($record->uid === null ? 'NULL' : $this->_conn->quote($record->uid,false)). ', '.($record->deleted === null ? 'NULL' : intval($record->deleted)). ', NOW(), NOW() )'; $result = $this->_conn->exec ($query); $query ='SELECT `created`, `modified` FROM `'.$this->_conn->prefixTable('pgi2_users').'` WHERE `id`'.'='.intval($record->id).''; $rs = $this->_conn->query ($query); $newrecord = $rs->fetch (); $record->created = $newrecord->created; $record->modified = $newrecord->modified; return $result; }
L'erreur est due aux lignes suivantes dans le dao.xml car je n'ai plus l'erreur lorsque je les commente.
<property name="created" fieldname="created" datatype="datetime" insertpattern="NOW()" /> <property name="modified" fieldname="modified" datatype="datetime" insertpattern="NOW()" updatepattern="NOW()" />
La table :
CREATE TABLE IF NOT EXISTS `pgi2_users` ( `id` int(11) NOT NULL auto_increment, `nom` varchar(100) NOT NULL, `prenom` varchar(100) NOT NULL, `mail` varchar(100) NOT NULL, `droit` tinyint(4) NOT NULL, `uid` varchar(6) NOT NULL, `deleted` tinyint(4) NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`), KEY `nom` (`nom`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ;
users.dao.xml :
<?xml version="1.0" encoding="UTF-8"?> <dao xmlns="http://jelix.org/ns/dao/1.0"> <datasources> <primarytable name="pgi2_users" realname="pgi2_users" primarykey="id" /> </datasources> <record> <property name="id" fieldname="id" datatype="int" required="true"/> <property name="nom" fieldname="nom" datatype="string" required="true" maxlength="100"/> <property name="prenom" fieldname="prenom" datatype="string" required="true" maxlength="100"/> <property name="mail" fieldname="mail" datatype="string" required="true" maxlength="100"/> <property name="droit" fieldname="droit" datatype="int" required="true"/> <property name="uid" fieldname="uid" datatype="string" required="true" maxlength="6"/> <property name="deleted" fieldname="deleted" datatype="int" required="true" /> <property name="created" fieldname="created" datatype="datetime" insertpattern="NOW()" /> <property name="modified" fieldname="modified" datatype="datetime" insertpattern="NOW()" updatepattern="NOW()" /> </record> <factory> <method type="select" name="tri"> <parameter name="condition" default="1" /> <parameter name="colonne" default="nom" /> <parameter name="sens" default="asc" /> <conditions> <eq property="deleted" expr="$condition" /> </conditions> <order> <orderitem property="$colonne" way="$sens" /> </order> </method> </factory> </dao>
l'action d'insert :
function sauver_add() { $f = jForms::fill("users~user"); $f->saveToDao("users~users"); $view = $this->getResponse('redirect'); $view->action="users~default:index"; $view->params = array('cond' => '0','tri' => 'asc', 'col'=>'nom'); return $view; }
Par contre l'insertion dans la base se fait correctement car les champs created et modified sont renseignés.
J'ai déja utilisé ce code plusieurs fois sans problème dans d'autres modules et là, ca coince...
Merci de votre aide
[Opened] Re: erreur avec saveToDao
Posted by laurentj on 12/07/2009 19:31
Salut,
à priori, il ne trouve pas l'enregistrement. Tout simplement parce que tu n'as pas indiqué dans ton dao que le type du champs id était autoincrement. Du coup, la méthode insert s'attend à ce que ce champs soit indiqué dans le record que tu lui donne.
Donc, type="autoincrement" sur le id dans ton dao.
[Opened] Re: erreur avec saveToDao
Posted by fredo59 on 12/08/2009 20:34
C'était bien cela. Merci.
J'ai d'abord créé ma table puis le dao avec le script. Je me suis ensuite aperçu que j'avais oublié de définir la clé primaire de ma table, ce que j'ai fait.
Je n'ai jamais pensé à l'incidence sur le dao...
Sinon, bravo pour le travail accompli et la qualité de ce framework que je continue de découvrir.
- 1