Eu tenho um campo de tabela em um banco de dados MySQL:
userid INT(11)
Então, eu estou chamando para a minha página com esta consulta:
"SELECT userid FROM DB WHERE name='john'"
Então, para lidar com o resultado, eu faço:
$row=$result->fetch_assoc();
$id=$row['userid'];
Agora se eu fizer:
echo gettype($id);
Eu recebo uma corda. Não deveria ser um número inteiro?
$conn->query("your query")
eu tenho os campos inteiros como seqüência de caracteres, mas quando eu usei$conn->prepare("your query")
eu tenho os parâmetros como eles estavam no banco de dadosRespostas:
Quando você seleciona dados de um banco de dados MySQL usando PHP, o tipo de dados sempre será convertido em uma string. Você pode convertê-lo novamente em um número inteiro usando o seguinte código:
Ou usando a função
intval()
:fonte
Use o mysqlnd (driver nativo) para php.
Se você estiver no Ubuntu:
Se você estiver no Centos:
O driver nativo retorna tipos inteiros adequadamente.
Editar:
Como o @Jeroen apontou, esse método só funciona imediatamente para a DOP.
Como o @LarsMoelleken apontou, este método funcionará com o mysqli se você também definir a opção MYSQLI_OPT_INT_AND_FLOAT_NATIVE como true.
Exemplo:
fonte
$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);
retorna:array(1) { ["CAST('3.51' AS DECIMAL(3,2))"]=> string(4) "3.51" }
Solução mais fácil que encontrei:
Você pode forçar o json_encode a usar números reais para valores parecidos com números:
(desde o PHP 5.3.3).
Ou você pode simplesmente converter seu ID para um int.
fonte
json_encode
corda para moldar para int, se possível, é como usar um microscópio para sufocar as unhas.UNIX_TIMESTAMP()
, por exemplo.Minha solução é passar o resultado da consulta
$rs
e obter uma matriz assoc dos dados convertidos como o retorno:Exemplo de uso:
fonte
Não. Independentemente do tipo de dado definido em suas tabelas, o driver MySQL do PHP sempre serve valores de linha como strings.
Você precisa converter seu ID para um int.
fonte
Eu gosto da resposta do Chade, especialmente quando os resultados da consulta serão repassados para javascript em um navegador. O Javascript lida de maneira limpa com entidades semelhantes numéricas como números, mas requer trabalho extra para lidar com entidades semelhantes numéricas como seqüências de caracteres. ou seja, deve usar parseInt ou parseFloat neles.
Com base na solução do Chade, eu uso isso e geralmente é exatamente o que eu preciso e cria estruturas que podem ser codificadas em JSON para facilitar o manuseio em javascript.
Adicionar uma sequência numérica a 0 produz um tipo numérico no PHP e identifica corretamente o tipo para que os números de ponto flutuante não sejam truncados em números inteiros.
fonte
Isso acontece quando
PDO::ATTR_EMULATE_PREPARES
está definido comotrue
na conexão.Cuidado, porém, configurá-lo para
false
não permitir o uso de parâmetros mais de uma vez. Acredito que isso também afeta a qualidade das mensagens de erro retornadas.fonte
Você pode fazer isso com ...
... dependendo da extensão que você deseja usar. O primeiro não é recomendado porque a extensão mysql está obsoleta. O terceiro ainda é experimental.
Os comentários nesses hiperlinks explicam como definir seu tipo de uma seqüência antiga simples para seu tipo original no banco de dados.
Algumas estruturas também abstraem isso (o CodeIgniter fornece
$this->db->field_data()
).Você também pode adivinhar - como percorrer as linhas resultantes e usar is_numeric () em cada uma. Algo como:
Isso transformaria qualquer coisa que parecesse um número em um ... definitivamente não é perfeito.
fonte
if (is_float()) { $value = (float)$value; }
No meu projeto, geralmente uso uma função externa que "filtra" os dados recuperados
mysql_fetch_assoc
.Você pode renomear campos na sua tabela para que seja intuitivo entender qual tipo de dados está armazenado.
Por exemplo, você pode adicionar um sufixo especial a cada campo numérico: se
userid
for um,INT(11)
você pode renomeá-louserid_i
ou, se for,UNSIGNED INT(11)
você pode renomearuserid_u
. Nesse ponto, você pode escrever uma função PHP simples que receba como entrada a matriz associativa (recuperada commysql_fetch_assoc
) e aplicar a conversão ao "valor" armazenado com essas "chaves" especiais.fonte
Se declarações preparadas forem usadas, o tipo será int, quando apropriado. Esse código retorna uma matriz de linhas, onde cada linha é uma matriz associativa. Como se
fetch_assoc()
fosse chamado para todas as linhas, mas com informações de tipo preservadas.fonte
O MySQL possui drivers para muitas outras linguagens, converter dados em string "padroniza" dados e deixa ao usuário digitar valores de conversão para int ou outros
fonte
No meu caso, a
mysqlnd.so
extensão foi instalada. MAS eu não tinhapdo_mysqlnd.so
. Portanto, o problema foi resolvido substituindo-opdo_mysql.so
porpdo_mysqlnd.so
.fonte
Eu gosto da técnica do idealizador , mas a codificação pode ser mais simples:
Também adicionei a verificação de consultas retornando false em vez de um conjunto de resultados.
E verificando uma linha com um campo que tenha um valor nulo.
E se o tipo desejado é uma string, não perco tempo com ela - já é uma string.
Eu não me incomodo em usar isso na maioria dos códigos php; Eu apenas confio na conversão automática de tipos do php. Mas, se você estiver consultando muitos dados, para realizar cálculos aritméticos, é sensato converter os tipos ideais no início.
fonte