2009-04-06 13 views

risposta

9

Ho implementato molto del codice Zend_Db in Zend Framework.

Come altri hanno affermato, il motivo per cui Zend_Db restituisce stringhe anziché interi o float nativi di PHP è che le estensioni del database di PHP restituiscono stringhe. E la ragione è che potrebbe non esserci un tipo nativo di PHP per rappresentare un determinato tipo di database.

Ad esempio, lo BIGINT di MySQL è un numero intero con segno a 64 bit. Per impostazione predefinita, il tipo PHP int è limitato a valori a 32 bit, quindi se si recuperano i dati dal database e si converte implicitamente in int, alcuni valori potrebbero essere troncati. Esistono molti altri casi simili, per float e date, ecc.

L'utilizzo della rappresentazione di stringa per tutti i tipi di dati è il modo migliore per rimanere semplici e coerenti, essere sicuri di evitare la perdita di dati ed evitare di scrivere molti fornitori. codice del caso speciale specifico per eseguire la mappatura del tipo di dati. Anche quel codice in più comporterebbe una penalizzazione delle prestazioni.

Quindi, se si dispone di casi specifici in cui è necessario associare i risultati del database ai tipi di dati PHP nativi, è necessario implementarli autonomamente nel codice dell'applicazione (ad esempio in una classe personalizzata Zend_Db_Table_Row).

1

I database in genere restituiscono set di risultati sotto forma di testo. A meno che il tuo adattatore db non converta le cose per te (e su suoni come il tuo no), tutti i valori torneranno come stringhe - date, enumerazioni, ecc. Così come i numeri interi.

Se si ha a che fare con un numero limitato di tabelle con solo pochi campi interi, convertirle manualmente. Se hai a che fare con una situazione leggermente più complessa, puoi scorrere le colonne usando le definizioni del database (vedi sqlite_fetch_column_types(), ecc.). Se la tua situazione è più complessa di quanto sembri ragionevole per queste soluzioni, prendi in considerazione il passaggio a un framework più funzionale.

0

Sembra che questo sia stato richiesto in passato ma non è stato ancora implementato. #ZF-300 è stato commentato l'ultima volta il 9 gen 09.

Forse potresti condividere il motivo per cui desideri eseguire il typecasting e potremmo aiutarti in un altro modo? PHP è piuttosto clemente quando si tratta di tipi di dati variabili ...

0

Per un esempio di utilizzo di una consuetudine Zend_Db_Table_Row per ottenere i tipi di dati corretti, come suggerito Bill Karwin, uno sguardo alla classe qui: http://www.zfsnippets.com/snippets/view/id/70

Può essere implementata nel modello come:

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

È possibile modificare il tipo di dati Model_Row_Abstract per tinyint in bool se lo si utilizza rigorosamente per mantenere valori booleani.

Problemi correlati