while style registros number fetch_assoc contar php mysql macos ubuntu pdo

php - style - rowcount pdo



PHP+PDO+MySQL: ¿cómo devuelvo enteros y columnas numéricas de MySQL como números enteros y numéricos en PHP? (1)

La solución es asegurarse de que está utilizando el controlador mysqlnd para php.

¿Cómo sabes que no estás usando mysqlnd?

Al ver php -i , no se mencionará "mysqlnd". La sección pdo_mysql tendrá algo como esto:

pdo_mysql PDO Driver for MySQL => enabled Client API version => 5.1.72

¿Cómo lo instalas?

La mayoría de las guías de instalación para L / A / M / P sugieren apt-get install php5-mysql pero el controlador nativo para MySQL está instalado por un paquete diferente: php5-mysqlnd . Descubrí que esto estaba disponible con ppa: ondrej / php5-oldstable .

Para cambiar al nuevo controlador (en Ubuntu):

  • Eliminar el controlador anterior:
    apt-get remove php5-mysql
  • Instale el nuevo controlador:
    apt-get install php5-mysqlnd
  • Reinicie apache2:
    service apache2 restart

¿Cómo verifico si el controlador está siendo utilizado?

Ahora php -i mencionará "mysqlnd" explícitamente en la sección pdo_mysql :

pdo_mysql PDO Driver for MySQL => enabled Client API version => mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $

Configuración de PDO

Asegúrese de que PDO::ATTR_EMULATE_PREPARES sea false (verifique sus valores predeterminados o PDO::ATTR_EMULATE_PREPARES ):
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Asegúrese de que PDO::ATTR_STRINGIFY_FETCHES sea false (verifique sus valores predeterminados o PDO::ATTR_STRINGIFY_FETCHES ):
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);

Valores devueltos

  • Los tipos de punto flotante (FLOAT, DOUBLE) se devuelven como flotantes de PHP.
  • Los tipos enteros (INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT †) se devuelven como enteros de PHP.
  • Los tipos de punto fijo (DECIMAL, NUMERIC) se devuelven como cadenas.

† BIGINTs con un valor mayor que 64 bit signed int (9223372036854775807) volverá como una cadena (o 32 bits en un sistema de 32 bits)

object(stdClass)[915] public ''integer_col'' => int 1 public ''double_col'' => float 1.55 public ''float_col'' => float 1.5 public ''decimal_col'' => string ''1.20'' (length=4) public ''bigint_col'' => string ''18446744073709551615'' (length=20)

He visto esta pregunta varias veces en Stack Overflow pero ninguna ha explorado suficientemente el problema (o al menos de una manera que me resulta útil)

El problema es que una consulta DB debe devolver tipos de datos enteros en PHP para columnas enteras. En cambio, la consulta devuelve cada columna como un tipo de cadena.

Me he asegurado de que "PDO :: ATTR_STRINGIFY_FETCHES" sea falso solo para asegurarme de que los resultados no se envíen a la cadena.

Respuestas que he visto:

  • No se puede hacer
    • No, está funcionando en Mac OS X instalado PHP / MySQL
  • Escriba todos sus valores en su código
    • No, no haré eso
  • No te preocupes, PHP está escrito sin apretar
    • Mis datos se publican como JSON y son consumidos por muchos otros servicios, algunos requieren los datos en el formato correcto

De mi investigación entiendo que este es un problema de implementación del controlador.

Muchas fuentes afirman que el controlador nativo de MySQL no admite la devolución de tipos numéricos. Esto no parece ser cierto, ya que funciona en Mac OS X. A menos que signifiquen decir que "el controlador nativo de MySQL en Linux no es compatible con la función".

Esto implica que hay algo especial sobre el controlador / entorno que he instalado en Mac OS X. He estado tratando de identificar las diferencias para aplicar una solución, pero estoy limitado por mi conocimiento de cómo verificar estas cosas.

Las diferencias:

  • PHP en OS X fue compilado e instalado a través de Home Brew
  • PHP en Ubuntu se instaló a través de "apt-get install php5-dev"
  • PHP en OS X se conecta a un servidor MySQL que también se ejecuta en OS X
    • Versión del servidor: 5.1.71-log Distribución de la fuente
  • PHP en Ubuntu se conecta a una base de datos en la nube Rackspace
    • Versión del servidor: 5.1.66-0 + squeeze1 (Debian)

Entorno Ubuntu

  • Versión: 10.04.1
  • PHP 5.4.21-1 + debphp.org ~ lúcido + 1 (cli) (construido: 21 de octubre 2013 08:14:37)
  • php -i

    pdo_mysql

    Controlador PDO para MySQL => habilitado Client API version => 5.1.72

Entorno Mac OS X

  • 10.7.5
  • PHP 5.4.16 (cli) (construido: 22 de agosto de 2013, 09:05:58)
  • php -i

    pdo_mysql

    Controlador PDO para MySQL => habilitado Client API version => mysqlnd 5.0.10 - 20111026 - $ Id: e707c415db32080b3752b232487a435ee0372157 $

Indicadores de PDO utilizados

PDO::ATTR_CASE => PDO::CASE_NATURAL, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, PDO::ATTR_STRINGIFY_FETCHES => false, PDO::ATTR_EMULATE_PREPARES => false,

Cualquier ayuda y experiencia sería apreciada :) Definitivamente estaré posteando aquí si encuentro la respuesta.