2012-06-20 22 views
6

Con relativa novedad para AJAX, y ahora que estoy empezando a aprender PDO, el nivel agregado de ReSTler me tiene completamente aturdido. Al modelar el siguiente código de muestras de Restler, no sé cómo cambiar el formato de salida de qué PDO es volviendo a lo que esperan Restler y Highcharts.¿Cómo formatear correctamente los resultados de PDO? - resultados numéricos devueltos como una cadena?

¿Cómo cambio este código para pasar del formato actual al formato requerido? (Los resultados serán generalmente registros 5K-10K, si eso es un factor en el manejo del resultado de MySQL.)

ReSTler Código API de fragmentos:

$sql = "SELECT ....." 
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
try { 
    $stmt = $this->db->query($sql); 
    return $stmt->fetchAll(); 
} catch (PDOException $e) { 
    throw new RestException(502, 'Listing History: ' . $e->getMessage()); 
} 

actual Formato de salida (incluye no deseada nombres de columna):

[ 
    { 
    "chart_date": "1118966400000", 
    "bandwidth": "10.01", 
    "views": "101" 
    }, 
    { 
    "chart_date": "1119225600000", 
    "bandwidth": "20.02", 
    "views": "101" 
    }, 

desea un formato de salida (numéricos ysin nombres de columna):

[ 
    [ 
    1118966400000, 
    10.01, 
    101 
    ], 
    [ 
    1119225600000, 
    20.02, 
    202 
    ], 

Editar usando sugiriófetch(PDO::FETCH_NUM):

por la respuesta de @Ricardo Lohmann, probé fetch (PDO :: FETCH_NUM), que se quitaron la columna nombres, pero todas las columnas devueltas parecen ser de cadena, no numéricas, como realmente son los datos, así que intente esto, dándome el tipo de datos correcto: ¿esta parte de PDO devuelve cadena de forma unilateral?

while ($row = $stmt->fetch(PDO::FETCH_NUM)) { 
    $array[$x][0] = intval($row[0]); 
    $array[$x][1] = intval($row[1]); 
    $array[$x][2] = intval($row[2]); 
    $x++; 
} 
return $array; 

Respuesta

12

PDO::FETCH_NUM es el camino a seguir, aunque no significa que las columnas numéricas seguirán siendo numéricas, solo significa que obtendrá una matriz indexada en lugar de una matriz asociativa (por lo tanto, solo cumple la omisión de los nombres de las columnas).

El controlador MySQL DOP siempre devuelve cadenas para columnas numéricas, que es a known bug, pero por desgracia, uno de los muchos errores que los desarrolladores de PHP hacen caso omiso como "gracias, pero esto no es un error".

Puede forzar json_encode para usar números reales para valores que parecen números: json_encode($data, JSON_NUMERIC_CHECK) (desde PHP 5.3.3).

+1

Ah, que tiene PHP 5.3 a mi disposición, por desgracia, I' m me quedé con 5.2 por la duración, pero GRACIAS por aclarar al menos "la cosa de la cuerda" ... estaba magullado mientras me estaba golpeando intentando cada^&^* ((configuración posible! – GDP

0

intenta establecer el modo de ir a buscar en lugar de fetchall, como la siguiente:

return $stmt->fetch(PDO::FETCH_COLUMN); 

Se puede ver la reference.

-1

Tenía la esperanza de que hubiera una forma integrada de hacerlo, por lo que realicé la Búsqueda de Google: v.

Estoy construyendo mi propia aplicación CMS personalizada que creo que es 'similar a Drupal' (nunca he usado Drupal, pero utilizo un sistema personalizado basado en Drupal). Con esto quiero decir que tengo una tabla en mi base de datos que básicamente describe todos los campos en otras tablas, y cuando recupero campos de estas otras tablas, cargo las descripciones y los datos escriben mis datos.

p. Ej.

tablex campos: nombre, edad, edad suficiente

tabledescriptions:

fieldname | datatype | minlength | parent 
___________|____________|_____________|________ 
Name  | String | 5   | tablex 
Age  | Int  | 1   | tablex 
Old Enough | Boolean | 1   | tablex 

Así que cuando la carga de datos desde tablex, que miran en tabledescription cosas, donde los padres = ' tablex 'y use una instrucción switch para el tipo de dato datos

foreach (...) { 
    switch ($desc->datatype) { 
     case 'int': (int) $tablex->data; 
      break; 
    } 
} 
etc. 
+1

Eso es exagerado –

+0

@ YourCommonSense No cuando está construyendo un estilo de OOP del sistema. Por cierto, esto es solo un fragmento de lo que utilizo para la tabla 'tabledescriptions'. También lo uso para determinar qué son los campos de inserción para tablex, etc. lo que significa que en el largo ejecutar, el código es mucho más eficiente y confiable –

+0

¿Por qué no solo preguntar a dbms sobre datat? ¿sí? –

0

La única forma que encontré para eludir este problema (usando el controlador SQLSRV), es tener SQL para enviar todos los tipos de datos como una cadena en un parametro OUTPUT. Y luego convertir todos los valores usando el tipo de datos correcto. Eso podría ser pesado para grandes conjuntos de datos.

Aunque DOP desarrolladores de dice que es un problema de controladores (no su error), nunca he tenido este problema utilizando el controlador SQLSRV sin DOP ...

Cuestiones relacionadas