WarLiKe 0 Denunciar post Postado Junho 22, 2009 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. ## Editado 2 ####### 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); Compartilhar este post Link para o post Compartilhar em outros sites
Marcio Leandro 0 Denunciar post Postado Junho 22, 2009 Como voce esta fazendo a soma ? Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Junho 22, 2009 Zere a variável antes de usar ela. $saldo = 0; //limpando possíveis resultados anteriores Compartilhar este post Link para o post Compartilhar em outros sites
WarLiKe 0 Denunciar post Postado Junho 22, 2009 $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. Compartilhar este post Link para o post Compartilhar em outros sites
WarLiKe 0 Denunciar post Postado Junho 22, 2009 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: - Saldo Atual do banco: 600 - Saldo: 600 + Valor: 100 = 700 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 Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Junho 23, 2009 dá um print_r() na variável $erro e poste aqui Compartilhar este post Link para o post Compartilhar em outros sites
WarLiKe 0 Denunciar post Postado Junho 23, 2009 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. Compartilhar este post Link para o post Compartilhar em outros sites
m@dDog 5 Denunciar post Postado Junho 23, 2009 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. Compartilhar este post Link para o post Compartilhar em outros sites
WarLiKe 0 Denunciar post Postado Junho 23, 2009 Mad O print_r da certinho com o que eu mando Array ( [5] => 1 ) onde 5 é o código do fluxo e 1 é o valor da checkbox que são identificados no foreach! Compartilhar este post Link para o post Compartilhar em outros sites
Mário Monteiro 179 Denunciar post Postado Junho 23, 2009 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 Compartilhar este post Link para o post Compartilhar em outros sites
WarLiKe 0 Denunciar post Postado Junho 24, 2009 É . . 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. Compartilhar este post Link para o post Compartilhar em outros sites
WarLiKe 0 Denunciar post Postado Junho 24, 2009 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. Compartilhar este post Link para o post Compartilhar em outros sites
WarLiKe 0 Denunciar post Postado Junho 24, 2009 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! Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Junho 24, 2009 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 ? Compartilhar este post Link para o post Compartilhar em outros sites
WarLiKe 0 Denunciar post Postado Junho 24, 2009 É 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 . . . . =] Compartilhar este post Link para o post Compartilhar em outros sites