2010-03-12 11 views
18

He intentado obtener resultados de la consulta de MySQL utilizando mysql_fetch_row() y mysql_result() y los valores numéricos se devuelven como cadenas.¿Obtiene los resultados de la consulta de MySQL como su tipo de datos nativos?

¿Hay alguna forma de recuperar los datos como su tipo de datos almacenado en la tabla?

La aplicación consultará muchas consultas diferentes, por lo que no podré convertir los valores como el tipo de datos deseado en una base 1 por 1.

Respuesta

14

no creo que la obtención de datos en sus tipos de datos nativos (es decir, cualquier otra cosa que cuerdas) puede hacerse en PHP 5.2 ...

En PHP 5.3, se hace posible, si no recuerdo mal, cuando está utilizando el nuevo (nuevo como en PHP> = 5.3) mysqlnd (controlador nativo de MySQL) controlador.

Después de rebuscar entre mis marcadores He encontrado este artículo sobre mysqlnd: PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

Se dice que esta (cita):

Ventajas del uso de mysqlnd de DOP

mysqlnd vuelve nativa tipos de datos cuando utilizando estados de cuenta preparados del lado del servidor, por ejemplo, se devuelve una columna INT como un entero variable e no como una cadena . Eso significa menos conversiones de datos internamente.

Pero esto es solamente PHP 5.3 (siempre que su versión de PHP 5.3 se compila con mysqlnd (y no el viejo libmysql)), y sólo parece ser el caso de las declaraciones preparadas :-(

lo cual no ayuda bastante, en su situación, supongo ...


Y aquí hay otro, aún sobre las nuevas características de mysqlnd, que habla de esto para no sólo declaraciones preparadas:. PHP: New network traffic, CPU and memory savings with mysqlnd

No estoy seguro de que esto se haya fusionado en el controlador oficial mysqlnd, sin embargo, la mejor manera sería intentarlo; pero todavía será PHP> = 5.3 solamente, de todos modos ...


Otra solución sería tener, en el lado de PHP, una especie de mapeo del sistema (como un ORM) a convertir los resultados procedentes de la base de datos de tipos de datos PHP ...

y sí, esto es malo si desea utilizar operadores como === y !==, que son de tipo sensible ...

+0

Gracias Pascal MARTIN! He estado buscando en Google durante varias horas y no he encontrado nada que pueda usar. Soy relativamente nuevo en PHP, pero parece que necesitaré ir con PDO si quiero el soporte nativo. Desafortunadamente mi host está ejecutando 5.2.algo ... También es difícil, estoy tratando de crear una entrada de archivo de informe XML que contiene información de consulta diferente. El script PHP lee el archivo XML solicitado y envía las consultas a la base de datos, por lo que realmente nunca sabré qué datos se están consultando y cómo se deben devolver. tiempo para ser creativo Supongo :) –

+1

PDO o no PDO no debería cambiar nada, en este caso: lo que importa son los controladores utilizados debajo * (es decir, libmysql vs mysqlnd) * - y ni siquiera estoy seguro de que mysqlnd en PHP 5.3.2 devuelve tipos nativos para consultas estándar ;;; en su caso, de todos modos, con PHP 5.2, la única solución que tendrá será una capa de mapeo, que sí escriba las conversiones cuando sea necesario ... –

+0

Tenga en cuenta que deberá [desactivar la emulación de declaración preparada] (http://stackoverflow.com/a/15592818/441684) si usa PDO. –

3

he implementado este la forma manual. En realidad no es tan malo, solo unas pocas líneas.

Como se sugirió, llame a mysqli_fetch_fields() en el recurso resultante de su consulta.

Luego, de un mapeo de los números de tipo de campo PHP a tipos de datos MySQL (vea el trabajo industrioso aquí http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php) puede convertir sus valores de la amplia gama de tipos de bases de datos devueltos como cadenas por MySQLi, en el tipo apropiado en PHP.

¿Cuánto de una ralentización es? No estoy seguro si.

+0

esto es exactamente lo que necesitaba. ¡Gracias! – jbrahy

1

escribí una función para este circuvent (DOP):

/** 
* Converts columns from strings to types according to 
* PDOStatement::columnMeta 
* 
* @param PDOStatement $st 
* @param array $assoc returned by PDOStatement::fetch with PDO::FETCH_ASSOC 
* @return copy of $assoc with matching type fields 
*/ 
function convertTypes(PDOStatement $statement, $assoc) 
{ 
    for ($i = 0; $columnMeta = $statement->getColumnMeta($i); $i++) 
    { 
     $type = $columnMeta['native_type']; 

     switch($type) 
     { 
      case 'DECIMAL': 
      case 'TINY': 
      case 'SHORT': 
      case 'LONG': 
      case 'LONGLONG': 
      case 'INT24': 
       $assoc[$columnMeta['name']] = (int) $assoc[$columnMeta['name']]; 
       break; 
      case 'DATETIME': 
      case 'DATE': 
      case 'TIMESTAMP': 
       $assoc[$columnMeta['name']] = strtotime($assoc[$columnMeta['name']]); 
       break; 
      // default: keep as string 
     } 
    } 

    return $assoc; 
} 

Por supuesto, la lista de tipos no están completas y la conversión se simplifica, pero puede ser útil para el arranque.

3

probar esto si se utiliza mysqli en lugar de DOP

$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); 
+0

Esto hizo su trabajo para mí. ¡Gracias! – Victor

-1

Además de respuesta Pascal MARTIN, si utiliza MySQLi también debería funcionar. Prueba esto:

<?php 
$mysqli = new mysqli("example.com", "user", "password", "database"); 
if ($mysqli->connect_errno) { 
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
} 

if (!$mysqli->query("DROP TABLE IF EXISTS test") || 
    !$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))") || 
    !$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')")) { 
    echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error; 
} 

$stmt = $mysqli->prepare("SELECT id, label FROM test WHERE id = 1"); 
$stmt->execute(); 
$res = $stmt->get_result(); 
$row = $res->fetch_assoc(); 

printf("id = %s (%s)\n", $row['id'], gettype($row['id'])); 
printf("label = %s (%s)\n", $row['label'], gettype($row['label'])); 
?> 

El resultado del ejemplo sería:

id = 1 (integer) 
label = a (string) 

Puede obtener más información aquí: https://dev.mysql.com/doc/apis-php/en/apis-php-mysqli.quickstart.prepared-statements.html

Esperanza esto ayuda

Cuestiones relacionadas