2010-03-24 5 views
2

les joueurs:8 octets Entier avec Doctrine et PHP

  1. linux 64 bits avec
  2. php 5 (ZendFramework 1.10.2)
  3. PostgreSQL 8.3
  4. Doctrine 1,2

Via un client Flash/Flex j'ai une valeur entière de 8 octets.
le champ dans la base de données est un BIGINT (8 octets)

PHP_INT_SIZE montre que le système prend en charge 8 octets entier.

l'impression de la valeur dans le code tel qu'il est et comme intval() conduit à ceci:

Plain: 1269452776100 
intval: 1269452776099 

échec arrondi flottant?

mais ce qui m'a vraiment conduite des noix est

ERROR: invalid input syntax for integer: "1269452776099.000000"'

lorsque je tente de l'utiliser dans une requête. comme:

Doctrine_Core::getTable('table')->findBy('external_id',$external_id); 

ou

Doctrine_Core::getTable('table')->findBy('external_id',intval($external_id)); 

Comment je suis censé gérer cela? ou comment puis-je donner à la doctrine un nombre à virgule flottante qu'elle devrait utiliser sur un champ bigint?

Toute aide est très appréciée!
TIA

EDIT:

du modèle:

$this->hasColumn('external_id', 'integer', 8, array(
    'type' => 'integer', 
    'length' => 8, 
    'fixed' => false, 
    'unsigned' => false, 
    'notnull' => false, 
    'primary' => false, 
    )); 

champ de base de données est BIGINT 8 octets.

EDIT2: http://bugs.php.net/bug.php?id=48924 semble être la racine du problème

+0

Avez-vous construit le modèle rou de la DB, à partir d'un schéma YAML, ou est-ce vous le créez manuellement? Il semble qu'il y ait une différence entre votre définition de modèle de la colonne et son type réel. – prodigitalson

+0

yaml est construit à partir de DB, les modèles sont construits à partir de yaml. la définition du modèle et la base de données sont correctes. – Rufinus

+1

PostgreSQL 7.3? Êtes-vous sûr? Envoyez-le à un musée, c'est là qu'il appartient. Pas de support, pas de mise à jour, pas de sécurité. Ou voulez-vous dire la version 8.3? –

Répondre

1

Comme vous l'avez déjà mentionné, vous frappez this bug.

Pour contourner le problème, passez le paramètre comme une chaîne et assurez-vous qu'il est converti en un BIGINT du côté de la base de données:

$q = Doctrine_Query::create(); 
$q->from('table AS t') 
    ->where("t.external_id = CAST(:external_id AS BIGINT)", array(':external_id' => $external_id)) 
    ->limit(1); 
$result = $q->execute();