2010-02-23 13 views
5

Tengo una tabla en MySQL:mysql_query preservar el tipo de datos creado en la tabla a la vuelta?

CREATE TABLE user (id INT, name VARCHAR(250)); 

que consultar la tabla:

$result = mysql_query("SELECT id,name FROM user"); 

que se reúnen los resultados:

while($row = mysql_fetch_assoc($result) $rv[] = $row; 

y regreso los datos:

echo json_encode($rv); 

El problema es que el id vuelve como cadena y no como int, incluso antes del json_encode. Si forzo $ row ['id'] = (int) $ row ['id']; - funciona bien.

¿Cómo puedo forzar a mysql a devolver el tipo de datos correcto en $ row?

10x.

Respuesta

2

PDO->bindColumn puede esta

$stmt = $dbh->prepare($sql); 

$stmt->bindColumn('int_col', $intVar, PDO::PARAM_INT); 
$stmt->bindColumn('string_col', $strVar, PDO::PARAM_STR); 

$stmt->execute(); 

$stmt->fetch(PDO::FETCH_BOUND); 

$ IntVar habrá automáticamente se convierte a int

+0

Primero, gracias, pero ¿por qué tengo que "decirle" el tipo de datos cuando este campo está declarado en la TABLA SQL como INT ... – aviv

+0

, porque la interfaz db no es compatible con esto. Todo lo que obtienes de db es una variedad de cadenas.Puede convertir algunas de estas cadenas a otra cosa a nivel de aplicación, pero esto no sucederá "automágicamente" sin una capa ORM completa. – user187291

3

Desafortunadamente, con PHP < = 5.2, los MySQL funciones/clases (es decir mysql_*, mysqli_*, y PDO) se basan en libmysql - una biblioteca C que proporciona soporte para la comunicación con el servidor MySQL.

Las funciones que utilizan la biblioteca que siempre devuelven cadenas, incluso para flotar número entero y columnas - y no hay nada que pueda hacer al respecto: la única solución es tener un poco de "capa de mapeo" (como un ORM) que " sabe ", en el lado de PHP, que tipo debe ser cada columna, y hará la conversión cada vez que se obtengan algunos datos de la base de datos.

Nota: la forma en que está insertando datos no cambia nada en cuanto al hecho de que obtendrá cadenas de caracteres cuando obtenga datos del DB.


Con PHP> = 5.3, las funciones que se comunican con un servidor MySQL puede utilizar mysqlnd (controlador nativo de MySQL) en lugar de libmysql - esto tiene que ser configurado en tiempo de compilación, sin embargo.

Y poder comunicarse con tipos de datos "nativos", en determinadas circunstancias, es una de las cosas agradables que mysqlnd proporciona; sobre eso, debería haber un par de informaciones interesantes es este artículo: PHP: New network traffic, CPU and memory savings with mysqlnd.


Para hace las cosas a corto:

  • Con PHP 5.2, sólo obtendrá cuerdas de la base de datos; y tendrá que hacer alguna conversión de tipo usted mismo
  • Con PHP 5.3, puede obtener tipos de datos nativos, al menos en algunos casos.
+0

Muy esclarecedor. Gracias ! – aviv

Cuestiones relacionadas