php mysql pdo

php - ¿Cómo obtener tipos numéricos de MySQL usando PDO?



php mysql connect (4)

Es posible que mysqlnd instalado mysqlnd , pero eso no significa que esté listo para ser utilizado por la extensión PDO normal (pdo_mysql) , este es el caso más frecuente en el alojamiento compartido, así que asegúrese de habilitar la extensión nd_pdo_mysql y también de desactivar otra extensión pdo_mysql ya que podría crear un conflicto.

@captura de pantalla

Encontré esta question (duplicada), decidí publicar mis pensamientos aquí, espero que esté bien;)

Estoy usando PDO y MySQL, por alguna razón cuando obtengo valores de la base de datos que son de tipo int, PDOStatement está devolviendo una representación de cadena del número y no un valor de tipo numérico. ¿Cómo evito que esto suceda?

Noté que hay un atributo de la clase PDO: PDO::ATTR_STRINGIFY_FETCHES que se supone que se encarga de esto pero, al intentar modificarlo, arroja un error diciendo que el atributo no es válido para el controlador MySQL.

¿Es normal obtener cadenas en lugar de números al consultar una base de datos?


No creo que se puedan hacer "números" en PHP 5.2 :-(

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

Bueno, después PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3 mis marcadores, encontré este artículo sobre mysqlnd: PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

Dice esto (cita):

Ventajas de usar mysqlnd para PDO

mysqlnd devuelve tipos de datos nativos al usar declaraciones preparadas del lado del servidor, por ejemplo, una columna INT se devuelve como una variable entera no como una cadena. Eso significa menos conversiones de datos internamente.

Pero esto es solo PHP 5.3 (siempre que su versión de PHP 5.3 esté compilada con mysqlnd ( y no con libmysql anterior) ), y parece que solo sea el caso para declaraciones preparadas :-(

Lo siento...

Una solución sería tener, en el lado de PHP, un sistema de mapeo (como un ORM - ver Doctrine , solo como un ejemplo de ORM: no sé si hace lo que estás pidiendo) para convertir los resultados viniendo de los tipos de datos DB a PHP ...

Y sí, esto es malo si quiere usar operadores como === y !== , que son sensibles al tipo de letra ...


Para responder a su última pregunta primero, "sí", desafortunadamente es normal recibir números como cadenas. Como dice el manual citado por Pascal, mysqlnd (PHP 5.3) devolverá los tipos de datos nativos de las declaraciones preparadas, siempre que apague la emulación de declaración preparada de PDO.

new PDO($dsn, $user, $pass, array( PDO::ATTR_EMULATE_PREPARES => false ))

PDO :: ATTR_STRINGIFY_FETCHES no está relacionado con MySQL.

Si observas el lado bueno, es una buena práctica usar declaraciones preparadas de todos modos, entonces ...;)


La respuesta de Pascal es correcta. Tuve algunos problemas haciendo que todo funcione. Aquí está lo que tú necesitas hacer.

Primero, asegúrese de tener mysqlnd instalado y activado. Mira php --info . En la sección pdo_mysql, debería verse así:

pdo_mysql PDO Driver for MySQL => enabled Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 321

Si en lugar de ver mysqlnd en la versión de Client API, ve una línea como ...

Client API version => 5.5.29

... entonces no tiene instalado e instalado mysqlnd. Cuida eso primero.

En segundo lugar, PDO usa declaraciones preparadas emuladas por defecto para todas las conexiones MySQL . Ridículo, pero ahí está. Y obtendrá tipos de datos nativos solo si usa declaraciones preparadas reales (llamadas "declaraciones preparadas del lado del servidor" en la publicación de blog vinculada, que ahora está aquí ). Entonces debes establecer PDO :: ATTR_EMULATE_PREPARES en falso, así:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Por último, asegúrese de no haber configurado PDO :: ATTR_STRINGIFY_FETCHES en verdadero.

$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);