Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Fala galera, estou com o seguinte problema.
Tenho um código que faz uma consulta em uma determinada tabela, carrega esses dados e insere em outra. Até aí blz, o problema é que tem um campo chamado qtd e, quando ele está com mais de uma casa decimal, o código só insere uma casa. Tipo: consulta retornou 20 e na hora de inserir só insere 2. Alguém sabe dizer pq? Segue parte do código:
while ($row_pacotes = mysql_fetch_assoc($qr_pacotes)) {
$estoque = $row_pacotes['estoque'];
$produto = $row_pacotes['produto'];
$qtd_pro = $row_pacotes['qtd'];
$values = array();
for($i = 0; $i < sizeof($qtd_pro); $i++) {
$values[] = "('{$estoque}','{$produto[$i]}','{$qtd_pro[$i]}')";
}
$insert_produto = 'INSERT INTO tb_produtos(estoque, produto, qtd)VALUES '.implode(',', $values);
$qr_insert_produto = mysql_query($insert_produto) or die(mysql_error());
}
{$estoque} está sem o [$i], pois o valor é igual para todos os registros inseridos.
PS.: O banco de dados está configurado para tinyint, ou seja, 4 casas
Valeu
Fala Vinicius, campo decimal, é o modo de falar, apenas quis dizer que quero gravar um número de até 4 algarismos.
Contudo, com o código acima, ele só pega a primeira casa decimal, ou seja, números como o 20, são gravados como 2.
Blz? Você tem alguma ideia do que está ocorrendo?
Se for usar valores de moeda, melhor usar campo decimal(10,2). Caso precise gravar numeros, use INT ou VARCHAR mesmo.
O tipo de dados TINYINT do MySQL é usado quando precisamos armazenar valores inteiros que se encaixem na faixa de -128 a 127. Este tipo ocupa 1 byte de espaço (8 bits).
da um echo dentro do for pra ver como estão surgindo os valores:
for($i = 0; $i < sizeof($qtd_pro); $i++) {
$values[] = "('{$estoque}','{$produto[$i]}','{$qtd_pro[$i]}')";
echo $qtd_pro[$i]."<br/>";
}Bom dia Ruan,
Fiz a sua dica, porém ele aparece somente um dígito mesmo. Inseri um produto com 10 qtd, porém ele só insere o número '1', e no echo, também só aparece o 1. Toquei o tipo de campo para int, conforme mencionado acima, mas não resolveu.
Mais alguma luz?
Faz o seguinte, dentro do for, tira as posições do array:
$values[] = "('{$estoque}','{$produto[$i]}','{$qtd_pro[$i]}')";
deixa assim:
$values[] = "('{$estoque}','{$produto}','{$qtd_pro}')";
a questão é que, a cada iteração do while os valores para $produto e $qtd_pro irão mudar. Então, você nem precisa do laço for. Basta usar um contador fora do while e aplicar no array $values.
$values = array();
$cont = 0;
while ($row_pacotes = mysql_fetch_assoc($qr_pacotes)) {
$estoque = $row_pacotes['estoque'];
$produto = $row_pacotes['produto'];
$qtd_pro = $row_pacotes['qtd'];
$values[$cont] = "('{$estoque}','{$produto}','{$qtd_pro}')";
$cont++;
}
Isso é suficiente pra gerar um array com os dados desejados.
Até mesmo pq $produto e $qtd_pro não são arrays :D
Bom dia Ruan,
Valeu pela dica e paciência, realmente não precisava das posições, uma vez que, eu estava buscando os dados de um cadastro. Problema resolvido.
Obrigado pela ajuda.
Campo tinyint é diferente de campo com suporte a decimal.
Casas decimas numa operação como a que você faz serão ignoradas.
Para manter a consistencia dos valores, os dados precisam ser armazenados em campos iguais ou equivalentes.