IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Db PHP Discussion :

Zend_Db_Table_Abstract et enregistrement de float


Sujet :

Zend_Db PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 71
    Par défaut Zend_Db_Table_Abstract et enregistrement de float
    Salut a tous!

    J'ai un probléme qui me rend fou... j'ai une table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE `district` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `name` varchar(52) NOT NULL,
      `x` float(5,3) NOT NULL,
      `y` float(5,3) NOT NULL,
      PRIMARY KEY  (`x`,`y`),
      KEY `id` (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
    et un model
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Model_District extends Zend_Db_Table_Abstract{ 	 	
    	protected $_name='district'; 	 	 	 	 	 
    	protected $_primary=array('x','y');
    	protected $_sequence='id';
    	protected $_referenceMap    = array();
    et je fais simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class TestController extends Zend_Controller_Action{
    		public function indexAction(){
    			$districtTable=new Model_District();
    			$district=$districtTable->createRow();
    			$district->name='test';
    			$district->x=55.2;
    			$district->y=32.44;
    			$district->save();
                            exit;
    		}
    	}
    et j'obtiens une magnifique erreur
    Cannot refresh row as parent is missing

    et la ou je suis en train de devenir fou c'est que 55.2 c'est un float, et que si je met 55 ca marche trés bien, que se passe t-il ??? on ne peux pas assigner un float ???


    Tout eclairage sur ce probleme serait plus que le bienvenu!
    J'ai tester dans tous les sens et je comprend vraiment pas ...

    Je rappel que mon code marche avec
    $district->x=55;
    $district->y=32;
    mais pas avec
    $district->x=55.2; // j ai tester avec '55.2' ca marche pas non plus
    $district->y=32.44;

    MAIS allez savoir pourquoi l enregistrement est quand meme inscrit dans la base de donnée ... en gros j'ai juste a faire un try catch et ne pas traiter l erreur mais ... bon^^

    merci!

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    Cette table me semble bizarre

    A quoi sert ta colonne id si ce n'est pas la clé primaire de la table ?
    Et il me parait très dangereux d'utiliser des float comme clé primaire (du fait de la représentation des flottants, voir plus loin).

    Je te proposerais donc bien de changer de clé primaire pour le champ 'id', et d'ajouter une contrainte d'unicité sur tes champs x et y... Mais ça demanderait peut-être aussi d'autres modifications dans d'autres tables...

    La propriété $_sequence ne doit être une chaîne de caractère que quand l'identifiant unique d'une table est géré à travers une séquence... ce qui est impossible avec MySQL qui ne gère pas les séquences mais des champs de type auto-incrément. Pour MySQL, cette propriété doit correspondre soit au booléen true (= la clé primaire est un auto-incrément), soit à false (= la clé primaire n'est pas auto-incrémentée). Si tu laisses ta table telle quelle, on est dans la deuxième situation : la clé primaire constituée par (x, y) n'est pas gérée par MySQL. Si tu changes de clé primaire pour le champ 'id', alors on est dans la première situation.

    Mais, pour en revenir à l'erreur que tu rencontres, l'exception n'est pas levée à cause d'une mauvaise définition de la propriété $_sequence mais à cause d'un problème de représentation des nombres flottants. En effet, '55.2' n'existe tout simplement pas car il ne peut pas être représenté sous la forme x exposant y ... Voir la doc MySQL. Donc quand ZF recherche un enregistrement avec x=5.2, rien n'est retourné... La solution est donc soit de prendre le champ 'id' comme clé primaire (ce que je te conseille), soit de convertir les champs x et y en DECIMAL et non FLOAT... (ou les deux modifications)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 71
    Par défaut
    '55.2' n'existe tout simplement pas car il ne peut pas être représenté sous la forme x exposant y ... Voir la doc MySQL.
    Mon dieu merci! J'aurais jamais penser a ca ...

    Quand a mon $_sequence='id' de toute facon Zend l'utilise pas, c'est que je le met systematiquement sans me poser de question

    Par contre l'idée est d'utiliser les auto increment pour que dans les tables de laison les clés soient uniquement entre des int, j'avais lu quelquepart que ca permettaient d'avoir une indexation plus rapide un truc dans le genre, mais bon perso j'utilise les clés primaires quand je fait des INSERT et pour les SELECT,UPDATE j'utilise l'id, c'est plus simple a passer en parametre^^

    (Et ca a l'air d etre une pratique surtout pour MYSQL)

    je viens de tester ca marche!!!! MERCIIIIIIIIIIIIII

  4. #4
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Citation Envoyé par lunarnet76 Voir le message
    Quand a mon $_sequence='id' de toute facon Zend l'utilise pas, c'est que je le met systematiquement sans me poser de question

    Par contre l'idée est d'utiliser les auto increment pour que dans les tables de laison les clés soient uniquement entre des int, j'avais lu quelquepart que ca permettaient d'avoir une indexation plus rapide un truc dans le genre, mais bon perso j'utilise les clés primaires quand je fait des INSERT et pour les SELECT,UPDATE j'utilise l'id, c'est plus simple a passer en parametre^^

    (Et ca a l'air d etre une pratique surtout pour MYSQL)
    Une pratique, c'est de créer pour chaque table un champ auto-incrément comme tu le fais, mais de le mettre en clé primaire ! Sinon, ça ne sert pas à grand chose...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 71
    Par défaut
    ah ouais ok en fait ce que j'ai completement zappé c'est le $_sequence ca veux dire clé primaire ...

    Ca m'apprendra a pas lire ...

  6. #6
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Citation Envoyé par lunarnet76 Voir le message
    ah ouais ok en fait ce que j'ai completement zappé c'est le $_sequence ca veux dire clé primaire ...
    $_sequence ne signifie pas clé primaire, mais indique comment la clé primaire est constituée :
    - manuellement => le mettre à false
    - auto-incrément => le mettre à true
    - séquence => mettre le nom de la séquence (n'existe pas avec MySQL)

    La clé primaire est définie avec $_primary, et dans la création de la table (l'ordre create table).

    Par exemple, tu pourrais faire :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE `district` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `name` varchar(52) NOT NULL,
      `x` float(5,3) NOT NULL,
      `y` float(5,3) NOT NULL,
      PRIMARY KEY  (`id`),
      UNIQUE KEY `district_xy` (`x`, `y`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

    Et pour ton modèle :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Model_District extends Zend_Db_Table_Abstract{ 	 	
    	protected $_name='district'; 	 	 	 	 	 
    	protected $_primary='id';
    	protected $_sequence=true;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/12/2010, 19h35
  2. Enregistrer matrice de float
    Par ninours23 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 05/03/2008, 14h38
  3. Réponses: 2
    Dernier message: 02/03/2006, 19h29
  4. [BDD] Enregistrer le résultat d'une requête
    Par Mowgly dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/06/2002, 15h26
  5. enregistrer dans un fichier avec une appli mdi
    Par ferrari dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2002, 15h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo