Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Hello,
Lors du save() sur un Zend_Db_Table_Row:
$table = new Zend_Db_Table(); $row = $table->createRow($data); $id = row->save();
Mais pas quel est l'incrément courant, si c'est plutôt cela la question.
A+
Hors ligne
MySQL est très limité sur les incréments il ne connais pas les séquence et on ne peut donc pas prévoir à l'avance quel sera le prochain incrément.
on peut interroger la table pour connaitre la veleur courante de l'imcrément mais il n'y a aucun garantie que se sera celui-ci qui sera utilisé.
voir la doc sur Zend_Db_Table
A+JYT
Hors ligne
Je pensais qu'il y aurait une méthode assez simple.
J'ai donc fais ma fonction que j'ai mis dans la classe modèle :
class TPhotos extends Zend_Db_Table_Abstract { protected $_name = 'photos'; protected $_primary = 'idPhoto'; public function nextId() { $select = $this->_db->select(); $select ->from($this->_name, "max(idPhoto)"); $result = $this->_db->fetchOne($select); return $result+1; } }
Merci pour vos réponses.
Hors ligne
Et lastInsertId te convient pas ?
Hors ligne
public function nextId() { $sql = "SHOW TABLE STATUS LIKE '?'"; $result = $db->fetchAll($sql, $this->_name) return $result->Auto_increment; }
Mais cela ne te donne pas le prochain incrément car MySQL ne sait as te garantir qu'il ne sera pas utilisé entre ton appel à nextId et le moment ou tu feras l'insert
en clair
si tu fais
lecture du prochain ID
création d'un row avec cet id
insertion de row dans la base
tu t'expose à un "duplicate Key"
l'explication est très simple imagine que deux utilisateur soient connectés à ton appli
dans la base le prochain incrément est 5
les deux lient lance ton script
le premier passe sur l'instruction nextId et obtient 5
il crée son row avec l'id 5
le deuxième client passe sur l'instruction nextId et obtient aussi 5
il crée son row avec l'id 5
le premier fait sont insert et place un row avec l'id 5 le prochain id est 6
le deuxième utilisateur fait sont insert avec l'id 5 et obtient une erreur duplicate key
tu ne peux donc pas utiliser nexId pour fixer l'id du row tu pourrais alors utiliser la stratégie suivante
lecture de l'id
creation du row sans id
insertion du row
dans ce cas tu n'aurais pas de duplicate key mais ton deuxième utilisateur aurrais l'id 5 alors que dans la base sont row a l'id 6
il ne reste avec mysql qu'une seule solution
créer un row sans id
l'insérer dans la base (ZF te donne alors l'id utilisé)
c'est donc le save qui te donne l'id (ton objet row est mise à jour automatiquement)
du coup la méthode nextId ne te sert à rien.
il est impossible avec mysql d'obtenir en prévisionnel l'id qui sera utilisé pour cela il faut un moteur de base de donnée qui supporte les séquences
PEAR propose une solution au prix de la modification de la structure de la base.
pour chaque table tu crée la table et une table d'index
la table d'index contient un autoincrément et la table contient les donnée et son Id est en relation 1-0 1-1 avec la table d'index.
pour obtenir ton id tu insère un élément dans la table index il consomme alors l'autoincrément et te le retourne il te sert alors d'id dans la table pour faire ton inser.
c'est bigrement lourd est complexe pour pas grand chose.
mieux vaut utiliser la stratégie à postériori qui a ses inconvénient pas reste native
A+JYT
Hors ligne
Pages: 1