2009-06-01 12 views
7

Al usar mysql_fetch_assoc en PHP, ¿cómo puedo hacer que devuelva los tipos de datos correctos? En este momento parece convertir todo en cadenas, preferiría si dejara los Ints como Ints, y de alguna manera designara la Fecha/Hora como Objeto o de alguna manera diferente a las cadenas.¿Haz que mysql_fetch_assoc detecte automáticamente los tipos de datos devueltos?

La razón de esto es que estoy usando PHP como un backend para una aplicación Flex, y Flex tiene algunas características como la detección automática de tipos de devolución, que no funcionan tan bien si todo viene como una cadena.

+0

buena pregunta, a veces idiomas sin apretar con tipo puede ser un dolor cuando realmente se necesita para preservar sus tipos de datos . –

+0

¿Mi solución funcionó para usted?Además, si te gusta mi respuesta, ¿podrías marcarla como aceptada? El sistema SO lo aceptó por usted, pero solo recibo la mitad de la recompensa de esta manera, aunque se muestre como aceptada. Gracias –

+0

bien, gracias y lo siento, no era exactamente lo que estabas buscando. Buena suerte con tu problema. –

Respuesta

14

Creo que una buena estrategia aquí es determinar programáticamente el tipo de datos de cada columna en una tabla, y emitir los resultados devueltos en consecuencia. Esto le permitirá interactuar con su base de datos de una manera más consistente y simple mientras le da el control que necesita para que sus variables almacenen el tipo de datos correcto.

Una posible solución: Se puede usar MySQL _ ir a buscar _ campo() para obtener un objeto que contiene meta-datos sobre la columna de la mesa y luego emitir su cadena de nuevo al tipo deseado.

//run query and get field information about the row in the table 
$meta = mysql_fetch_field($result, $i); 

//get the field type of the current column 
$fieldType = $meta->type 

Un ejemplo completo se puede encontrar aquí: http://us2.php.net/manual/en/function.mysql-fetch-field.php

A partir de PHP se escribe sin apretar, usted debe tener un tiempo relativamente fácil con esto.

Si está utilizando técnicas OO (orientadas a objetos), puede crear una clase con esta funcionalidad en los métodos setter() para que no tenga que tener código duplicado.

0

Puede construir una capa específica de mysql alrededor de mdb2 que detecte automáticamente los tipos de campo utilizando el comando SHOW COLUMNS, pero eso de alguna manera frustraría el propósito de usar mdb2.

Tenga en cuenta, también, que MySQL suports enteros bien fuera del rango de PHP, (UNSIGNED BIGINT es de 64 bits, soporta PHP, a lo sumo, 64 bits firmó enteros, y las plataformas de menos de 32 bits) para fundición de forma automática puede ser indeseable en algunos contextos. En esos casos, realmente desea mantener los enteros grandes en su forma de cadena, y manipularlos con bcmath

0

Quería compartir una función que escribí para este mismo problema. Pasar el resultado de la consulta $rs y obtener una matriz asociativa de los datos emitidos como el retorno: el uso

function cast_query_results($rs) { 
    $fields = mysqli_fetch_fields($rs); 
    $data = array(); 
    $types = array(); 
    foreach($fields as $field) { 
     switch($field->type) { 
      case 3: 
       $types[$field->name] = 'int'; 
       break; 
      case 4: 
       $types[$field->name] = 'float'; 
       break; 
      default: 
       $types[$field->name] = 'string'; 
       break; 
     } 
    } 
    while($row=mysqli_fetch_assoc($rs)) array_push($data,$row); 
    for($i=0;$i<count($data);$i++) { 
     foreach($types as $name => $type) { 
      settype($data[$i][$name], $type); 
     } 
    } 
    return $data; 
} 

Ejemplo:

$dbconn = mysqli_connect('localhost','user','passwd','tablename'); 
$rs = mysqli_query($dbconn, "SELECT * FROM Matches"); 
$matches = cast_query_results($rs); 
// $matches is now a assoc array of rows properly casted to ints/floats/strings 
1

Sólo aportando un pequeña mejora a la respuesta de mastermind202 para manejar más tipos de datos . Gracias cerebro por hacer el trabajo pesado! el uso

function cast_query_results($rs) { 
    $fields = mysqli_fetch_fields($rs); 
    $data = array(); 
    $types = array(); 
    foreach($fields as $field) { 
     switch($field->type) { 
      case MYSQLI_TYPE_NULL: 
       $types[$field->name] = 'null'; 
       break; 
      case MYSQLI_TYPE_BIT: 
       $types[$field->name] = 'boolean'; 
       break; 
      case MYSQLI_TYPE_TINY: 
      case MYSQLI_TYPE_SHORT: 
      case MYSQLI_TYPE_LONG: 
      case MYSQLI_TYPE_INT24: 
      case MYSQLI_TYPE_LONGLONG: 
       $types[$field->name] = 'int'; 
       break; 
      case MYSQLI_TYPE_FLOAT: 
      case MYSQLI_TYPE_DOUBLE: 
       $types[$field->name] = 'float'; 
       break; 
      default: 
       $types[$field->name] = 'string'; 
       break; 
     } 
    } 
    while($row=mysqli_fetch_assoc($rs)) array_push($data,$row); 
    for($i=0;$i<count($data);$i++) { 
     foreach($types as $name => $type) { 
      settype($data[$i][$name], $type); 
     } 
    } 
    return $data; 
} 

Ejemplo:

$db = mysqli_connect(...); 
$rs = mysqli_query($db, "SELECT ..."); 
$results = cast_query_results($rs); 

Devuelve una matriz asociativa de filas con campos correctamente mecanografiados

Cuestiones relacionadas