Tengo un campo de tabla en una base de datos MySQL:
userid INT(11)
Entonces lo llamo a mi página con esta consulta:
"SELECT userid FROM DB WHERE name='john'"
Luego, para manejar el resultado, hago:
$row=$result->fetch_assoc();
$id=$row['userid'];
Ahora si lo hago:
echo gettype($id);
Me sale una cuerda. ¿No debería ser esto un número entero?
$conn->query("your query")
obtuve los campos enteros como una cadena, pero cuando lo hice,$conn->prepare("your query")
obtuve los parámetros tal como estaban en la base de datosRespuestas:
Cuando selecciona datos de una base de datos MySQL usando PHP, el tipo de datos siempre se convertirá en una cadena. Puede convertirlo de nuevo a un entero utilizando el siguiente código:
O usando la función
intval()
:fuente
Utilice mysqlnd (controlador nativo) para php.
Si estás en Ubuntu:
Si estás en Centos:
El controlador nativo devuelve los tipos enteros adecuadamente.
Editar:
Como ha señalado @Jeroen, este método solo funcionará de manera inmediata para PDO.
Como ha señalado @LarsMoelleken, este método funcionará con mysqli si también configura la opción MYSQLI_OPT_INT_AND_FLOAT_NATIVE en true.
Ejemplo:
fuente
$link = mysqli_connect('localhost', 'root', ''); mysqli_set_charset($link,'utf8'); $result = mysqli_query($link,'SELECT CAST(\'3.51\' AS DECIMAL(3,2))'); $row = mysqli_fetch_assoc($result); var_dump($row);
devuelve:array(1) { ["CAST('3.51' AS DECIMAL(3,2))"]=> string(4) "3.51" }
La solución más fácil que encontré:
Puede obligar a json_encode a usar números reales para valores que se parecen a números:
(desde PHP 5.3.3).
O simplemente podría enviar su identificación a un int.
fuente
json_encode
Si es posible, usar una cadena para lanzar int es como usar un microscopio para ahogar las uñas.UNIX_TIMESTAMP()
, por ejemplo.Mi solución es pasar el resultado de la consulta
$rs
y obtener una matriz asociada de los datos emitidos como el retorno:Ejemplo de uso:
fuente
No. Independientemente del tipo de datos definido en sus tablas, el controlador MySQL de PHP siempre sirve valores de fila como cadenas.
Debe enviar su identificación a un int.
fuente
Me gusta la respuesta de Chad, especialmente cuando los resultados de la consulta se pasarán a JavaScript en un navegador. Javascript trata limpiamente las entidades numéricas como números, pero requiere un trabajo adicional para tratar entidades numéricas como cadenas. es decir, debe usar parseInt o parseFloat en ellos.
Basándome en la solución de Chad, uso esto y, a menudo, es exactamente lo que necesito, y crea estructuras que pueden codificarse en JSON para facilitar el manejo en JavaScript.
Agregar una cadena numérica a 0 produce un tipo numérico en PHP e identifica correctamente el tipo para que los números de coma flotante no se trunqueen en enteros.
fuente
Esto sucede cuando
PDO::ATTR_EMULATE_PREPARES
se establece entrue
en la conexión.Sin embargo, tenga cuidado al configurarlo para que
false
no permita el uso de parámetros más de una vez. Creo que también afecta la calidad de los mensajes de error que regresan.fuente
Puedes hacer esto con ...
... dependiendo de la extensión que desee usar. El primero no se recomienda porque la extensión mysql está en desuso. El tercero sigue siendo experimental.
Los comentarios en estos hipervínculos hacen un buen trabajo al explicar cómo configurar su tipo de una cadena antigua simple a su tipo original en la base de datos.
Algunos marcos también resumen esto (CodeIgniter proporciona
$this->db->field_data()
).También puede hacer conjeturas, como recorrer las filas resultantes y usar is_numeric () en cada una. Algo como:
Esto convertiría cualquier cosa que parezca un número en uno ... definitivamente no es perfecto.
fuente
if (is_float()) { $value = (float)$value; }
En mi proyecto, generalmente uso una función externa que "filtra" los datos recuperados
mysql_fetch_assoc
.Puede cambiar el nombre de los campos en su tabla para que sea intuitivo entender qué tipo de datos se almacena.
Por ejemplo, puede agregar un sufijo especial a cada campo numérico: si
userid
es unINT(11)
puede cambiarle el nombreuserid_i
o si es unUNSIGNED INT(11)
puede cambiarle el nombreuserid_u
. En este punto, puede escribir una función PHP simple que reciba como entrada la matriz asociativa (recuperada conmysql_fetch_assoc
) y aplique la conversión al "valor" almacenado con esas "claves" especiales.fuente
Si se utilizan declaraciones preparadas, el tipo será int cuando corresponda. Este código devuelve una matriz de filas, donde cada fila es una matriz asociativa. Como si
fetch_assoc()
se llamara para todas las filas, pero con información de tipo preservada.fuente
MySQL tiene controladores para muchos otros idiomas, la conversión de datos a cadenas "estandariza" los datos y deja que el usuario escriba los valores de conversión a int u otros
fuente
En mi caso, la
mysqlnd.so
extensión había sido instalada. PERO no lo hicepdo_mysqlnd.so
. Entonces, el problema se resolvió reemplazandopdo_mysql.so
conpdo_mysqlnd.so
.fuente
Me gusta la técnica de la mente maestra , pero la codificación puede ser más simple:
También agregué la comprobación de la consulta que devuelve falso en lugar de un conjunto de resultados.
Y buscando una fila con un campo que tenga un valor nulo.
Y si el tipo deseado es una cadena, no pierdo el tiempo, ya es una cadena.
No me molesto en usar esto en la mayoría del código php; Solo confío en la conversión automática de tipos de php. Pero si se consultan muchos datos, para luego realizar cálculos aritméticos, es sensato emitir los tipos óptimos por adelantado.
fuente