2009-04-06 10 views

Respuesta

9

Implementé una gran parte del código Zend_Db en Zend Framework.

Como han dicho otros, la razón por la cual Zend_Db devuelve cadenas en lugar de enteros o flotantes nativos de PHP es que las extensiones de la base de datos de PHP devuelven cadenas. Y la razón es que no puede haber un tipo de PHP nativo para representar cierto tipo de base de datos. Por ejemplo, BIGINT de MySQL es un entero de 64 bits con signo. De forma predeterminada, el tipo PHP int está limitado a valores de 32 bits, por lo que si obtiene datos de la base de datos y los convierte implícitamente a int, algunos valores pueden verse truncados. Hay varios casos similares más, para float y fechas, etc.

El uso de la representación de cadenas para todos los tipos de datos es la mejor manera de mantenerse simple y coherente, evitar la pérdida de datos y evitar escribir muchos proveedores. código específico de casos especiales para hacer un mapeo de tipos de datos. Ese código adicional también implicaría una penalización de rendimiento.

Así que si tiene casos específicos donde necesita que los resultados de la base de datos se asignen a tipos de datos nativos de PHP, debe implementarlo usted mismo en el código de la aplicación (por ejemplo, en una clase personalizada Zend_Db_Table_Row).

1

Las bases de datos suelen devolver conjuntos de resultados como texto. A menos que su adaptador db convierta cosas para usted (y sonidos como el suyo no), todos los valores regresarán como cadenas de caracteres: fechas, enumeraciones, etc., así como enteros.

Si se trata de un pequeño número de tablas con solo unos pocos campos enteros, simplemente conviértelos a mano. Si se trata de una situación ligeramente más compleja, puede recorrer las columnas utilizando las definiciones de la base de datos (consulte sqlite_fetch_column_types(), etc.). Si su situación es más compleja de lo que parece razonable para estas soluciones, considere cambiar a un marco más funcional.

0

Parece que esto ha sido solicitado en el pasado pero aún no se ha implementado. #ZF-300 se comentó por última vez el 9 Ene 09.

Quizás podría compartir por qué quiere realizar el encasillamiento y le podemos ayudar de otra manera? PHP es bastante indulgente cuando se trata de tipos de datos variables ...

0

Para un ejemplo del uso de una costumbre Zend_Db_Table_Row para obtener los tipos de datos correctos, como se sugiere Bill Karwin, echar un vistazo a la clase aquí: http://www.zfsnippets.com/snippets/view/id/70

Puede ser implementado en su modelo como:

class YourTableName extends Zend_Db_Table_Abstract 
{ 
    protected $_name = 'your_table_name'; 
    protected $_rowClass = 'Model_Row_Abstract'; 
} 

Es posible que desee cambiar el tipo de datos Model_Row_Abstract para tinyint a bool si lo usa estrictamente para mantener valores booleanos.

Cuestiones relacionadas