Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal do Imasters, estou tendo um grave problema de cálculo com o PHP
Estou fazendo um sistema que espelha uma conta de banco na intranet da empresa, e nessa parte do código abaixo é registrado um fluxo (movimentação bancária) que havia sido previsto e atualiza o saldo da conta da pessoa que teve tal movimento em sua conta.
Ex: Se o saldo era R$ 100,00 e entrou mais R$ 100,00 . . lógicamente o saldo deve ser R$ 200,00
Mas aí que tá, o PHP tá retornando R$ 300 na soma do exemplo acima. Ele sempre registra dobrado. Se eu coloco um die($saldo) antes de registrar o saldo lá nas ultimas linhas do codigo, ele mostra o saldo certinho e até começa a fazer contas direito, mas 2 ou 3 registros de fluxo depois volta o problema depois que eu tiro esse die.
Já passei o dia inteiro tentando resolver isso e nada, por mais simpes que eu deixe o código.
Agradeço desde já quem poder me ajudar.
Pessoal Deixei agora o mais simples possivel, mais que isso impossivel e ainda duplica.
$idFluxo = 5;
list($banco, $conta, $valor) = mysql_fetch_row(mysql_query("select banco, conta, valor from fx_fluxos where id=$idFluxo", $conexao));
mysql_query("update bc_contas set saldo=saldo+$valor where id=$conta limit 1", $conexao);Zere a variável antes de usar ela.
$saldo = 0; //limpando possíveis resultados anteriores
$saldo += $valor;
E o que é mais estranho é que nos meus testes, o Saldo já vem do banco com o "valor a ser adicionado nele" e depois adiciona o valor, aí dobra entende??
Como pode receber o saldo do banco com o valor que vai ser adicionado a ele lá em baixo do script??
E não é problema de laço porque eu só mando 1 valor a ser adicionado a pesar do foreach. Já fiz todos os testes de laço e não é. Aliás, se fosse laço, o primeiro viria certo e os demais não.
William, Não deu certo isso também
Olhem o que eu fiz e o que imprime pra mim:
$saldo = 0;
list($saldo, $limite) = mysql_fetch_row(mysql_query("select saldo, limite from bc_contas where id=$conta limit 1", $conexao));
$erro[] = "Saldo Atual do banco: $saldo";
$zona = $saldo + $limite;
if($zona + $valor > 0){
if(!mysql_query("update fx_fluxos set banco=$banco, conta=$conta where id=$idFluxo limit 1", $conexao))
$erro[] = entities("Não foi possível dar baixa no fluxo. Motivo: ") . mysql_error();
else{
$err = "Saldo: $saldo + Valor: $valor = ";
$saldo += number_format($valor, 2, ".", "");
$erro[] = $err . " $saldo";
}
}
imprime:
Sendo que o saldo antes no banco pra mim era 500 e o valor a ser adicionado era 100 . . . ele ja veio do banco com 100 e colocou mais 100, ai deu 700 . . aff
dá um print_r() na variável $erro
e poste aqui
Hinom, a variável $erro é uma variavel minha que recebe textos que eu coloco para escrever numa Div mais tarde porque esse script de processamento corre antes do HTML.
Já fiz ele processar separado e depois redirecionar com header mas aí piorou, ele começou a triplicar. Aí voltei como antes mesmo.
Tente alertar o saldo e o valor, dentro do else e repare bem na quantidade de alerts que o código vai dar e os valores alertados.
echo "<script>alert ('$saldo, $valor')</script>";Alert tambem os valores feitos logo apos as consultas ao banco.
Tente imprimir o valor que vem do foreach antes de tudo.
echo "<pre>"; print_r ($_POST["fluxo"]); echo "</pre>";
Tente fazer a verificação de array para $_POST["fluxo"], ao invés de verificar se existe.
if(is_array($_POST["fluxo"]))
Pode ser que você descubra o que está errado.
Mad
O print_r da certinho com o que eu mando
Array
(
[5] => 1
)verifica se não está passando por este trecho mais de uma vez
ponha um print em cada trecho de código para verificar isso
É . . vou tentar mais uma vez fazer isso Mario, qq coisa eu edito esse post!
--- Editado
Mario, não deu certo, e eu até lancei um codigo atualizado lá mais simples e ainda ta duplicando
Será que isso é do Banco???
Vou ter que trocar o título pra MySQL nao sabe contar.
Pessoal . . não sei mais o que fazer, se eu coloco um die pra parar a execução tipo:
list($saldo, $limite) = mysql_fetch_row(mysql_query("select saldo, limite from bc_contas where id=$conta limit 1", $conexao));
$nValor = number_format($saldo,2,".", "") + number_format($valor,2,".", "");
die($nValor);
mysql_query("update bc_contas set saldo=$nValor where id=$conta limit 1", $conexao);
Ele calcula direito e depois que tiro o die ele só calcula direito essa única vez, na próxima já começa a duplicação de novo
Será isso tempo de execução de script? algo assim?
Com "die" ele mostra o valor certo, mas sem die, ele insere duplicado
esse ta sendo o problema. . . pq ele insere duplicado??? não da pra entender! Isso com ou sem laços.
DesistO . . . . de tentar concertar
Eu acabei dando aquele "jeitinho brasileiro" e fiz uma Gambi uhauahuauh
Eu criei um campo chamado rsc (abreviação de rascunho) que recebe na atualização o valor do saldo (que ja ta add sei lá pq neh?) e atualiza o saldo com o valor do campo rsc + valor (saldo anterior verdadeiroq ta no rascunho + valor)
mysql_query("update bc_contas set saldo=rsc+$ac, rsc=$saldo where id=$conta limit 1", $conexao); //ac é o valor
Até q não é uma gambiarra tao suja. Suja só se eu colocasse (saldo=$valor/2)
Só falta o servidor não ter esse problema, aí vou ter q desfazer . . . . . mas sem problemas
Isso coloca fim na tal duplicidade mas ainda deixa no ar pra mim o PQ que isso acontece.
Vlw galera q tentou ajudar aí. Brigadão mesmo!
o problema é falta de organização e controle na estrutura lógica do código tal como a abstração dos dados.
pode marcar como resolvido ?
É Hinom, eu vou até refazer toda estrutura só pra ver no que dá, detesto refazer trabalho mas td bem, deve ter sido alguma coisa que escapou.
Se bem que se notar o último código que postei, que era até de uma página externa (não era include), o código era simplezinho e ocorria o problema. Praticamente sem muita estrutura, nem laços tinham. Mas vou refazer de uma outra forma. Detesto esse jeitinho provisório!
Ah, e falta de organização pode ter certeza que não é, esse sistema tem uma estrutura de arquivos, tabelas de banco e códigos mais organizados q tudo rs
Só esse trecho que passou a dar problema, mas como eu disse, foi alguma coisa que escapou sem eu ver, um raciocinio que escqueci de completar . . . não sei . . =/
Isso que dá não comentar o código. Mas não que eu tenha me perdido ^^
Pode marcar como resolvido sim Hinom . . . . =]
Como voce esta fazendo a soma ?