Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 21-04-2009 22:46:41

jbunel
Membre
Lieu: Paris
Date d'inscription: 25-06-2008
Messages: 89
Site web

Récupération d'un auto increment d'un objet Zend_Db_Table

Bonjour
Il y a t'il un moyen de récupérer l'auto increment d'un objet zend_db_table ?

Hors ligne

 

#2 22-04-2009 08:29:29

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

Re: Récupération d'un auto increment d'un objet Zend_Db_Table

Hello,

Lors du save() sur un Zend_Db_Table_Row:

Code:

$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+


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

Hors ligne

 

#3 22-04-2009 09:08:38

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Récupération d'un auto increment d'un objet Zend_Db_Table

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

 

#4 22-04-2009 10:50:49

jbunel
Membre
Lieu: Paris
Date d'inscription: 25-06-2008
Messages: 89
Site web

Re: Récupération d'un auto increment d'un objet Zend_Db_Table

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 :

Code:

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

 

#5 22-04-2009 11:46:48

alien7
Membre
Date d'inscription: 29-04-2007
Messages: 447

Re: Récupération d'un auto increment d'un objet Zend_Db_Table

Et lastInsertId te convient pas ?


ZF 2.3 - Twitter Bootstrap 3.2
Local: Ubuntu  -> Apache2 2.4 - MariaDB 10 - PHP 5.6

Hors ligne

 

#6 22-04-2009 11:48:01

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Récupération d'un auto increment d'un objet Zend_Db_Table

Code:

    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

 

#7 22-04-2009 17:49:32

jbunel
Membre
Lieu: Paris
Date d'inscription: 25-06-2008
Messages: 89
Site web

Re: Récupération d'un auto increment d'un objet Zend_Db_Table

Super je n'avais pas pensé à ce cas de figure.
Du coup je n'utilise plus nextId() en effet.
Merci beaucoup pour vos réponses !

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